From 6dc54f28f27575b4c7821b9c2cba27667a695302 Mon Sep 17 00:00:00 2001 From: liuwei <2748917322@qq.com> Date: Fri, 23 Jan 2026 16:37:18 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=97=E7=BC=9D=E7=B3=BB=E5=88=97=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lot/csvcode.h | 23 + Quilting.pro | 274 + datafile/datafiledsr.cpp | 1248 ++ datafile/datafiledsr.h | 226 + datafile/datafiledst.cpp | 988 ++ datafile/datafiledst.h | 163 + datafile/datafilequi.cpp | 1317 ++ datafile/datafilequi.h | 155 + datafile/datafilequix.cpp | 2523 ++++ datafile/datafilequix.h | 157 + datafile/dataoperat.cpp | 2330 ++++ datafile/dataoperat.h | 83 + datafile/dsrcryption.cpp | 394 + datafile/dsrcryption.h | 35 + datafile/dxf/dxfhelper.cpp | 520 + datafile/dxf/dxfhelper.h | 110 + datafile/dxf/dxflib/dl_attributes.h | 237 + datafile/dxf/dxflib/dl_codes.h | 546 + datafile/dxf/dxflib/dl_creationadapter.h | 138 + datafile/dxf/dxflib/dl_creationinterface.h | 369 + datafile/dxf/dxflib/dl_dxf.cpp | 5332 ++++++++ datafile/dxf/dxflib/dl_dxf.h | 529 + datafile/dxf/dxflib/dl_entities.h | 1813 +++ datafile/dxf/dxflib/dl_exception.h | 55 + datafile/dxf/dxflib/dl_extrusion.h | 143 + datafile/dxf/dxflib/dl_global.h | 13 + datafile/dxf/dxflib/dl_writer.h | 654 + datafile/dxf/dxflib/dl_writer_ascii.cpp | 156 + datafile/dxf/dxflib/dl_writer_ascii.h | 74 + datafile/dxf/dxfreader.cpp | 379 + datafile/dxf/dxfreader.h | 109 + datafile/embdata.cpp | 10660 ++++++++++++++++ datafile/embdata.h | 317 + datafile/hpgl/importhpgl.cpp | 2535 ++++ datafile/hpgl/importhpgl.h | 323 + datafile/hpgl/marker.cpp | 262 + datafile/hpgl/marker.h | 418 + datafile/hpgl/plotbitmap.cpp | 79 + datafile/hpgl/plotbitmap.h | 64 + datafile/hpgl/typedef.h | 107 + datafile/hpgl/vectorfont.cpp | 918 ++ datafile/hpgl/vectorfont.h | 132 + items/assistitem.cpp | 43 + items/assistitem.h | 36 + items/cmdconfig.h | 333 + items/errorcodestateitem.cpp | 37 + items/errorcodestateitem.h | 33 + items/fileitem.cpp | 63 + items/fileitem.h | 48 + items/itemsmanage.cpp | 593 + items/itemsmanage.h | 102 + items/nineitem.cpp | 44 + items/nineitem.h | 30 + items/outctrlitem.cpp | 101 + items/outctrlitem.h | 68 + items/paraitem.cpp | 77 + items/paraitem.h | 92 + items/parasetitem.cpp | 44 + items/parasetitem.h | 36 + items/patternsetitem.cpp | 43 + items/patternsetitem.h | 36 + items/sensoritem.cpp | 46 + items/sensoritem.h | 35 + items/shortcutitem.cpp | 43 + items/shortcutitem.h | 35 + machine/comm/comm.cpp | 438 + machine/comm/comm.h | 228 + machine/comm/config.h | 16 + machine/comm/crc16.cpp | 159 + machine/comm/crc16.h | 60 + machine/comm/crc32.cpp | 74 + machine/comm/crc32.h | 33 + machine/comm/datadef.h | 495 + machine/comm/protocol.h | 2033 +++ machine/comm/typedef.h | 107 + machine/comport.cpp | 157 + machine/comport.h | 43 + machine/error.cpp | 518 + machine/error.h | 11 + machine/gatewaytcpclient.cpp | 334 + machine/gatewaytcpclient.h | 72 + machine/lotmachine.cpp | 290 + machine/lotmachine.h | 73 + machine/machine.cpp | 2087 +++ machine/machine.h | 314 + machine/mytcpserver.cpp | 215 + machine/mytcpserver.h | 61 + machine/qbindtcpsocket.cpp | 186 + machine/qbindtcpsocket.h | 53 + machine/qextserial/posix_qextserialport.cpp | 1117 ++ machine/qextserial/posix_qextserialport.h | 57 + machine/qextserial/qextserialbase.cpp | 250 + machine/qextserial/qextserialbase.h | 196 + machine/qextserial/qextserialport.cpp | 98 + machine/qextserial/qextserialport.h | 27 + machine/qextserial/win_qextserialport.cpp | 880 ++ machine/qextserial/win_qextserialport.h | 48 + machine/tcpclient.cpp | 501 + machine/tcpclient.h | 102 + main.cpp | 285 + main.h | 175 + mctype/machinetypefun.cpp | 684 + mctype/machinetypefun.h | 141 + mctype/mainwidgetfunction.cpp | 5567 ++++++++ mctype/mainwidgetfunction.h | 299 + .../function/autodoubledoormac.cpp | 1259 ++ .../function/autodoubledoormac.h | 35 + .../function/clothingmac.cpp | 1384 ++ .../patternsingleboard/function/clothingmac.h | 39 + .../function/cuttingwalk.cpp | 1914 +++ .../patternsingleboard/function/cuttingwalk.h | 42 + .../function/dlqscheboard.cpp | 338 + .../function/dlqscheboard.h | 37 + .../function/doubleheadcombqui.cpp | 1524 +++ .../function/doubleheadcombqui.h | 35 + .../function/doublelayeredmac.cpp | 1903 +++ .../function/doublelayeredmac.h | 41 + .../function/doublesidedbedsheets.cpp | 582 + .../function/doublesidedbedsheets.h | 29 + .../function/fiveheadprecisionsewing.cpp | 1081 ++ .../function/fiveheadprecisionsewing.h | 36 + .../function/flyshuttle.cpp | 680 + .../patternsingleboard/function/flyshuttle.h | 37 + .../function/fourheadcombqui.cpp | 1626 +++ .../function/fourheadcombqui.h | 55 + .../function/fullyautomatic.cpp | 1192 ++ .../function/fullyautomatic.h | 35 + .../function/glassfibremac.cpp | 1726 +++ .../function/glassfibremac.h | 38 + .../function/highsinglequilting.cpp | 1547 +++ .../function/highsinglequilting.h | 35 + .../function/l2000multimac.cpp | 803 ++ .../function/l2000multimac.h | 33 + .../function/multineedlerotary.cpp | 341 + .../function/multineedlerotary.h | 37 + .../function/pkgfoursidedtestboardmac.cpp | 190 + .../function/pkgfoursidedtestboardmac.h | 26 + .../function/singlemutilneedlemac.cpp | 490 + .../function/singlemutilneedlemac.h | 34 + .../function/thickwiringmac.cpp | 1701 +++ .../function/thickwiringmac.h | 39 + .../patternsingleboard/mainUI/mainwidget.cpp | 6097 +++++++++ mctype/patternsingleboard/mainUI/mainwidget.h | 355 + .../patternsingleboard/mainUI/mainwidget.ui | 4934 +++++++ settings/lotsettings.h | 112 + settings/settings.cpp | 549 + settings/settings.h | 62 + sharedviews/brokenlinedialog.cpp | 159 + sharedviews/brokenlinedialog.h | 50 + sharedviews/brokenlinedialog.ui | 158 + sharedviews/controlactionwidget.cpp | 922 ++ sharedviews/controlactionwidget.h | 88 + sharedviews/controlactionwidget.ui | 1577 +++ sharedviews/debuginfodialog.cpp | 230 + sharedviews/debuginfodialog.h | 47 + sharedviews/debuginfodialog.ui | 371 + sharedviews/fileselectdialog.cpp | 219 + sharedviews/fileselectdialog.h | 54 + sharedviews/fileselectdialog.ui | 330 + sharedviews/headspacingsheetdialog.cpp | 578 + sharedviews/headspacingsheetdialog.h | 90 + sharedviews/headspacingsheetdialog.ui | 264 + sharedviews/knifegapparadialog.cpp | 190 + sharedviews/knifegapparadialog.h | 49 + sharedviews/knifegapparadialog.ui | 246 + sharedviews/linegenerwidget.cpp | 1011 ++ sharedviews/linegenerwidget.h | 84 + sharedviews/linegenerwidget.ui | 527 + sharedviews/mcheaddialog.cpp | 258 + sharedviews/mcheaddialog.h | 55 + sharedviews/mcheaddialog.ui | 213 + sharedviews/mybutton.cpp | 315 + sharedviews/mybutton.h | 75 + sharedviews/numerinputdialog.cpp | 911 ++ sharedviews/numerinputdialog.h | 104 + sharedviews/numerinputdialog.ui | 1052 ++ sharedviews/parametersetdialog.cpp | 2231 ++++ sharedviews/parametersetdialog.h | 149 + sharedviews/parametersetdialog.ui | 543 + sharedviews/passworddialog.cpp | 283 + sharedviews/passworddialog.h | 51 + sharedviews/passworddialog.ui | 3936 ++++++ sharedviews/patterneditwidget.cpp | 945 ++ sharedviews/patterneditwidget.h | 78 + sharedviews/patterneditwidget.ui | 463 + sharedviews/patternmanagewidget.cpp | 1743 +++ sharedviews/patternmanagewidget.h | 139 + sharedviews/patternmanagewidget.ui | 1026 ++ sharedviews/patternneedlelayoutwidget.cpp | 1065 ++ sharedviews/patternneedlelayoutwidget.h | 94 + sharedviews/patternneedlelayoutwidget.ui | 1473 +++ sharedviews/patternselectwidget.cpp | 1025 ++ sharedviews/patternselectwidget.h | 123 + sharedviews/patternselectwidget.ui | 664 + sharedviews/promptdialog.cpp | 2099 +++ sharedviews/promptdialog.h | 184 + sharedviews/promptdialog.ui | 2077 +++ sharedviews/sensorinputwidget.cpp | 602 + sharedviews/sensorinputwidget.h | 103 + sharedviews/sensorinputwidget.ui | 520 + sharedviews/setcontrolstyle.cpp | 1199 ++ sharedviews/setcontrolstyle.h | 138 + sharedviews/setworkarea.cpp | 190 + sharedviews/setworkarea.h | 63 + sharedviews/setworkarea.ui | 216 + sharedviews/shuttlebottomlinedialog.cpp | 282 + sharedviews/shuttlebottomlinedialog.h | 35 + sharedviews/shuttlebottomlinedialog.ui | 329 + sharedviews/systemmanagedialog.cpp | 737 ++ sharedviews/systemmanagedialog.h | 109 + sharedviews/systemmanagedialog.ui | 649 + sharedviews/view/mygraphicsgriditem.cpp | 158 + sharedviews/view/mygraphicsgriditem.h | 47 + sharedviews/view/mygraphicsscene.cpp | 1356 ++ sharedviews/view/mygraphicsscene.h | 126 + sharedviews/view/mygraphicsview.cpp | 395 + sharedviews/view/mygraphicsview.h | 74 + sharedviews/wordsinputdialog.cpp | 371 + sharedviews/wordsinputdialog.h | 54 + sharedviews/wordsinputdialog.ui | 1810 +++ 220 files changed, 130644 insertions(+) create mode 100644 Lot/csvcode.h create mode 100644 Quilting.pro create mode 100644 datafile/datafiledsr.cpp create mode 100644 datafile/datafiledsr.h create mode 100644 datafile/datafiledst.cpp create mode 100644 datafile/datafiledst.h create mode 100644 datafile/datafilequi.cpp create mode 100644 datafile/datafilequi.h create mode 100644 datafile/datafilequix.cpp create mode 100644 datafile/datafilequix.h create mode 100644 datafile/dataoperat.cpp create mode 100644 datafile/dataoperat.h create mode 100644 datafile/dsrcryption.cpp create mode 100644 datafile/dsrcryption.h create mode 100644 datafile/dxf/dxfhelper.cpp create mode 100644 datafile/dxf/dxfhelper.h create mode 100644 datafile/dxf/dxflib/dl_attributes.h create mode 100644 datafile/dxf/dxflib/dl_codes.h create mode 100644 datafile/dxf/dxflib/dl_creationadapter.h create mode 100644 datafile/dxf/dxflib/dl_creationinterface.h create mode 100644 datafile/dxf/dxflib/dl_dxf.cpp create mode 100644 datafile/dxf/dxflib/dl_dxf.h create mode 100644 datafile/dxf/dxflib/dl_entities.h create mode 100644 datafile/dxf/dxflib/dl_exception.h create mode 100644 datafile/dxf/dxflib/dl_extrusion.h create mode 100644 datafile/dxf/dxflib/dl_global.h create mode 100644 datafile/dxf/dxflib/dl_writer.h create mode 100644 datafile/dxf/dxflib/dl_writer_ascii.cpp create mode 100644 datafile/dxf/dxflib/dl_writer_ascii.h create mode 100644 datafile/dxf/dxfreader.cpp create mode 100644 datafile/dxf/dxfreader.h create mode 100644 datafile/embdata.cpp create mode 100644 datafile/embdata.h create mode 100644 datafile/hpgl/importhpgl.cpp create mode 100644 datafile/hpgl/importhpgl.h create mode 100644 datafile/hpgl/marker.cpp create mode 100644 datafile/hpgl/marker.h create mode 100644 datafile/hpgl/plotbitmap.cpp create mode 100644 datafile/hpgl/plotbitmap.h create mode 100644 datafile/hpgl/typedef.h create mode 100644 datafile/hpgl/vectorfont.cpp create mode 100644 datafile/hpgl/vectorfont.h create mode 100644 items/assistitem.cpp create mode 100644 items/assistitem.h create mode 100644 items/cmdconfig.h create mode 100644 items/errorcodestateitem.cpp create mode 100644 items/errorcodestateitem.h create mode 100644 items/fileitem.cpp create mode 100644 items/fileitem.h create mode 100644 items/itemsmanage.cpp create mode 100644 items/itemsmanage.h create mode 100644 items/nineitem.cpp create mode 100644 items/nineitem.h create mode 100644 items/outctrlitem.cpp create mode 100644 items/outctrlitem.h create mode 100644 items/paraitem.cpp create mode 100644 items/paraitem.h create mode 100644 items/parasetitem.cpp create mode 100644 items/parasetitem.h create mode 100644 items/patternsetitem.cpp create mode 100644 items/patternsetitem.h create mode 100644 items/sensoritem.cpp create mode 100644 items/sensoritem.h create mode 100644 items/shortcutitem.cpp create mode 100644 items/shortcutitem.h create mode 100644 machine/comm/comm.cpp create mode 100644 machine/comm/comm.h create mode 100644 machine/comm/config.h create mode 100644 machine/comm/crc16.cpp create mode 100644 machine/comm/crc16.h create mode 100644 machine/comm/crc32.cpp create mode 100644 machine/comm/crc32.h create mode 100644 machine/comm/datadef.h create mode 100644 machine/comm/protocol.h create mode 100644 machine/comm/typedef.h create mode 100644 machine/comport.cpp create mode 100644 machine/comport.h create mode 100644 machine/error.cpp create mode 100644 machine/error.h create mode 100644 machine/gatewaytcpclient.cpp create mode 100644 machine/gatewaytcpclient.h create mode 100644 machine/lotmachine.cpp create mode 100644 machine/lotmachine.h create mode 100644 machine/machine.cpp create mode 100644 machine/machine.h create mode 100644 machine/mytcpserver.cpp create mode 100644 machine/mytcpserver.h create mode 100644 machine/qbindtcpsocket.cpp create mode 100644 machine/qbindtcpsocket.h create mode 100644 machine/qextserial/posix_qextserialport.cpp create mode 100644 machine/qextserial/posix_qextserialport.h create mode 100644 machine/qextserial/qextserialbase.cpp create mode 100644 machine/qextserial/qextserialbase.h create mode 100644 machine/qextserial/qextserialport.cpp create mode 100644 machine/qextserial/qextserialport.h create mode 100644 machine/qextserial/win_qextserialport.cpp create mode 100644 machine/qextserial/win_qextserialport.h create mode 100644 machine/tcpclient.cpp create mode 100644 machine/tcpclient.h create mode 100644 main.cpp create mode 100644 main.h create mode 100644 mctype/machinetypefun.cpp create mode 100644 mctype/machinetypefun.h create mode 100644 mctype/mainwidgetfunction.cpp create mode 100644 mctype/mainwidgetfunction.h create mode 100644 mctype/patternsingleboard/function/autodoubledoormac.cpp create mode 100644 mctype/patternsingleboard/function/autodoubledoormac.h create mode 100644 mctype/patternsingleboard/function/clothingmac.cpp create mode 100644 mctype/patternsingleboard/function/clothingmac.h create mode 100644 mctype/patternsingleboard/function/cuttingwalk.cpp create mode 100644 mctype/patternsingleboard/function/cuttingwalk.h create mode 100644 mctype/patternsingleboard/function/dlqscheboard.cpp create mode 100644 mctype/patternsingleboard/function/dlqscheboard.h create mode 100644 mctype/patternsingleboard/function/doubleheadcombqui.cpp create mode 100644 mctype/patternsingleboard/function/doubleheadcombqui.h create mode 100644 mctype/patternsingleboard/function/doublelayeredmac.cpp create mode 100644 mctype/patternsingleboard/function/doublelayeredmac.h create mode 100644 mctype/patternsingleboard/function/doublesidedbedsheets.cpp create mode 100644 mctype/patternsingleboard/function/doublesidedbedsheets.h create mode 100644 mctype/patternsingleboard/function/fiveheadprecisionsewing.cpp create mode 100644 mctype/patternsingleboard/function/fiveheadprecisionsewing.h create mode 100644 mctype/patternsingleboard/function/flyshuttle.cpp create mode 100644 mctype/patternsingleboard/function/flyshuttle.h create mode 100644 mctype/patternsingleboard/function/fourheadcombqui.cpp create mode 100644 mctype/patternsingleboard/function/fourheadcombqui.h create mode 100644 mctype/patternsingleboard/function/fullyautomatic.cpp create mode 100644 mctype/patternsingleboard/function/fullyautomatic.h create mode 100644 mctype/patternsingleboard/function/glassfibremac.cpp create mode 100644 mctype/patternsingleboard/function/glassfibremac.h create mode 100644 mctype/patternsingleboard/function/highsinglequilting.cpp create mode 100644 mctype/patternsingleboard/function/highsinglequilting.h create mode 100644 mctype/patternsingleboard/function/l2000multimac.cpp create mode 100644 mctype/patternsingleboard/function/l2000multimac.h create mode 100644 mctype/patternsingleboard/function/multineedlerotary.cpp create mode 100644 mctype/patternsingleboard/function/multineedlerotary.h create mode 100644 mctype/patternsingleboard/function/pkgfoursidedtestboardmac.cpp create mode 100644 mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h create mode 100644 mctype/patternsingleboard/function/singlemutilneedlemac.cpp create mode 100644 mctype/patternsingleboard/function/singlemutilneedlemac.h create mode 100644 mctype/patternsingleboard/function/thickwiringmac.cpp create mode 100644 mctype/patternsingleboard/function/thickwiringmac.h create mode 100644 mctype/patternsingleboard/mainUI/mainwidget.cpp create mode 100644 mctype/patternsingleboard/mainUI/mainwidget.h create mode 100644 mctype/patternsingleboard/mainUI/mainwidget.ui create mode 100644 settings/lotsettings.h create mode 100644 settings/settings.cpp create mode 100644 settings/settings.h create mode 100644 sharedviews/brokenlinedialog.cpp create mode 100644 sharedviews/brokenlinedialog.h create mode 100644 sharedviews/brokenlinedialog.ui create mode 100644 sharedviews/controlactionwidget.cpp create mode 100644 sharedviews/controlactionwidget.h create mode 100644 sharedviews/controlactionwidget.ui create mode 100644 sharedviews/debuginfodialog.cpp create mode 100644 sharedviews/debuginfodialog.h create mode 100644 sharedviews/debuginfodialog.ui create mode 100644 sharedviews/fileselectdialog.cpp create mode 100644 sharedviews/fileselectdialog.h create mode 100644 sharedviews/fileselectdialog.ui create mode 100644 sharedviews/headspacingsheetdialog.cpp create mode 100644 sharedviews/headspacingsheetdialog.h create mode 100644 sharedviews/headspacingsheetdialog.ui create mode 100644 sharedviews/knifegapparadialog.cpp create mode 100644 sharedviews/knifegapparadialog.h create mode 100644 sharedviews/knifegapparadialog.ui create mode 100644 sharedviews/linegenerwidget.cpp create mode 100644 sharedviews/linegenerwidget.h create mode 100644 sharedviews/linegenerwidget.ui create mode 100644 sharedviews/mcheaddialog.cpp create mode 100644 sharedviews/mcheaddialog.h create mode 100644 sharedviews/mcheaddialog.ui create mode 100644 sharedviews/mybutton.cpp create mode 100644 sharedviews/mybutton.h create mode 100644 sharedviews/numerinputdialog.cpp create mode 100644 sharedviews/numerinputdialog.h create mode 100644 sharedviews/numerinputdialog.ui create mode 100644 sharedviews/parametersetdialog.cpp create mode 100644 sharedviews/parametersetdialog.h create mode 100644 sharedviews/parametersetdialog.ui create mode 100644 sharedviews/passworddialog.cpp create mode 100644 sharedviews/passworddialog.h create mode 100644 sharedviews/passworddialog.ui create mode 100644 sharedviews/patterneditwidget.cpp create mode 100644 sharedviews/patterneditwidget.h create mode 100644 sharedviews/patterneditwidget.ui create mode 100644 sharedviews/patternmanagewidget.cpp create mode 100644 sharedviews/patternmanagewidget.h create mode 100644 sharedviews/patternmanagewidget.ui create mode 100644 sharedviews/patternneedlelayoutwidget.cpp create mode 100644 sharedviews/patternneedlelayoutwidget.h create mode 100644 sharedviews/patternneedlelayoutwidget.ui create mode 100644 sharedviews/patternselectwidget.cpp create mode 100644 sharedviews/patternselectwidget.h create mode 100644 sharedviews/patternselectwidget.ui create mode 100644 sharedviews/promptdialog.cpp create mode 100644 sharedviews/promptdialog.h create mode 100644 sharedviews/promptdialog.ui create mode 100644 sharedviews/sensorinputwidget.cpp create mode 100644 sharedviews/sensorinputwidget.h create mode 100644 sharedviews/sensorinputwidget.ui create mode 100644 sharedviews/setcontrolstyle.cpp create mode 100644 sharedviews/setcontrolstyle.h create mode 100644 sharedviews/setworkarea.cpp create mode 100644 sharedviews/setworkarea.h create mode 100644 sharedviews/setworkarea.ui create mode 100644 sharedviews/shuttlebottomlinedialog.cpp create mode 100644 sharedviews/shuttlebottomlinedialog.h create mode 100644 sharedviews/shuttlebottomlinedialog.ui create mode 100644 sharedviews/systemmanagedialog.cpp create mode 100644 sharedviews/systemmanagedialog.h create mode 100644 sharedviews/systemmanagedialog.ui create mode 100644 sharedviews/view/mygraphicsgriditem.cpp create mode 100644 sharedviews/view/mygraphicsgriditem.h create mode 100644 sharedviews/view/mygraphicsscene.cpp create mode 100644 sharedviews/view/mygraphicsscene.h create mode 100644 sharedviews/view/mygraphicsview.cpp create mode 100644 sharedviews/view/mygraphicsview.h create mode 100644 sharedviews/wordsinputdialog.cpp create mode 100644 sharedviews/wordsinputdialog.h create mode 100644 sharedviews/wordsinputdialog.ui diff --git a/Lot/csvcode.h b/Lot/csvcode.h new file mode 100644 index 0000000..feb95cb --- /dev/null +++ b/Lot/csvcode.h @@ -0,0 +1,23 @@ +#ifndef CSVCODE_H +#define CSVCODE_H + +#define CSV_MC_TYPE_01 0x01 //平绣机 +#define CSV_MC_TYPE_02 0x02 //带毛巾 +#define CSV_MC_TYPE_03 0x03 //带缠绕 + +#define CSV_00_CODE_1 0x0001 //通用-主轴点动 +#define CSV_00_CODE_2 0x0002 //通用-定起绣点 +#define CSV_00_CODE_3 0x0003 //通用-回起绣点 +#define CSV_00_CODE_4 0x0004 //通用-边框检查 +#define CSV_00_CODE_5 0x0005 //通用-手动换色 +#define CSV_00_CODE_6 0x0006 //通用-手动加油 +#define CSV_00_CODE_7 0x0007 //通用-匹绣 +#define CSV_00_CODE_8 0x0008 //通用-自动定软限位 +#define CSV_00_CODE_9 0x0009 //通用-遍历 +#define CSV_02_CODE_1 0x0001 //毛巾-毛巾M轴归零 +#define CSV_02_CODE_2 0x0002 //毛巾-毛巾打环轴归零 +#define CSV_03_CODE_1 0x0001 //缠绕-缠绕压脚电机归零 +#define CSV_03_CODE_2 0x0002 //缠绕-缠绕锯齿电机归零 + + +#endif // CSVCODE_H diff --git a/Quilting.pro b/Quilting.pro new file mode 100644 index 0000000..97c7a2d --- /dev/null +++ b/Quilting.pro @@ -0,0 +1,274 @@ +#------------------------------------------------- +# +# Project created by Qt5.9.1 2021-03-08T08:42:36 +# created by HUAHAIYAN +#------------------------------------------------- + +TEMPLATE = app + +QMAKE_CXXFLAGS+=-std=c++11 + +TARGET = QUILTING + +CONFIG += c++11 +CONFIG += resources_big + +QT += core gui network +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +OBJECTS_DIR += obj +MOC_DIR += moc +UI_DIR += forms +RCC_DIR += rccs + +#昆仑通态操作屏设置时间的库 +unix:LIBS +=-L/usr/local/MCGS/sysroot-mcgs/usr/lib -lmcgs-hal + +FORMS += \ + sharedviews/controlactionwidget.ui \ + sharedviews/numerinputdialog.ui \ + sharedviews/parametersetdialog.ui \ + sharedviews/passworddialog.ui \ + sharedviews/patternmanagewidget.ui \ + sharedviews/patternselectwidget.ui \ + sharedviews/promptdialog.ui \ + sharedviews/sensorinputwidget.ui \ + sharedviews/systemmanagedialog.ui \ + sharedviews/wordsinputdialog.ui \ + mctype/patternsingleboard/mainUI/mainwidget.ui \ + sharedviews/mcheaddialog.ui \ + sharedviews/headspacingsheetdialog.ui \ + sharedviews/fileselectdialog.ui \ + sharedviews/debuginfodialog.ui \ + sharedviews/patterneditwidget.ui \ + sharedviews/patternneedlelayoutwidget.ui \ + sharedviews/linegenerwidget.ui \ + sharedviews/shuttlebottomlinedialog.ui \ + sharedviews/knifegapparadialog.ui + +HEADERS += \ + main.h \ + items/paraitem.h \ + items/sensoritem.h \ + machine/comport.h \ + machine/error.h \ + machine/machine.h \ + machine/qbindtcpsocket.h \ + machine/tcpclient.h \ + machine/comm/comm.h \ + machine/comm/config.h \ + machine/comm/crc16.h \ + machine/comm/crc32.h \ + machine/comm/datadef.h \ + machine/comm/protocol.h \ + machine/comm/typedef.h \ + machine/qextserial/qextserialbase.h \ + machine/qextserial/qextserialport.h \ + datafile/datafiledst.h \ + datafile/embdata.h \ + datafile/datafiledsr.h \ + items/outctrlitem.h \ + items/shortcutitem.h \ + items/cmdconfig.h \ + items/fileitem.h \ + settings/settings.h \ + sharedviews/controlactionwidget.h \ + sharedviews/numerinputdialog.h \ + sharedviews/parametersetdialog.h \ + sharedviews/passworddialog.h \ + sharedviews/patternmanagewidget.h \ + sharedviews/patternselectwidget.h \ + sharedviews/promptdialog.h \ + sharedviews/sensorinputwidget.h \ + sharedviews/systemmanagedialog.h \ + sharedviews/wordsinputdialog.h \ + sharedviews/mybutton.h \ + mctype/mainwidgetfunction.h \ + sharedviews/setcontrolstyle.h \ + datafile/dsrcryption.h \ + items/itemsmanage.h \ + items/assistitem.h \ + items/patternsetitem.h \ + mctype/patternsingleboard/mainUI/mainwidget.h \ + settings/lotsettings.h \ + machine/lotmachine.h \ + items/parasetitem.h \ + mctype/machinetypefun.h \ + machine/gatewaytcpclient.h \ + items/errorcodestateitem.h \ + mctype/patternsingleboard/function/highsinglequilting.h \ + datafile/datafilequi.h \ + datafile/datafilequix.h \ + datafile/dataoperat.h \ + sharedviews/mcheaddialog.h \ + sharedviews/headspacingsheetdialog.h \ + mctype/patternsingleboard/function/fiveheadprecisionsewing.h \ + sharedviews/fileselectdialog.h \ + sharedviews/debuginfodialog.h \ + items/nineitem.h \ + mctype/patternsingleboard/function/clothingmac.h \ + mctype/patternsingleboard/function/multineedlerotary.h \ +# datafile/dxf/dxfhelper.h \ +# datafile/dxf/dxfreader.h \ +# datafile/dxf/dxflib/dl_attributes.h \ +# datafile/dxf/dxflib/dl_codes.h \ +# datafile/dxf/dxflib/dl_creationadapter.h \ +# datafile/dxf/dxflib/dl_creationinterface.h \ +# datafile/dxf/dxflib/dl_dxf.h \ +# datafile/dxf/dxflib/dl_entities.h \ +# datafile/dxf/dxflib/dl_exception.h \ +# datafile/dxf/dxflib/dl_extrusion.h \ +# datafile/dxf/dxflib/dl_global.h \ +# datafile/dxf/dxflib/dl_writer.h \ +# datafile/dxf/dxflib/dl_writer_ascii.h \ + datafile/hpgl/importhpgl.h \ + datafile/hpgl/marker.h \ + datafile/hpgl/typedef.h \ + datafile/hpgl/vectorfont.h \ + machine/mytcpserver.h \ + mctype/patternsingleboard/function/thickwiringmac.h \ + mctype/patternsingleboard/function/flyshuttle.h \ + sharedviews/patterneditwidget.h \ + sharedviews/view/mygraphicsscene.h \ + sharedviews/view/mygraphicsview.h \ + sharedviews/view/mygraphicsgriditem.h \ + sharedviews/patternneedlelayoutwidget.h \ + sharedviews/linegenerwidget.h \ + sharedviews/shuttlebottomlinedialog.h \ + mctype/patternsingleboard/function/glassfibremac.h \ + mctype/patternsingleboard/function/doublelayeredmac.h \ + mctype/patternsingleboard/function/dlqscheboard.h \ + mctype/patternsingleboard/function/singlemutilneedlemac.h \ + mctype/patternsingleboard/function/doublesidedbedsheets.h \ + mctype/patternsingleboard/function/l2000multimac.h \ + mctype/patternsingleboard/function/fullyautomatic.h \ + mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h \ + mctype/patternsingleboard/function/autodoubledoormac.h \ + mctype/patternsingleboard/function/doubleheadcombqui.h \ + mctype/patternsingleboard/function/cuttingwalk.h \ + sharedviews/knifegapparadialog.h \ + mctype/patternsingleboard/function/fourheadcombqui.h + +SOURCES += \ + main.cpp \ + items/paraitem.cpp \ + items/sensoritem.cpp \ + machine/comport.cpp \ + machine/error.cpp \ + machine/machine.cpp \ + machine/qbindtcpsocket.cpp \ + machine/tcpclient.cpp \ + machine/comm/comm.cpp \ + machine/comm/crc16.cpp \ + machine/comm/crc32.cpp \ + machine/qextserial/qextserialbase.cpp \ + machine/qextserial/qextserialport.cpp \ + datafile/datafiledst.cpp \ + datafile/embdata.cpp \ + datafile/datafiledsr.cpp \ + items/outctrlitem.cpp \ + items/shortcutitem.cpp \ + items/fileitem.cpp \ + settings/settings.cpp \ + sharedviews/controlactionwidget.cpp \ + sharedviews/numerinputdialog.cpp \ + sharedviews/parametersetdialog.cpp \ + sharedviews/passworddialog.cpp \ + sharedviews/patternmanagewidget.cpp \ + sharedviews/patternselectwidget.cpp \ + sharedviews/promptdialog.cpp \ + sharedviews/sensorinputwidget.cpp \ + sharedviews/systemmanagedialog.cpp \ + sharedviews/wordsinputdialog.cpp \ + sharedviews/mybutton.cpp \ + mctype/mainwidgetfunction.cpp \ + sharedviews/setcontrolstyle.cpp \ + datafile/dsrcryption.cpp \ + items/itemsmanage.cpp \ + items/assistitem.cpp \ + items/patternsetitem.cpp \ + mctype/patternsingleboard/mainUI/mainwidget.cpp \ + machine/lotmachine.cpp \ + items/parasetitem.cpp \ + mctype/machinetypefun.cpp \ + machine/gatewaytcpclient.cpp \ + items/errorcodestateitem.cpp \ + mctype/patternsingleboard/function/highsinglequilting.cpp \ + datafile/datafilequi.cpp \ + datafile/datafilequix.cpp \ + datafile/dataoperat.cpp \ + sharedviews/mcheaddialog.cpp \ + sharedviews/headspacingsheetdialog.cpp \ + mctype/patternsingleboard/function/fiveheadprecisionsewing.cpp \ + sharedviews/fileselectdialog.cpp \ + sharedviews/debuginfodialog.cpp \ + items/nineitem.cpp \ + mctype/patternsingleboard/function/clothingmac.cpp \ + mctype/patternsingleboard/function/multineedlerotary.cpp \ +# datafile/dxf/dxfhelper.cpp \ +# datafile/dxf/dxfreader.cpp \ +# datafile/dxf/dxflib/dl_dxf.cpp \ +# datafile/dxf/dxflib/dl_writer_ascii.cpp \ + datafile/hpgl/importhpgl.cpp \ + datafile/hpgl/marker.cpp \ + datafile/hpgl/vectorfont.cpp \ + machine/mytcpserver.cpp \ + mctype/patternsingleboard/function/thickwiringmac.cpp \ + mctype/patternsingleboard/function/flyshuttle.cpp \ + sharedviews/patterneditwidget.cpp \ + sharedviews/view/mygraphicsscene.cpp \ + sharedviews/view/mygraphicsview.cpp \ + sharedviews/view/mygraphicsgriditem.cpp \ + sharedviews/patternneedlelayoutwidget.cpp \ + sharedviews/linegenerwidget.cpp \ + sharedviews/shuttlebottomlinedialog.cpp \ + mctype/patternsingleboard/function/glassfibremac.cpp \ + mctype/patternsingleboard/function/doublelayeredmac.cpp \ + mctype/patternsingleboard/function/dlqscheboard.cpp \ + mctype/patternsingleboard/function/singlemutilneedlemac.cpp \ + mctype/patternsingleboard/function/doublesidedbedsheets.cpp \ + mctype/patternsingleboard/function/l2000multimac.cpp \ + mctype/patternsingleboard/function/fullyautomatic.cpp \ + mctype/patternsingleboard/function/pkgfoursidedtestboardmac.cpp \ + mctype/patternsingleboard/function/autodoubledoormac.cpp \ + mctype/patternsingleboard/function/doubleheadcombqui.cpp \ + mctype/patternsingleboard/function/cuttingwalk.cpp \ + sharedviews/knifegapparadialog.cpp \ + mctype/patternsingleboard/function/fourheadcombqui.cpp + +#windows下调用库 +#win32:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/Machine.dll +#win32:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/DataFileComb.dll + +#linux下调用库 +#unix:LIBS += $$PWD/../../HMI-Widget/XPlatform/Dll/Machine + +#RESOURCES += \ +# bf.qrc + +unix:INSTALLS += target +unix:target.path=/storage/oprt + +TRANSLATIONS += chinese.ts\ +english.ts\ +spanish.ts\ +bengal.ts\ +turkey.ts\ +denmark.ts\ +vietnamese.ts\ +ukrainian.ts\ +russian.ts\ +france.ts\ +polish.ts\ #波兰语 +dutch.ts\ #荷兰语 +german.ts #德语 + + +unix:HEADERS += machine/qextserial/posix_qextserialport.h +unix:SOURCES += machine/qextserial/posix_qextserialport.cpp +unix:DEFINES += _TTY_POSIX_ + +win32:HEADERS += machine/qextserial/win_qextserialport.h +win32:SOURCES += machine/qextserial/win_qextserialport.cpp +win32:DEFINES += _TTY_WIN_ + diff --git a/datafile/datafiledsr.cpp b/datafile/datafiledsr.cpp new file mode 100644 index 0000000..6a8dd1a --- /dev/null +++ b/datafile/datafiledsr.cpp @@ -0,0 +1,1248 @@ +#include "datafiledsr.h" + +#include "main.h" + +#define DSR_EMB_DATADIRX (-1) // X向数据坐标与下位机坐标系统的差异 +#define DSR_EMB_DATADIRY (-1) // Y向数据坐标与下位机坐标系统的差异 +#define DSR_EMB_DATADIRR (1) // R向数据坐标与下位机坐标系统的差异 + +#define DSR_SHOWDIRX (-1) // X向显示坐标和数据坐标的差异 +#define DSR_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异 + +static int dsr_emb_dataDirX = (-1); // X向数据坐标与下位机坐标系统的差异 +static int dsr_emb_dataDirY = (1); // Y向数据坐标与下位机坐标系统的差异 +static int dsr_emb_dataDirR = (1); // R向数据坐标与下位机坐标系统的差异 + +DataFileDsr::DataFileDsr(): + m_HeadSpacingIndex(0) +{ + memset(&m_62HeadData, 0, sizeof(DsrHeadEx62)); +} + +DataFileDsr::DataFileDsr(const QString &fullPathName) +{ + initFile(fullPathName); + loadFile(); + convertDataToEmbAbs(); +} + +DataFileDsr::~DataFileDsr() +{ +} + +void DataFileDsr::initFile(const QString &fullPathName) +{ + clear(); + QFileInfo file(fullPathName); + if (file.exists() && file.isFile()) + { + m_fileFullPathName = fullPathName; + m_fileName = fullPathName; + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING) + { + updateFileVersionTo6_2(); // 文件头中新增2048的数据 + } + } + else + { + qDebug() << "Init file failed path =" << m_fileFullPathName; + } +} + +//检查dsr文件版本,非5.2以上版本和错误格式返回-1 +int DataFileDsr::checkDsrVersion() +{ + loadFile(); // 如果数据未读取,重新读取 + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return -1; + } + float ver = *((float*)(m_fileData.data())); + if(ver < DSR_VERSION_5_2) //5.2以下版本 + { + return -1; + } + + if(ver >= DSR_VERSION_6_3) //6.3版本 + { + if(size <= (int)(sizeof(DsrHead63))) + { + qDebug() << "dsr size less then headsize"; + return -1; + } + } + + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + size -= dsrHead->dataBegin; + if (size <= 0) + { + qDebug("dsr dataBegin err"); + return -1; + } + int stepsize = size/sizeof(DsrStep); + if (stepsize <= 0) + { + qDebug("dsr data size err"); + return -1; + } + if (stepsize > PATTERN_LARGE_NEEDLES)//128万针 + { + qDebug("dsr data size big"); + return -2; + } + + return stepsize; +} + +// 转换为绝对数据 +void DataFileDsr::convertDataToEmbAbs(int scanX,int scanY) +{ + m_embAbsData.clear(); + + getDsrMinMax();//读取dsr源文件 + + double factorX = 1.0; + double factorY = 1.0; + if(scanX != 0) + { + factorX = (double)scanX / (double)(m_maxX - m_minX); + } + if(scanY != 0) + { + factorY = (double)scanY / (double)(m_maxY - m_minY); + } + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return; + } + DsrHead * dsrHead = (DsrHead *)(m_fileData.data());//头文件的结构体 + size -= dsrHead->dataBegin; + + if (size <= 0) + { + qDebug("dsr dataBegin err"); + return; + } + int stepsize = size/sizeof(DsrStep); + if (stepsize <= 0) + { + qDebug("dsr data size err"); + return; + } + DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); + + // 绝对坐标数据 + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + QByteArray absData;//绝对坐标 + absData.clear(); + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + DsrStep * dsrDataPtr = dsrDataBeg; + DsrStep * dsrDataPtrTemp = dsrDataBeg; + + int maxX = S32_MIN; + int maxY = S32_MIN; + int minY = S32_MAX; + int minX = S32_MAX; + + int stepidx = 0; + int runflag = 0; + BYTE ctrl,attr; + BYTE lastStatus = DATA_END_OLD; //上一针的状态; + double xfactor ; + double yfactor ; + double rfactor ; + if(g_emMacType == MACHINE_THICK_WIRING) + { + dsr_emb_dataDirX = 1; + } + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + dsr_emb_dataDirX = -1; + dsr_emb_dataDirY = -1; + } + + if (dsrHead->xyUnit == 0) // 0:单位0.1mm; 1: 0.01mm; 2: mm + { + xfactor = dsr_emb_dataDirX*10; + yfactor = dsr_emb_dataDirY*10; + } + else if (dsrHead->xyUnit == 2) + { + xfactor = dsr_emb_dataDirX*100; + yfactor = dsr_emb_dataDirY*100; + } + else + { + xfactor = dsr_emb_dataDirX; + yfactor = dsr_emb_dataDirY; + } + if (dsrHead->rUnit == 0) // 0:单位0.36度; 1: 0.036度; 2: 度; 3, 1/10000弧度; + { + rfactor = 2*PI*10 * dsr_emb_dataDirR; + } + else if (dsrHead->rUnit == 1) + { + rfactor = 2*PI * dsr_emb_dataDirR; + } + else + { + rfactor = dsr_emb_dataDirR; + } + + int olday{0},index{0},oldax{0},oldar{0}; + int headSpacingIndex{0}; //机头间距索引 + + s32 firstX {0}; + s32 firstY {0}; + static bool flag; + flag = true; + + //都减去第一个点坐标,并转换为中间数据 + for (int i = 0; i < stepsize; i++) + { + dsrDataPtr->dx *= factorX; + dsrDataPtr->dy *= factorY; + + ctrl = dsrDataPtr->ctrl; + attr = dsrDataPtr->attr; + int ax = dsrDataPtr->dx; + int ay = dsrDataPtr->dy; + int ar = dsrDataPtr->dr; + + if (ctrl == DATA_PAUSE_OLD) // 暂停 + { + ctrl = DATA_PAUSE; + } + if (ctrl == DATA_ANGLE_OLD) // 拐点 + { + ctrl = DATA_ANGLE; + } + if (ctrl == DATA_CUT_OLD) // 剪线 + { + ctrl = DATA_CUTTRD; + } + if (ctrl == DATA_END_OLD) // 结束码 + { + ctrl = DATA_END; + } + if (ctrl == DATA_CHGND_OLD) // 换色功能码 + { + ctrl = DATA_CHGND; + } + +#if(1) + //判断是否要改变第一针的属性 + if(ctrl == DSR_JUMP) + { + if (runflag == 0) + { + runflag = 1; + } + runflag++; + } + else if(ctrl == DSR_SEWING)//第一针不转换为跳针 + { + if ((runflag == 0 || runflag > 3) && (i > 0)) // 第一个运针是入针 + { + ctrl = DATA_OFFSET; + runflag = 1; + } + else if (i == 0) // 20230511 第一针,入针,向后扫描,如果有连续的三个跳针,则将第一针入针转换为跳针 ljs + { + int count = 0; + do + { + dsrDataPtrTemp++; + if (dsrDataPtr->ctrl == DSR_JUMP) + { + count++; + if (dsrDataPtrTemp->dx == 0 && dsrDataPtrTemp->dy == 0) // 空跳,直接变成跳针 + { + count += 2; + } + } + else + { + break; + } + }while(1); + if (count >= 3) + { + ctrl = DATA_OFFSET; + runflag = 2; + } + else + { + runflag = 1; + } + } + else + { + runflag = 1; + } + } + else if (ctrl == DATA_CHGND) // 换色 + { + runflag = 10; + } + else + { + runflag = 0; + } +#endif + + //附加动作定义 记录每个针步的机头间距索引(机头间距表中对应的位置) + //缝纫动作结束,索引增加,起始为0 + //上一针为缝纫或剪线,这一针不是缝纫和剪线,则增加索引 + if(((lastStatus == DATA_SEWING + || lastStatus == DATA_CUT_OLD + ||lastStatus ==DATA_CUTTRD) + && + (ctrl != DATA_SEWING && ctrl != DATA_CUT_OLD + && ctrl != DATA_CUTTRD && ctrl != DATA_END_OLD + && ctrl != DATA_NULL))) + { + headSpacingIndex++; + } + + ///五头机 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING){ + //后一个字节为机头间距表的索引 + unsigned char actArr[2]; + actArr[0] = 0x10;//前个字节为00010000 + actArr[1] = headSpacingIndex & 0xff; + memcpy(&absItem.action,actArr,2); + }else{ + absItem.action = dsrDataPtr->action; + } + + lastStatus = ctrl; + absItem.ctrl = ctrl; + absItem.attr = attr; + absItem.ax = ax * xfactor + dsrHead->startX; + absItem.ay = ay * yfactor + dsrHead->startY; + absItem.ar = ar * rfactor; + + if (absItem.ax > maxX) + { + maxX = absItem.ax; + } + if (absItem.ax < minX) + { + minX = absItem.ax; + } + if (absItem.ay > maxY) + { + maxY = absItem.ay; + } + if (absItem.ay < minY) + { + minY = absItem.ay; + } + + //判断条件 ay是累加得 + if((abs(olday) <= getBisect()*100) && (getBisect()*100 HEAD_NAME_STR_LEN) + { + namelen = HEAD_NAME_STR_LEN; + } + memcpy(dhead.fileName, tempdata.constData(), namelen); // 文件名称 + dhead.fileName[namelen] = 0; + + dhead.dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + dhead.itemNums = newstepnum; // 数据项个数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + dhead.dataChecksum = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 原始数据累加校验和 + dhead.fileid = fileID; + + dhead.anchorX = dsrHead->anchorX; // 定位点坐标X + dhead.anchorY = dsrHead->anchorY; // 定位点坐标Y + dhead.beginX = dsrHead->startX; // 数据起点坐标X + dhead.beginY = dsrHead->startY; // 数据起点坐标Y + dhead.beginR = 0; + dhead.minX = minX-minX; + dhead.maxX = maxX-minX; + dhead.minY = minY-minY; + dhead.maxY = maxY-minY; // 轮廓范围,使用重新计算之后的值 + + m_firstPoint = QPoint(firstX - static_cast(minX), firstY - static_cast(minY)); //反推第一点的相对左边前边的坐标 + + // 保存文件头到数组中 + m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead)); + + // 保存数据到数组中 + m_embAbsData.append(absData); +} + +// 生成预览图片 +int DataFileDsr::createPreviewImage(QImage *pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + if(reDraw == 0)//图片存在则不重画 + { + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + int width, height; + if (pImg == NULL) + { + width = DSR_PREVIEW_WIDTH; + height = DSR_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + + if (width <= DSR_PREVIEW_SIDE*2 || height <= DSR_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + getDsrMinMax(); + // 图形 + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return -1; + } + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + size -= dsrHead->dataBegin; + if (size <= 0) + { + qDebug("dsr dataBegin err"); + return -1; + } + int stepsize = size/sizeof(DsrStep); + if (stepsize <= 0) + { + qDebug("dsr data size err"); + return -1; + } + + DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); + + // 图形显示区域 + int dpminx = DSR_PREVIEW_SIDE; + int dpmaxx = width - DSR_PREVIEW_SIDE; + int dpminy = DSR_PREVIEW_SIDE + DSR_PREVIEW_SIDE; + int dpmaxy = height - DSR_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + factor = (double)(abs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(abs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按轮廓计算,最小能够放下重复次数个图形 + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - (((m_maxX+dsrHead->startX)+(m_minX+dsrHead->startX))/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - (((m_maxY+dsrHead->startY)+(m_minY+dsrHead->startY))/factor)/2); + + s16 showDirY = DSR_SHOWDIRY; + if(g_emMacType == MACHINE_GLASSFIBRE) + { + showDirY *= -1; + } + + // 显示花样图形 + BYTE ctrlByte; + //BYTE attrByte; + QColor sewcolor = QColor(Qt::green); + pen.setColor(sewcolor); + painter.setPen(pen); + + double datposx, datposy; + int curx, cury, prex, prey; + curx = cury = prex = prey = 0; + + DsrStep * dsrDataPtr = dsrDataBeg; + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + ctrlByte = dsrDataPtr->ctrl; + //attrByte = dsrDataPtr->attr; + + prex = curx; + prey = cury; + + datposx = dsrDataPtr->dx + dsrHead->startX; + datposy = dsrDataPtr->dy + dsrHead->startY; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (DSR_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (showDirY == -1) + { + cury = (height)-cury; + } + + if(i == 0) + { + dsrDataPtr++; + continue; + } + + if ( ctrlByte == DSR_SEWING || + ctrlByte == DSR_EMB || + ctrlByte == DSR_CUTTING || + ctrlByte == DSR_LASER || + ctrlByte == DSR_JUMP || + ctrlByte == DSR_DRAWING) + { + painter.drawLine(prex, prey, curx, cury); + } + else + { + //qDebug("other type=0x%x", ctrlByte); + } + + dsrDataPtr++; + } + + // 保存成文件 + QString preview = getFileFullPathName(); + if (saveflag != 0 && preview.isEmpty() == false) + { +#if (1) + preview += ".preview.png"; + pImage->save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +DsrHead *DataFileDsr::getDsrHead() +{ + if(m_fileData.size() <= 0) + { + loadFile(); // 如果数据未读取,重新读取 + } + + DsrHead * head = NULL; + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + head = new DsrHead; + memset(head,0,sizeof(DsrHead)); + return head; + } + + head = (DsrHead *)(m_fileData.data()); + return head; +} + +void DataFileDsr::moveDataBeginPonit(s32 left, s32 front) +{ + if((u32)m_embAbsData.size() > sizeof(DataDs16FileHead)) + { + DataDs16FileHead *dhead = (DataDs16FileHead *)( m_embAbsData.data()); + dhead->beginX += left; + dhead->beginY += front; + dhead->maxX += left; + dhead->minX += left; + dhead->maxY += front; + dhead->minY += front; + } +} + +//dsr文件头中新增2048的拓展 用于存机头间距参数 +void DataFileDsr::updateFileVersionTo6_2() +{ + qDebug()<<"exec DataFileDsr::updateFileVersionTo6_2()"; + //1 读出数据 + //2 判断文件版本 + //3 插入数据 + //4 修改头文件信息 文件版本 和 数据起始位置 + + QFile file(m_fileFullPathName); + qDebug()<verCode, sizeof(float)); + ver += 0.1f; + DWORD begin = dsrHead->dataBegin; + qDebug() << "file Version:" << ver; + qDebug()<< "dsr file data beign:" << begin; + + if(ver < DSR_VERSION_5_2 && begin != (sizeof(DsrHead) + sizeof(DsrHeadEx62))){ + file.remove();//删除文件 + QFile newFile(m_fileFullPathName); + if(newFile.open(QIODevice::ReadWrite | QIODevice::Truncate)){ + + QByteArray newFileBuffer; + + //添加原先的文件头 + newFileBuffer.append(oldFile.left(begin)); + qDebug()<<"append(oldFile.left(begin))" <dataBegin = sizeof(DsrHead) + sizeof(DsrHeadEx62); //3072 + qDebug()<<"newDsrHead:"<dataBegin; + + //添加数据区 + newFileBuffer.append(oldFile.right(oldFile.size() - begin)); + qDebug()<<"oldFile.right(oldFile.size() - begin)" <verCode) - sizeof(dsrHead->cryWord); + //定位到文件版号+加密字后位置 + BYTE* pFileData = (BYTE*)((m_fileData.data() + sizeof(dsrHead->verCode) + sizeof(dsrHead->cryWord))); + int nDncryption = dsrHead->cryWord; + qDebug() << "nDncryption:" << nDncryption; + int rslt = cry.goaDeCryption(pFileData, nDncryption, nFileSize); + + if (rslt == 0) + { +#if(0) + //富怡解密 + dsrHead->cryWord = 0; +#else + //再登高解密 + dsrHead->cryWord = 0x01; +#endif + } + } + + return; +} + +void DataFileDsr::saveFile() +{ + QFile wrfile(m_fileFullPathName); + if(!wrfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << m_fileFullPathName; + return; + } + else + { + wrfile.write(m_fileData); + wrfile.close(); + } +} + +//写入定位点或起绣点到文件中 +void DataFileDsr::writePointToFile(int x, int y, int flag) +{ + QFile rdfile(m_fileFullPathName); + if(!rdfile.open(QIODevice::ReadOnly)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + int rslt = -1; + int changeFlag = 0; + + QByteArray fileData = rdfile.readAll(); + DsrHead * pDsrHead = (DsrHead *)(fileData.data()); + DWORD cryWord = pDsrHead->cryWord; + rdfile.close(); + + pDsrHead = (DsrHead *)(m_fileData.data()); + pDsrHead->cryWord = cryWord; + if(flag == 0) + { + if(pDsrHead->startX == x && pDsrHead->startY == y) + { + changeFlag = 0; + } + else + { + changeFlag = 1; + } + + pDsrHead->startX = x; + pDsrHead->startY = y; + } + else + { + if(pDsrHead->anchorX == x && pDsrHead->anchorY == y) + { + changeFlag = 0; + } + else + { + changeFlag = 1; + } + + pDsrHead->anchorX = x; + pDsrHead->anchorY = y; + } + + DsrCryption cry; + int nFileSize = m_fileData.size() - sizeof(pDsrHead->verCode) - sizeof(pDsrHead->cryWord); + //定位到文件版号+加密字后位置 + BYTE* pFileData = (BYTE*)((m_fileData.data() + sizeof(pDsrHead->verCode) + sizeof(pDsrHead->cryWord))); + rslt = cry.goaEncryption(pFileData, cryWord, nFileSize); + + if(rslt == 0 || (rslt != 0 && changeFlag == 1)) + { + QFile wfile(m_fileFullPathName); + if(wfile.exists()) + { + QFile::remove(m_fileFullPathName); + } + + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); + +#ifdef Q_OS_LINUX + system("sync"); +#endif + } +} + +void DataFileDsr::writeStartPointToFile(int x, int y) +{ + writePointToFile(x,y,0); +} + +void DataFileDsr::writeAnchorPointToFile(int x, int y) +{ + writePointToFile(x,y,1); +} + +void DataFileDsr::writeFileLL(int Left, int front) +{ + if(m_fileData.size() <= 0) + return; + DsrHead * pDsrHead = (DsrHead *)(m_fileData.data()); + pDsrHead->left = Left; + pDsrHead->front = front; + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); + +#ifdef Q_OS_LINUX + system("sync"); +#endif +} + +void DataFileDsr::writePatternParaToFile(DsrHead *head) +{ + if(m_fileData.size() <= 0) + { + return; + } + + memcpy(m_fileData.data(),(char*)head,sizeof(DsrHead)); + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); +} + +QString DataFileDsr::getFileFullPath() +{ + QFileInfo file(m_fileFullPathName); + return file.absoluteFilePath(); +} + +QString DataFileDsr::getFileFullName() +{ + QFileInfo file(m_fileFullPathName); + return file.fileName(); +} + +QString DataFileDsr::getFileName() +{ + QFileInfo file(m_fileFullPathName); + return file.completeBaseName(); +} + +QString DataFileDsr::getFileSuffix() +{ + QFileInfo file(m_fileFullPathName); + return file.suffix(); +} + +int DataFileDsr::getStitchNums() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return pDsrHead->itemNums; +} + +int DataFileDsr::getDatWidth() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return (pDsrHead->maxX - pDsrHead->minX); +} + +int DataFileDsr::getDatHeight() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return (pDsrHead->maxY - pDsrHead->minY); +} + +int DataFileDsr::getMaxX() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return pDsrHead->maxX; +} + +int DataFileDsr::getMinX() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return pDsrHead->minX; +} + +int DataFileDsr::getMaxY() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return pDsrHead->maxY; +} + +int DataFileDsr::getMinY() +{ + if(m_embAbsData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); + return pDsrHead->minY; +} + +int DataFileDsr::getBeginXYAndAnchorXY(int &beginX, int &beginY, int &anchorX, int &anchorY) +{ + QFileInfo file(m_fileFullPathName); + if (!file.exists() || !file.isFile()) + { + return -1; + } + + QFile rdfile(m_fileFullPathName); + if(!rdfile.open(QIODevice::ReadOnly)) + { + return -1; + } + + m_fileData = rdfile.readAll(); + + int ret = checkFileCryption(); + if(ret > 0)//已加密 + { + //解密 + u32 size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + return -1; + } + DsrCryption cry; + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + int nFileSize = size - sizeof(dsrHead->verCode) - sizeof(dsrHead->cryWord); + //定位到文件版号+加密字后位置 + BYTE* pFileData = (BYTE*)((m_fileData.data() + sizeof(dsrHead->verCode) + sizeof(dsrHead->cryWord))); + int nDncryption = dsrHead->cryWord; + qDebug() << "nDncryption:" << nDncryption; + int rslt = cry.goaDeCryption(pFileData, nDncryption, nFileSize); + + if (rslt == 0) + { + //再登高解密 + dsrHead->cryWord = 0x01; + } + + size = m_fileData.size(); + if (size <= (sizeof(DsrHead) + sizeof(DsrStep))) + { + return -1; + } + + DsrHead * pDsrHead = (DsrHead *)((m_fileData.data())); + DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + pDsrHead->dataBegin)); + + anchorX = pDsrHead->anchorX; + anchorY = pDsrHead->anchorY; + //起始点坐标等于定位点+起始点+第一针的坐标 + beginX = pDsrHead->anchorX-pDsrHead->startX-dsrDataBeg->dx; + beginY = pDsrHead->anchorY+pDsrHead->startY+dsrDataBeg->dy; + } + else + { + u32 size = m_fileData.size(); + if (size <= ((sizeof(DsrHead))+sizeof(DsrStep))) + { + return -1; + } + + DsrHead * pDsrHead = (DsrHead *)((m_fileData.data())); + DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + pDsrHead->dataBegin)); + + anchorX = pDsrHead->anchorX; + anchorY = pDsrHead->anchorY; + //起始点+第一针的坐标,绗缝机不用定位点,所以这里不用加定位点 + beginX = pDsrHead->startX+dsrDataBeg->dx; + beginY = pDsrHead->startY+dsrDataBeg->dy; + } + + return 0; +} + +int DataFileDsr::getStepNums() +{ + int stepNums = m_HeadSpacingIndex +1; + return stepNums;//个数为index加一 +} + +int DataFileDsr::getBisect() +{ + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return -1; + } + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + return dsrHead->bisect; +} + +void DataFileDsr::set62ExHead(DsrHeadEx62 data) +{ + m_62HeadData = data; +} + +DsrHeadEx62 &DataFileDsr::get62ExHead() +{ + return m_62HeadData; +} + +const QPoint &DataFileDsr::getFirstPoint() +{ + return m_firstPoint; +} + +int DataFileDsr::checkFileCryption() +{ + int encryption = 0; + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return -1; + } + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + + if (dsrHead->cryWord != 0 && dsrHead->cryWord != 0x01) + { + encryption = 1; + } + + return encryption; +} + +void DataFileDsr::getDsrMinMax() +{ + loadFile(); // 如果数据未读取,重新读取 + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DsrHead))) + { + qDebug("dsr size less then headsize"); + return; + } + + DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); + + size -= dsrHead->dataBegin; + if (size <= 0) + { + qDebug("dsr dataBegin err"); + return; + } + + int stepsize = size/sizeof(DsrStep); + if (stepsize <= 0) + { + qDebug("dsr data size err"); + return; + } + + DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); + DsrStep * dsrDataPtr = dsrDataBeg; + m_maxX = S32_MIN; + m_maxY = S32_MIN; + m_minY = S32_MAX; + m_minX = S32_MAX; + + BYTE ctrlByte; + + long curPitX = 0; + long curPitY = 0; + + int i = 0; + do + { + if (i < stepsize) + { + ctrlByte = dsrDataPtr->ctrl; + + if ( ctrlByte == DATA_EMB || + ctrlByte == DSR_SEWING || + ctrlByte == DATA_OFFSET || + 0 ) + { + curPitX = dsrDataPtr->dx; + curPitY = dsrDataPtr->dy; + } + dsrDataPtr++; + i++; + } + else + { + break; + } + + if (curPitX > m_maxX) + { + m_maxX = curPitX; + } + if (curPitX < m_minX) + { + m_minX = curPitX; + } + if (curPitY > m_maxY) + { + m_maxY = curPitY; + } + if (curPitY < m_minY) + { + m_minY = curPitY; + } + + }while(1); + + return; +} diff --git a/datafile/datafiledsr.h b/datafile/datafiledsr.h new file mode 100644 index 0000000..9e7ac3d --- /dev/null +++ b/datafile/datafiledsr.h @@ -0,0 +1,226 @@ +#ifndef DATAFILEDSR_H +#define DATAFILEDSR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "math.h" +#include + +#include "dsrcryption.h" +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" + + +#define DSR_PREVIEW_SIDE (15) // 留边大小 +#define DSR_PREVIEW_WIDTH (156) // 默认预览图区域宽度 +#define DSR_PREVIEW_HEIGHT (164) // 默认预览图区域高度 + +#define DSR_VERSION_5 5.00f +#define DSR_VERSION_5_2 5.20f +#define DSR_VERSION_6_3 6.30f + +typedef struct strDsrHead +{ +// 0x00 十六进制表示 + DWORD verCode; // 文件版本 LSB + DWORD cryWord; // 加密字 + BYTE reserved1[8]; // 保留 8 字节 +// 0x10 + DWORD dataBegin; // 数据起始 LSB + DWORD stepSize; // 数据字段大小 + DWORD xyUnit; // 长度数据单位 + DWORD rUnit; // 角度数据单位 +// 0x20 + DWORD stitches; // 针数 LSB + DWORD fileID; // 文件id,和智能识别有关 = 0, 不能识别 + BYTE reserved2[8]; // 保留 8 字节 +// 0x30 + s32 rangeNx; // 范围 -X LSB + s32 rangePx; // 范围 +X LSB + s32 rangeNy; // 范围 -Y LSB + s32 rangePy; // 范围 +Y LSB +// 0x40 + long startX; // 起点坐标X LSB + long startY; // 起点坐标Y LSB + long anchorX; // 定位点X LSB + long anchorY; // 定位点Y LSB +// 0x50 + int bisect; //平分参数 +// 0x54 + u8 rotateStyle; //旋转式样 + u8 horizontalStyle; //水平翻转式样 + u8 verticalStyle; //垂直翻转式样 + u8 rotateAngle; //旋转角度 + u8 reinMode; //加固方式 + u8 reinNeedles; //针数 + u8 reinNum; //次数 + s16 normalStep; //针步大小 + s16 angleCorrOffset; //角度修正量 + s16 angleCorrPosX; //角度修正量X正 + s16 angleCorrPosY; //角度修正量Y正 + s16 angleCorrNegX; //角度修正量X负 + s16 angleCorrNegY; //角度修正量Y负 + int scanX; //X向宽度 + int scanY; //Y向高度 + int left; //左边 + int front; //前边 + +// 0x77 + u16 HStep; // 0x1E—0x1F; 水平方向针距 单位:0.1mm(绘制用,多针机) + u16 leftRightLen; // 0x20—0x21; 左针右针距离 单位:0.1mm(绘制用,多针机) + u16 VStep12; // 0x22—0x23; 第1 2排针距 单位:0.1mm(绘制用,多针机) + u16 VStep23; // 0x24—0x25; 第2 3排针距 单位:0.1mm(绘制用,多针机) + + // 针位n (0x00:无针,0x01:右针, 0x10:左针,0x11:左右针) + u8 arrayNeedle1[48]; // 0x26—0x55; 第1排排针(绘制用,多针机) + u8 arrayNeedle2[48]; // 0x56—0x85; 第2排排针(绘制用,多针机) + u8 arrayNeedle3[48]; // 0x86—0xB5; 第3排排针(绘制用,多针机) + +// 0x77 + u8 rotation; //0x10F; 旋转角度调整 + s16 oftNeedleSize; //去除偏移针步大小设置 + //BYTE reserved4[0x100-0x77]; // 保留字节 +// 0x100 +// u8 reserved5[0x200-0x10F]; //BYTE // 保留字节 + u8 reserved5[0x200-0x112]; //BYTE // 保留字节 +// 0x200 + u8 reserved6[0x400-0x200]; //BYTE + +}__attribute__ ((packed)) DsrHead; + +//dsr6.3版本的文件头扩展 +typedef struct strDsrHead63 +{ + //0x00 + u8 switchTable2[0x200-0x000]; //BYTE // 换色表2(扩展色序设定表),512个字节 + //0x200 + u8 towelHighTable[0x600-0x200]; //BYTE // 毛巾高度设定表, 支持1024个高度设定,每个字节对应一个高度等级(0,非有效高度。1--11, 有效的高度等级) +}__attribute__ ((packed)) DsrHead63; + + +//dsr6.2版本得文件头扩展 +typedef struct +{ + //支持128个表,每个表包含16个字节. + HeadTable headEnableSpacing[128]; +} DsrHeadEx62; + + +typedef struct strDsrStep +{ + BYTE ctrl; // 控制字节 + BYTE attr; // 属性字节 + WORD action;// 附加动作 + s32 dx; // X绝对偏移 + s32 dy; // Y绝对偏移 + s32 dr; // R角度 +}__attribute__ ((packed)) DsrStep; + + +//----------------------------------------------- + +#define DSR_NULL 0x00 // 文件结束 +#define DSR_SEWING 0x01 // 缝纫数据 +#define DSR_OFFSET 0x02 // 偏移数据 +#define DSR_CUTTING 0x03 // 切刀数据 +#define DSR_LASER 0x04 // 激光数据 +#define DSR_DRAWING 0x05 // 记号数据 +#define DSR_SEWING_R 0x06 // 第二缝纫数据 + +#define DSR_PAUSE 0x08 // 暂停 +#define DSR_ANGLE 0x09 // 拐点 +#define DSR_CUT 0x0A // 剪线 +#define DSR_JUMP 0x0B // 跳针 +#define DSR_EMB 0x0D // 绣花 +#define DSR_CHGND 0x0E // 换色 + +#define DSR_END 0x10 // 结束码 + +//----------------------------------------------- + +class DataFileDsr +{ +public: + DataFileDsr(); + DataFileDsr(const QString & fullPathName); + ~DataFileDsr(); + +public: + void initFile(const QString & fullPathName); + int checkDsrVersion();//检查dsr文件版本,非5.2和6.3版本和错误格式返回-1 + void convertDataToEmbAbs(int scanX = 0,int scanY = 0); // 转换为绝对数据 + //是否保存 //笔宽 + int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + DsrHead *getDsrHead(); + void moveDataBeginPonit(s32 left, s32 front); //移动数据起始点 + void updateFileVersionTo6_2(); //更新文件版本至6.2 + +public: + void clear(); + void loadFile(); + void saveFile(); + void writePointToFile(int x, int y, int flag = 0);//写入起始点到文件中 + void writeStartPointToFile(int x, int y); + void writeAnchorPointToFile(int x, int y); + void writeFileLL(int Left, int front);//写入左边前边到文件 + void writePatternParaToFile(DsrHead *head);//将花样参数配置写到文件中 + inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称 + inline QByteArray & getFileData() {return m_fileData;} // 得到文件数据 + inline QByteArray & getEmbAbsData() {return m_embAbsData;} // 得到转换后的数据 + QString getFileFullPath(); // 文件所在目录 + QString getFileFullName(); // 文件名称(包括扩展名) + QString getFileName(); // 文件名称(不包括扩展名) + QString getFileSuffix(); // 文件扩展名 + + int getStitchNums();//得到数据的针数 + int getDatWidth();//得到数据的图形宽度 + int getDatHeight();//得到数据的图形高度 + int getMaxX();//得到数据最大X+ + int getMinX();//得到数据最小X- + int getMaxY();//得到数据最大Y+ + int getMinY();//得到数据最小Y- + int getBeginXYAndAnchorXY(int &beginX, int &beginY, int &anchorX, int &anchorY); + void getDsrMinMax(); + inline int getDsrMaxX(){return m_maxX;}//得到数据最大X+ + inline int getDsrMinX(){return m_minX;}//得到数据最小X- + inline int getDsrMaxY(){return m_maxY;}//得到数据最大Y+ + inline int getDsrMinY(){return m_minY;}//得到数据最小Y- + + int getStepNums(); //获取换色数 + + int getBisect();//获取平分距离 + + void set62ExHead(DsrHeadEx62 data); + DsrHeadEx62 & get62ExHead(); + const QPoint& getFirstPoint(); + +protected: + QString m_fileFullPathName; // 文件路径 + QByteArray m_embAbsData; // 转换后的绝对坐标数据 + +private: + QByteArray m_fileData;// 文件数据内容(原始数据) + QString m_fileName; // 文件路径 + QPoint m_firstPoint; //第一点相对左下角坐标 + +public: + DsrHeadEx62 m_62HeadData; //6.2版本附加文件头数据 + +private: + int m_minX; + int m_maxX; + int m_minY; + int m_maxY; + int m_HeadSpacingIndex; //五头精密缝 机头间距表列数index + +private: + int checkFileCryption();//检查dsr文件是否加密 +}; + +#endif // DATAFILEDSR_H diff --git a/datafile/datafiledst.cpp b/datafile/datafiledst.cpp new file mode 100644 index 0000000..44f55a9 --- /dev/null +++ b/datafile/datafiledst.cpp @@ -0,0 +1,988 @@ +#include "datafiledst.h" + + +DataFileDst::DataFileDst() +{ +} + +DataFileDst::DataFileDst(const QString &fullPathName) +{ + initFile(fullPathName); + loadFile(); + convertDataToAbs(); +} + +DataFileDst::~DataFileDst() +{ +} + +void DataFileDst::clear() +{ + m_fileFullPathName.clear(); // 文件路径 + m_fileData.clear(); // 文件数据内容 + m_embAbsData.clear(); // 转换后的数据 +} + +void DataFileDst::initFile(const QString &fullPathName) +{ + clear(); + QFileInfo file(fullPathName); + if (file.exists() && file.isFile()) + { + m_fileFullPathName = fullPathName; + m_fileName = fullPathName; + qDebug()<<"m_fileFullPathName 1"<= 0) + { + ctrl = ds4Item.ctrl; + attr = ds4Item.attr; + + if ( ctrl == DATA_SEWING || + ctrl == DATA_OFFSET || + 0 ) + { + if(ctrl == DATA_OFFSET) + { + jumpNeedleNum++; + } + + dx = ds4Item.dx * DATAFACTOR; + dy = ds4Item.dy * DATAFACTOR; + + if ((attr & 0x80) != 0) + { + dx *= -1; + } + if ((attr & 0x40) != 0) + { + dy *= -1; + } + } + + memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); + stepidx++; + } + + dstDataPtr++; + i++; + } + else + { + break; + } + }while(1); + + //qDebug()<<"Ds4Item end"; + //再将相对坐标转换为绝对坐标---开始 + ds4Data.append((char *)pData, stepidx*sizeof(Ds4Item));//相对坐标字节数组 + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(ds4Data.data()) , ds4Data.length()); // 原始数据累加校验和 + + QByteArray absItemAry; + absItemAry.clear(); + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + u8 ctrlByte; + u8 attrByte; + + m_maxX = S32_MIN; + m_maxY = S32_MIN; + m_minY = S32_MAX; + m_minX = S32_MAX; + + s16 dataDirX = DST_EMB_DATADIRX; + s16 dataDirY = DST_EMB_DATADIRY; + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + dataDirX *= -1; + } + + Ds4Item * pDs4Data = (Ds4Item *)(ds4Data.data()); + Ds4Item * ds4DataPtr = pDs4Data; + + s32 ax = dstHead->startX;//第一个点 + s32 ay = dstHead->startY; + s32 ar = 0; + + const s32 firstX = ax; + const s32 firstY = ay; + + Ds4Item * ds4DataTemp = (Ds4Item *)(ds4Data.data()); // ljs + int ds4StepSize = ds4Data.size()/sizeof(Ds4Item); + int runflag = 0; + int delStepNum = 0; // ljs + + for (int i = 0; i < ds4StepSize; i++) + { + // 读入一个针步数据 + ctrlByte = ds4DataPtr->ctrl; + attrByte = ds4DataPtr->attr; + int ddx = ds4DataPtr->dx * DATAFACTOR; + int ddy = ds4DataPtr->dy * DATAFACTOR; + + if ((attrByte & 0x80) != 0) + { + ddx *= -1; + } + if ((attrByte & 0x40) != 0) + { + ddy *= -1; + } + ddx *= dataDirX; + ddy *= dataDirY; + + ax += ddx; + ay += ddy; + + double tar = atan2(ddy,ddx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + + if(ctrlByte == DATA_OFFSET) + { + if (runflag == 0) + { + runflag = 1; + } + runflag++; + } + else if(ctrlByte == DATA_SEWING)//第一针不转换为跳针 + { + if ((runflag == 0 || runflag > 3) && (i > 0)) // 第一个运针是入针 + { + ctrlByte = DATA_OFFSET; + runflag = 1; + } + else if (i == 0) // 20230511 第一针,入针,向后扫描,如果有连续的三个跳针,则将第一针入针转换为跳针 ljs + { + int count = 0; + do + { + ds4DataTemp++; + if (ds4DataTemp->ctrl == DATA_OFFSET) + { + count++; + if (ds4DataTemp->dx == 0 && ds4DataTemp->dy == 0) // 空跳,直接变成跳针 + { + count += 2; + } + } + else + { + break; + } + }while(1); + if (count >= 3) + { + ctrlByte = DATA_OFFSET; + runflag = 2; + } + else + { + runflag = 1; + } + } + else + { + runflag = 1; + } + } + else if (ctrlByte == DATA_CHGND) // 换色 + { + runflag = 10; + } + else + { + runflag = 0; + } + + //中间数据 + absItem.ctrl = ctrlByte; + absItem.attr = attrByte & ~(0x80|0x40); + absItem.ax = ax; + absItem.ay = ay; + absItem.ar = ar; + + if (ax > m_maxX) + { + m_maxX = ax; + } + if (ax < m_minX) + { + m_minX = ax; + } + if (ay > m_maxY) + { + m_maxY = ay; + } + if (ay < m_minY) + { + m_minY = ay; + } + + absItemAry.append((char*)&absItem,sizeof(DsAbsItem)); + ds4DataPtr++; + } + + double factorX = 1.0; + double factorY = 1.0; + if(scanX != 0 || scanY != 0) + { + if(scanX != 0) + { + factorX = (double)scanX / (double)(m_maxX - m_minX); + } + if(scanY != 0) + { + factorY = (double)scanY / (double)(m_maxY - m_minY); + } + + if(factorX != 1.0 || factorY != 1.0) + { + DsAbsItem *absItem = (DsAbsItem*)(absItemAry.data()); + for(u32 j = 0; j < absItemAry.size()/sizeof(DsAbsItem); j++) + { + absItem->ax *= factorX; + absItem->ay *= factorY; + absItem++; + } + } + } + + int newstepnum = ds4StepSize-delStepNum; // 转换后的数据长度 ljs + + QString name = getFileFullName(); + QByteArray tempdata = name.toLocal8Bit(); + int namelen = tempdata.size(); + if (namelen > HEAD_NAME_STR_LEN) + { + namelen = HEAD_NAME_STR_LEN; + } + memcpy(dhead.fileName, tempdata.constData(), namelen); // 文件名称 + dhead.fileName[namelen] = 0; + + dhead.dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + dhead.itemNums = newstepnum; // 数据项个数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + dhead.dataChecksum = calcCheckSum32((u8 *)(absItemAry.data()) , dhead.dataSize); // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + dhead.fileid = fileID; + + dhead.anchorX = dstHead->anchorX; // 定位点坐标X + dhead.anchorY = dstHead->anchorY; // 定位点坐标Y + dhead.beginX = dstHead->startX; // 数据起点坐标X + dhead.beginY = dstHead->startY; // 数据起点坐标Y + dhead.beginR = 0; // 数据起点坐标R + + qDebug() << "==========================dhead.anchorX " << dhead.anchorX; + qDebug() << "==========================dhead.anchorY " << dhead.anchorY; + qDebug() << "==========================dhead.beginX " << dhead.beginX; + qDebug() << "==========================dhead.beginY " << dhead.beginY; + + dhead.minX = m_minX-m_minX; + dhead.maxX = m_maxX-m_minX; + dhead.minY = m_minY-m_minY; + dhead.maxY = m_maxY-m_minY; // 轮廓范围,使用重新计算之后的值 + + m_firstPoint = QPoint(firstX - static_cast(m_minX), firstY - static_cast(m_minY)); //反推第一点的相对左边前边的坐标 + + m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead)); + m_embAbsData.append(absItemAry); + + delete []pData; + return; +} + +void DataFileDst::writePointToFile(int x, int y, int flag) +{ + if(m_fileData.size() <= 0) + { + return; + } + + DstHead * pDstHead = (DstHead *)((m_fileData.data())); + if(flag) + { + pDstHead->anchorX = x; + pDstHead->anchorY = y; + } + else + { + pDstHead->startX = x; + pDstHead->startY = y; + } + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); +} + +void DataFileDst::writeStartPointToFile(int x, int y) +{ + writePointToFile(x,y,0); +} + +void DataFileDst::writeAnchorPointToFile(int x, int y) +{ + writePointToFile(x,y,1); +} + + +void DataFileDst::writeFileLL(int Left, int front) +{ + if(m_fileData.size() <= 0) + return; + + DstHead * pDstHead = (DstHead *)((m_fileData.data())); + pDstHead->left = Left; + pDstHead->front = front; + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); +} + +void DataFileDst::writePatternParaToFile(DstHead *head) +{ + if(m_fileData.size() <= 0) + { + return; + } + + memcpy(m_fileData.data(),(char*)head,sizeof(DstHead)); + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); +} + +int DataFileDst::checkDstFile() +{ + loadFile(); // 如果数据未读取,重新读取 + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DstHead))) + { + qDebug("dsr size less then headsize"); + return -1; + } + + size -= sizeof(DstHead); + int stepsize = size/sizeof(DstStep); + if (stepsize <= 0) + { + qDebug("dst data size err"); + return -1; + } + + if (stepsize > PATTERN_LARGE_NEEDLES)//128万针 + { + qDebug("dsr data size big"); + return -2; + } + + return stepsize; +} + +DstHead *DataFileDst::getDstHead() +{ + if(m_fileData.size() <= 0) + { + loadFile(); // 如果数据未读取,重新读取 + } + DstHead *head = NULL; + + int size = m_fileData.size(); + if (size <= (int)(sizeof(DstHead))) + { + head = new DstHead; + memset(head,0,sizeof(DstHead)); + return head; + } + + head = (DstHead *)((m_fileData.data())); + return head; +} + +void DataFileDst::moveDataBeginPonit(s32 left, s32 front) +{ + if((u32)m_embAbsData.size() > sizeof(DataDs16FileHead)) + { + DataDs16FileHead *dhead = (DataDs16FileHead *)( m_embAbsData.data()); + dhead->beginX += left; + dhead->beginY += front; + dhead->maxX += left; + dhead->minX += left; + dhead->maxY += front; + dhead->minY += front; + } +} +//----------------------------------------------------------------------- + +// 生成预览文件 +int DataFileDst::createPreviewImage(QImage * pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + if(reDraw == 0)//图片存在则不重画 + { + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + int width, height; + if (pImg == NULL) + { + width = DST_PREVIEW_WIDTH; + height = DST_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + if (width <= DST_PREVIEW_SIDE*2 || height <= DST_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + // 图形 + //qDebug()<<"convertDataToAbs defore"; + convertDataToAbs(); // 转换为绝对坐标数据 + //qDebug()<<"convertDataToAbs end"; + + // absdat数据 + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("2 data less then head size"); + return -1; + } + DataDs16FileHead * pAbsHead = (DataDs16FileHead *)(m_embAbsData.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //-------- + + // 图形显示区域 + int dpminx = DST_PREVIEW_SIDE; + int dpmaxx = width - DST_PREVIEW_SIDE; + int dpminy = DST_PREVIEW_SIDE; + int dpmaxy = height - DST_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(fabs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按x计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + // 显示花样图形 + u8 ctrlByte; + int dx; + int dy; + + double datposx, datposy; + int curx, cury, prex, prey; + + datposx = pAbsHead->beginX; + datposy = pAbsHead->beginY; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (DST_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (DST_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + absDataPtr = pData; + + QColor embcolor = QColor(Qt::green); + pen.setColor(embcolor); + painter.setPen(pen); + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + ctrlByte = absDataPtr->ctrl; + + if ( ctrlByte == DATA_SEWING || + 0 ) + { + prex = curx; + prey = cury; + + dx = absDataPtr->ax; + dy = absDataPtr->ay; + + datposx = dx; + datposy = dy; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (DST_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (DST_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + if(i != 0) + { + painter.drawLine(prex, prey, curx, cury); + } + } + + + //如果连续两步都是跳针,则过滤掉 + else if (ctrlByte == DATA_OFFSET) + { + DsAbsItem * JumpAbsDataPtr = pData; + JumpAbsDataPtr = absDataPtr - 1; + u8 beforectrlByte = JumpAbsDataPtr->ctrl; + + JumpAbsDataPtr = absDataPtr + 2; + u8 nextctrlByte = JumpAbsDataPtr->ctrl; + + prex = curx; + prey = cury; + + dx = absDataPtr->ax; + dy = absDataPtr->ay; + + datposx = dx; + datposy = dy; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (DST_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (DST_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + pen.setColor(embcolor); + painter.setPen(pen); + + if(beforectrlByte == DATA_OFFSET || nextctrlByte == DATA_OFFSET) + { + //该针上下两针都是跳针则不画线 + } + else + { + if(i != 0) + { + painter.drawLine(prex, prey, curx, cury); + } + } + } + + absDataPtr++; + } + + // 保存成文件 + QString preview = getFileFullPathName(); + if (saveflag != 0 && preview.isEmpty() == false) + { +#if (1) + preview += ".preview.png"; + pImage->save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +#define EMB_DST_DAT_DIRX (-1) // X向DST数据坐标和绝对数据坐标的差异 +#define EMB_DST_DAT_DIRY (1) // Y向DST数据坐标和绝对数据坐标的差异 + +// 针步转换 +int DataFileDst::changeDstStep(DstStep * pDststep, Ds4Item & ds4step) +{ + int dx, dy; + u8 c1, c2, c3; + u8 ctrl, attr; + + if (pDststep == NULL) + { + return -1; + } + + c1 = pDststep->c1; + c2 = pDststep->c2; + c3 = pDststep->c3; + + dx = 0; + dy = 0; + + if ((c1&0x08) != 0) { dx -= 9; } + if ((c1&0x04) != 0) { dx += 9; } + if ((c1&0x02) != 0) { dx -= 1; } + if ((c1&0x01) != 0) { dx += 1; } + if ((c2&0x08) != 0) { dx -= 27; } + if ((c2&0x04) != 0) { dx += 27; } + if ((c2&0x02) != 0) { dx -= 3; } + if ((c2&0x01) != 0) { dx += 3; } + if ((c3&0x08) != 0) { dx -= 81; } + if ((c3&0x04) != 0) { dx += 81; } + + if ((c1&0x10) != 0) { dy -= 9; } + if ((c1&0x20) != 0) { dy += 9; } + if ((c1&0x40) != 0) { dy -= 1; } + if ((c1&0x80) != 0) { dy += 1; } + if ((c2&0x10) != 0) { dy -= 27; } + if ((c2&0x20) != 0) { dy += 27; } + if ((c2&0x40) != 0) { dy -= 3; } + if ((c2&0x80) != 0) { dy += 3; } + if ((c3&0x10) != 0) { dy -= 81; } + if ((c3&0x20) != 0) { dy += 81; } + + if (c3 == 0xF3 && dx == 0 && dy == 0) + { + ctrl = DATA_END; // 结束 + } + else if ((c3&0xc3) == 0x03) // 运针 + { + ctrl = DATA_SEWING; + } + else if ((c3&0xc3) == 0x83) // 偏移 + { + ctrl = DATA_OFFSET; + } + else if ((c3&0xc3) == 0xC3) // 换色 + { + ctrl = DATA_CHGND; + } + else if ((c3&0xc3) == 0x43) // 开关亮片码 + { + qDebug("Sequin switch, not support, c1=0x%x, c2=0x%x, c3=0x%x", c1, c2, c3); // 不合法的DST + return -2; + } + else + { + qDebug("not know dst step, c1=0x%x, c2=0x%x, c3=0x%x", c1, c2, c3); // 不合法的DST + return -3; + } + + // 添加针步 + attr = 0; + + dx *= EMB_DST_DAT_DIRX; // X向显示坐标和数据坐标的差异 + dy *= EMB_DST_DAT_DIRY; // Y向显示坐标和数据坐标的差异 + + if (dx < 0) { attr |= 0x80; } + if (dy < 0) { attr |= 0x40; } + + ds4step.ctrl = ctrl; + ds4step.attr = attr; + ds4step.dx = abs(dx); + ds4step.dy = abs(dy); + + return 0; +} diff --git a/datafile/datafiledst.h b/datafile/datafiledst.h new file mode 100644 index 0000000..8448ce8 --- /dev/null +++ b/datafile/datafiledst.h @@ -0,0 +1,163 @@ +#ifndef DATAFILEDST_H +#define DATAFILEDST_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "math.h" +#include + +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" +#include "datafile/dataoperat.h" +#include "main.h" + +#define DATAFACTOR 10 //dst绝对坐标数据转换为ds16前需要扩大10倍 + +#define DST_EMB_DATADIRX (-1) // X向数据坐标与下位机坐标系统的差异 +#define DST_EMB_DATADIRY (1) // Y向数据坐标与下位机坐标系统的差异 + +#define DST_SHOWDIRX (-1) // X向显示坐标和数据坐标的差异 +#define DST_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异 + +#define DST_PREVIEW_SIDE (15) // 留边大小 +#define DST_PREVIEW_WIDTH (156) // 默认预览图区域宽度 +#define DST_PREVIEW_HEIGHT (164) // 默认预览图区域高度 + +// dst文件头 +#pragma pack(1)//设定为1字节对齐 +struct DstHead +{ +// 0 + char la[20]; + char st[11]; + char co[7]; + char xp[9]; + char xn[9]; + char yp[9]; + char yn[9]; + char ax[10]; + char ay[10]; + char mx[10]; + char my[10]; + char pd[10]; + char sub; + char reserved1[3]; + +// 128 + u8 rotateStyle; //旋转式样 + u8 horizontalStyle; //水平翻转式样 + u8 verticalStyle; //垂直翻转式样 + u8 rotateAngle; //旋转角度 + u8 reinMode; //加固方式 + u8 reinNeedles; //针数 + u8 reinNum; //次数 + s16 normalStep; //针步大小 + s16 angleCorrOffset; //角度修正量 + s16 angleCorrPosX; //角度修正量X正 + s16 angleCorrPosY; //角度修正量Y正 + s16 angleCorrNegX; //角度修正量X负 + s16 angleCorrNegY; //角度修正量Y负 + int scanX; //X向宽度 + int scanY; //Y向高度 + int left; //左边 + int front; //前边 + + // 163 + u8 rotation; //旋转角度调整 + u8 reserved2[256-164]; //BYTE + +// 256 + s16 reserved3; + +// 258 + int anchorX; //定位点 + int anchorY; + +// 266 + s32 startX; //起始点 + s32 startY; + +// 274 + u8 reserved4[512-274]; //BYTE // 保留字节 +}; +#pragma pack(1)//恢复对齐状态 + + +// 针步数据 +typedef struct strDstStep +{ + u8 c1; ////BYTE + u8 c2; ////BYTE + u8 c3; ////BYTE +}__attribute__ ((packed)) DstStep; + + +class DataFileDst +{ +public: + DataFileDst(); + DataFileDst(const QString & fullPathName); + ~DataFileDst(); + +public: + void initFile(const QString & fullPathName); + int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + void convertDataToAbs(int scanX = 0,int scanY = 0); // 转换为绝对坐标数据 + void writePointToFile(int x, int y, int flag);//写入起始点到文件中 + void writeStartPointToFile(int x, int y); + void writeAnchorPointToFile(int x, int y); + void writeFileLL(int Left, int front);//写入左边前边到文件 + void writePatternParaToFile(DstHead *head);//将花样参数配置写到文件中 + void writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY); + int checkDstFile();//检查dst文件是否正确 + DstHead * getDstHead(); + void moveDataBeginPonit(s32 left, s32 front);//移动数据起始点 +public: + void clear(); + void loadFile(); + void saveFile(); + inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称 + inline QByteArray & getFileData() {return m_fileData;} // 得到文件数据 + inline QByteArray & getEmbAbsData() {return m_embAbsData;} // 得到转换后的数据 + QString getFileFullPath(); // 文件所在目录 + QString getFileFullName(); // 文件名称(包括扩展名) + QString getFileName(); // 文件名称(不包括扩展名) + QString getFileSuffix(); // 文件扩展名 + + int getStitchNums();//得到数据的针数 + int getFileid();//得到fileid + int getDatWidth();//得到数据的图形宽度 + int getDatHeight();//得到数据的图形高度 + int getMaxX();//得到数据最大X+ + int getMinX();//得到数据最小X- + int getMaxY();//得到数据最大Y+ + int getMinY();//得到数据最小Y- + int getBeginXYAndAnchorXY(int &beginX, int &beginY, int &anchorX, int &anchorY); + const QPoint& getFirstPoint(); +protected: + QString m_fileFullPathName; // 文件路径 + QByteArray m_embAbsData; // 转换后的绝对坐标数据 + +private: + QByteArray m_fileData;// 文件数据内容(原始数据) + QString m_fileName; // 文件路径 + QPoint m_firstPoint; //第一点相对左下角坐标 + +private: + double m_minX; + double m_maxX; + double m_minY; + double m_maxY; + +private: + int changeDstStep(DstStep * pDststep, Ds4Item & ds4step); + +}; + +#endif // DATAFILEDST_H diff --git a/datafile/datafilequi.cpp b/datafile/datafilequi.cpp new file mode 100644 index 0000000..84ef2f5 --- /dev/null +++ b/datafile/datafilequi.cpp @@ -0,0 +1,1317 @@ +#include "datafilequi.h" + + +DataFileQui::DataFileQui() +{ + clear(); +} + +DataFileQui::DataFileQui(const QString &fullPathName) +{ + initFile(fullPathName); + loadFile(); + convertDataToEmbAbs(); +} + +void DataFileQui::convertDataToEmbAbs(s16 flag) +{ + m_absData.clear(); + getQuiMinMax(); + + QuiFileHead head; + memcpy(&head, m_quiFileData.data(), sizeof(QuiFileHead)); + double unitmuti = getMutiUnit(head.unit); + double left = head.left * unitmuti; // 左边 + double front = head.front * unitmuti; // 前边 + double scanx = head.scanX * unitmuti; // 宽度 + double scany = head.scanY * unitmuti; // 长度 + + // 图形数据 + int sewingflag = 0; + BYTE ch1, ch2; + WORD tmpls,lsdata; + double deltx1, delty1, deltx2, delty2; + double threex[4], threey[4]; + s16 nmstep; + double factorx, factory; + + if (scanx < 1) + { + scanx = m_maxX-m_minX; + } + + if (scany < 1) + { + scany = m_maxY-m_minY; + } + + // 计算缩放系数 + if(scanx == 0) + { + factorx = 1; + } + else + { + factorx = (double)((m_maxX-m_minX) / (scanx)); + } + + if(scany == 0) + { + factory = 1; + } + else + { + factory = (double)((m_maxY-m_minY) / (scany)); + } + + if(factorx == 0){factorx = 1;} + if(factory == 0){factory = 1;} + +//个别小圆的图形预览图,绘制的小圆是直线,注释掉下面两行代码就好了,但是有的图形注释掉可能又不对,后续可能需要改进 + if(flag != 1) + { +// factorx = 1; +// factory = 1; + } + + nmstep = head.normalStep * unitmuti; + if(nmstep == 0) + { + nmstep = 200; //单位0.01mm(2mm) + } + //nmstep = 20; + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + //将第一个点加进来 + absItem.ctrl = m_firstPoint.ctrl; + absItem.ax = m_firstPoint.x / factorx; + absItem.ay = m_firstPoint.y / factory; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + + if (m_firstPoint.ctrl == DATA_SEWING) + { + sewingflag = 1; + } + + int i = sizeof(QuiFileHead); + int datasize = m_quiFileData.size(); + int idx; + // 根据QUI图元生成abs数据 + while(i < datasize) + { + // 图元类型 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + tmpls = (unsigned short) (ch2 * 256) + ch1; + + if(tmpls == 0xffff) // 结束 + { + break; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线 + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + //增加剪线 + if(tmpls == QUI_TYPE_STEP || tmpls == QUI_TYPE_HSTEP) + { + if(sewingflag == 1 && (u32)m_absData.size() >= sizeof(DsAbsItem)) + { + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_CUTTRD; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + sewingflag = 0; + } + else + { + sewingflag = 1; + } + + // 点个数 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + lsdata = (unsigned short)ch2 * 256 + ch1; + + if (lsdata > 1) + { + // 第一个点 + if (i >= datasize){break;} + BYTE ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + BYTE ch2 = m_quiFileData.at(i++); + deltx2 = (ch2 * 256.0 + ch1)/factorx; + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + delty2 = (ch2 * 256.0 + ch1)/factory; + + for(idx = 1; idx < lsdata; idx++) // 其余的点 + { + deltx1 = deltx2; + delty1 = delty2; + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + deltx2 = (ch2 * 256.0 + ch1)/factorx; + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + delty2 = (ch2 * 256.0 + ch1)/factory; + + // 处理直线 + calcLine(deltx1, delty1, deltx2, delty2, nmstep, m_absData, tmpls); + } + if (idx != lsdata) + { + break; + } + } + break; + } + case QUI_TYPE_ARC: // 三点圆弧 + { + sewingflag = 1; + for (idx = 0; idx < 3; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1)/factorx; + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1)/factory; + } + + calcCurve(threex, threey, nmstep, m_absData); + + if (idx != 3) + { + break; + } + break; + } + case QUI_TYPE_BES: // 贝塞尔曲线 + { + sewingflag = 1; + for (idx = 0; idx < 4; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1)/factorx; + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1)/factory; + } + + // 处理贝塞尔曲线 + QList splineListXY;//拟合后的点 + splineListXY.clear(); + getBezierPointList(threex, threey, nmstep,splineListXY); + + QList splitListXY;//均分后的点 + splitListXY.clear(); + if(splineListXY.size() > 0) + { + getCurvePointFillLine(splineListXY,nmstep,splitListXY,0,OBJECT_STITCHLEN_NEW_SAMALL); + } + + //添加贝塞尔曲线数据点 + for(int i = 0; i < splitListXY.size(); i++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + + deltx1 = splitListXY[i].x(); + delty1 = splitListXY[i].y(); + + absItem.ctrl = DATA_SEWING; + absItem.ax = deltx1; + absItem.ay = delty1; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + + if (idx != 4) + { + break; + } + break; + } + default: + break; + } + } + + //生成绝对坐标数据的文件头 + creatAbsHeadAndAr(left, front); +} + +// 生成abs文件头 +void DataFileQui::creatAbsHeadAndAr(double left, double front) +{ + if(left == 0 || front == 0){}//为了去掉编译警告 + + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + int stepSize = m_absData.size()/sizeof(DsAbsItem); + if(stepSize <= 0) + { + return; + } + + DsAbsItem * absDataPtr = (DsAbsItem *)(m_absData.data()); + + double minX, maxX, minY, maxY; + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + double prex,prey,curx,cury,dx,dy,ar; + prex = prey = curx = cury = dx = dy = ar = 0; + + // 求最大最小值 + for (int i = 0; i < stepSize; i++) + { + absDataPtr->ax *= QUI_DATADIRX; + absDataPtr->ay *= QUI_DATADIRY; + + if(0 == i) + { + m_firstAbsolutePoint.setX(absDataPtr->ax); + m_firstAbsolutePoint.setY(absDataPtr->ay); + } + + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + if(curx > maxX) + { + maxX = curx; + } + if(curx < minX) + { + minX = curx; + } + + if(cury > maxY) + { + maxY = cury; + } + if(cury < minY) + { + minY = cury; + } + absDataPtr++; + } + + // 计算 ar + prex = absDataPtr->ax; //起始点 + prey = absDataPtr->ay; + absDataPtr = (DsAbsItem *)(m_absData.data()); + + for (int i = 0; i < stepSize; i++) + { + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + dx = curx - prex; + dy = cury - prey; + + double tar = atan2(dy,dx); + if(dx < 1e-6 && dy < 1e-6)//接近于0 + { + tar = 0; + } + + ar = (tar*10000+0.5*(tar>0?1:-1)); + absDataPtr->ar = ar; + + prex = curx; + prey = cury; + absDataPtr++; + } + + m_minX = minX; + m_maxX = maxX; + m_minY = minY; + m_maxY = maxY; + + // 增加结束码 + if((u32)m_absData.size() >= sizeof(DsAbsItem)) + { + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_NULL; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + stepSize++; + } + + //生成文件头 + dhead.maxX = maxX; + dhead.maxY = maxY; + dhead.minX = minX; + dhead.minY = minY; + + dhead.beginX = m_firstAbsolutePoint.x(); + dhead.beginY = m_firstAbsolutePoint.y(); + dhead.beginR = 0; + + dhead.anchorX = 0; + dhead.anchorY = 0; + dhead.itemNums = stepSize; + dhead.dataSize = stepSize*sizeof(DsAbsItem); // 数据字节数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.dataChecksum = calcCheckSum32((u8 *)(m_absData.data()), dhead.dataSize);; // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + dhead.fileid = dhead.checkCrc; + m_absData.insert(0,(char*)&dhead,sizeof(DataDs16FileHead)); +} + +void DataFileQui::getQuiMinMax() +{ + QuiFileHead head; + memcpy(&head, m_quiFileData.data(), sizeof(QuiFileHead)); + + int i, idx, datasize; + unsigned char ch1, ch2; + unsigned short tmpls, lsdata; + double deltx, delty; + double threex[4], threey[4]; + + int first = 0; + double minx, maxx, miny, maxy; + + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + i = sizeof(QuiFileHead); + datasize = m_quiFileData.size(); + while(i < datasize) + { + // 图元类型 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + tmpls = (unsigned short) (ch2 * 256) + ch1; + + if(tmpls == 0xffff) // 结束 + { + break; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线(折线) + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + // 点个数 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + lsdata = (unsigned short)ch2 * 256 + ch1; + + if (lsdata > 1) + { + for(idx = 0; idx < lsdata; idx++) // 点 + { + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + deltx = (ch2 * 256.0 + ch1); + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + delty = (ch2 * 256.0 + ch1); + + if (first == 0) + { + m_firstPoint.x = deltx; + m_firstPoint.y = delty; + if(tmpls == QUI_TYPE_LINE) + { + m_firstPoint.ctrl = DATA_SEWING; + } + else + { + m_firstPoint.ctrl = DATA_OFFSET; + } + first = 1; + } + + if(deltx > maxx) + { + maxx = deltx; + } + if(deltx < minx) + { + minx = deltx; + } + + if(delty > maxy) + { + maxy = delty; + } + if(delty < miny) + { + miny = delty; + } + } + if (idx != lsdata) + { + break; + } + } + } + break; + case QUI_TYPE_ARC: // 三点圆弧 + { + for (idx = 0; idx < 3; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1); + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1); + + if (first == 0) + { + m_firstPoint.x = threex[0]; + m_firstPoint.y = threey[0]; + m_firstPoint.ctrl = DATA_SEWING; + first = 1; + } + } + if (idx != 3) + { + break; + } + + if(isThreePointOnALine(threex, threey) >= 1) // 3点共线 + { + // printf("three point on a line\n"); + if(threex[0] > maxx) maxx = threex[0]; + if(threex[1] > maxx) maxx = threex[1]; + if(threex[2] > maxx) maxx = threex[2]; + if(threex[0] < minx) minx = threex[0]; + if(threex[1] < minx) minx = threex[1]; + if(threex[2] < minx) minx = threex[2]; + + if(threey[0] > maxy) maxy = threey[0]; + if(threey[1] > maxy) maxy = threey[1]; + if(threey[2] > maxy) maxy = threey[2]; + if(threey[0] < miny) miny = threey[0]; + if(threey[1] < miny) miny = threey[1]; + if(threey[2] < miny) miny = threey[2]; + } + else + { + // printf("before GetArcMinMax\n"); + // printf("minx=%.2f,maxx=%.2f,miny=%.2f,maxy=%.2f\n", minx, maxx, miny, maxy); + getArcMinMax(threex, threey, &minx, &maxx, &miny, &maxy); + // printf("after GetArcMinMax\n"); + // printf("minx=%.2f,maxx=%.2f,miny=%.2f,maxy=%.2f\n", minx, maxx, miny, maxy); + } + } + break; + case QUI_TYPE_BES: // 贝塞尔曲线 + { + for (idx = 0; idx < 4; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1); + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1); + + if (first == 0) + { + m_firstPoint.x = threex[0]; + m_firstPoint.y = threey[0]; + m_firstPoint.ctrl = DATA_SEWING; + first = 1; + } + } + if (idx != 4) + { + break; + } + + getBezierMinMax(threex, threey, &minx, &maxx, &miny, &maxy); + } + break; + } + } + + if (first == 0) + { + minx = 0; + maxx = 0; + miny = 0; + maxy = 0; + + m_firstPoint.x = 0; + m_firstPoint.y = 0; + m_firstPoint.ctrl = 0; + } + + m_minX = minx; + m_maxX = maxx; + m_minY = miny; + m_maxY = maxy; + + return; +} + +void DataFileQui::writeFileLL(int left, int front, int startX, int startY) +{ + QuiFileHead *pQuiHead = getQuiHead(); + left /= 100; + front /= 100; + + if(left < 0) + { + left = 0; + } + if(front < 0) + { + front = 0; + } + + pQuiHead->left = left; + pQuiHead->front = front; + + pQuiHead->startX = startX; + pQuiHead->startY = startY; + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_quiFileData); + wfile.close(); + +#ifdef Q_OS_LINUX + system("sync"); +#endif +} + +const QPoint DataFileQui::getFirstPoint() +{ + return m_firstAbsolutePoint; +} + +int DataFileQui::checkFileHead() +{ + if (m_quiFileData.size() >= (int)sizeof(QuiFileHead)) + { + QuiFileHead * pHead; + pHead = (QuiFileHead *)(m_quiFileData.data()); + + if (pHead->normalStep < 1) + { + pHead->normalStep = 40; + } + + if (pHead->miniStep < 1) + { + pHead->miniStep = 40; + } + + if (pHead->scanX < 1) + { + pHead->scanX = m_maxX - m_minX; + } + + if (pHead->scanY < 1) + { + pHead->scanY = m_maxY - m_minY; + } + + QFile wrfile(m_fileFullPathName); + if(!wrfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + return -1; + } + else + { + wrfile.write(m_quiFileData); + wrfile.close(); + } + } + + return 0; +} + +double DataFileQui::getMutiUnit(int unit) +{ + double unitmuti; + if (unit == 0x00) // 0x00: 0.1mm; + { + unitmuti = 10; + } + else if (unit == 0x01) // 0x01: 1/1000inch; + { + unitmuti = 2.54; + } + else if (unit == 0x02) // 0x02: 0.04mm + { + //unitmuti = 10; + unitmuti = 10; + } + else + { + unitmuti = 1; + } + return unitmuti; +} + +void DataFileQui::initFile(const QString &fullPathName) +{ + clear(); + QFileInfo file(fullPathName); + if (file.exists() && file.isFile()) + { + m_fileFullPathName = fullPathName; + } + else + { + qDebug() << "Init file failed path =" << m_fileFullPathName; + } + loadFile(); +} + +void DataFileQui::clear() +{ + m_firstPoint.x = 0; + m_firstPoint.y = 0; + m_firstPoint.ctrl = 0; + + m_minX = INT32_MAX; + m_maxX = INT32_MIN; + m_minY = INT32_MAX; + m_maxY = INT32_MIN; + + m_fileFullPathName.clear(); // 文件路径 + m_quiFileData.clear(); // 文件数据内容 + m_absData.clear(); // 转换后的数据 +} + +void DataFileQui::loadFile() +{ + QFile rdfile(m_fileFullPathName); + if(!rdfile.open(QIODevice::ReadOnly)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + m_quiFileData = rdfile.readAll(); + rdfile.close(); +} + +int DataFileQui::createPreviewImage(QImage *pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + s16 existFlag = 1; + + if(reDraw == 0)//图片存在则不重画 + { + existFlag = 0; + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + int width, height; + if (pImg == NULL) + { + width = QUI_PREVIEW_WIDTH; + height = QUI_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + if (width <= QUI_PREVIEW_SIDE*2 || height <= QUI_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + // 图形 + //qDebug()<<"convertDataToAbs defore"; + convertDataToEmbAbs(existFlag); // 转换为绝对坐标数据 + //qDebug()<<"convertDataToAbs end"; + + // absdat数据 + int size = m_absData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("2 data less then head size"); + return -1; + } + DataDs16FileHead * pAbsHead = (DataDs16FileHead *)(m_absData.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(m_absData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //-------- + + // 图形显示区域 + int dpminx = QUI_PREVIEW_SIDE; + int dpmaxx = width - QUI_PREVIEW_SIDE; + int dpminy = QUI_PREVIEW_SIDE; + int dpmaxy = height - QUI_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(fabs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按y计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + //计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + double dpx = (double)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + double dpy = (double)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + +// // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形左下角) +// double dpx = (double)(dpminx - (m_minX / factor)); +// double dpy = (double)(dpminy - (m_minY / factor)); + + // 显示花样图形 + u8 ctrlByte; + double dx; + double dy; + + double datposx, datposy; + double curx, cury, prex, prey; + + datposx = pAbsHead->beginX; + datposy = pAbsHead->beginY; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (QUI_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (QUI_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + absDataPtr = pData; + + QColor color = QColor(Qt::green); + pen.setColor(color); + painter.setPen(pen); + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + ctrlByte = absDataPtr->ctrl; + + prex = curx; + prey = cury; + + dx = absDataPtr->ax; + dy = absDataPtr->ay; + + datposx = dx; + datposy = dy; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (QUI_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (QUI_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + if(i == 0) + { + absDataPtr++; + continue; + } + + if (ctrlByte == DATA_SEWING) + { + QPointF p1(prex, prey); + QPointF p2(curx, cury); + //qDebug()<<"p1"<save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +QuiFileHead *DataFileQui::getQuiHead() +{ + if(m_quiFileData.size() <= 0) + { + loadFile(); + } + + QuiFileHead *head = NULL; + + int size = m_quiFileData.size(); + + if (size <= (int)(sizeof(QuiFileHead))) + { + head = new QuiFileHead; + memset(head,0,sizeof(QuiFileHead)); + return head; + } + + head = (QuiFileHead *)(m_quiFileData.data()); + return head; +} + +void DataFileQui::writePatternParaToFile(QuiFileHead *head) +{ + if(m_quiFileData.size() <= 0) + { + return; + } + + memcpy(m_quiFileData.data(),(char*)head,sizeof(QuiFileHead)); + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_quiFileData); + wfile.close(); +} + +void DataFileQui::moveDataBeginPonit(s32 left, s32 front) +{ + if((u32)m_absData.size() > sizeof(DataDs16FileHead)) + { + DataDs16FileHead *dhead = (DataDs16FileHead *)( m_absData.data()); + dhead->beginX += left; + dhead->beginY += front; + dhead->maxX += left; + dhead->minX += left; + dhead->maxY += front; + dhead->minY += front; + } +} + +void DataFileQui::creatDrawData(s32 scanX,s32 scanY,double sizeX,double sizeY, + int &maxX, int &minX, int &maxY, int &minY, int &pointsNum) +{ + getQuiMinMax(); + maxX = m_maxX; + minX = m_minX; + maxY = m_maxY; + minY = m_minY; + + // 图形数据 + BYTE ch1, ch2; + WORD tmpls,lsdata; + double deltx2, delty2; + double threex[4], threey[4]; + double factorx, factory; + + // 计算缩放系数 + if(scanX == 0) + { + factorx = 1; + } + else + { + factorx = (double)((m_maxX-m_minX) / (scanX)); + } + + if(scanY == 0) + { + factory = 1; + } + else + { + factory = (double)((m_maxY-m_minY) / (scanY)); + } + + drawItem item; + item.type = -1; + item.points.clear(); + + int i = sizeof(QuiFileHead); + int datasize = m_quiFileData.size(); + int idx; + // 根据QUI图元生成abs数据 + while(i < datasize) + { + // 图元类型 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + tmpls = (unsigned short) (ch2 * 256) + ch1; + + if(item.points.size() > 0 && item.type != -1) + { + m_drawItemLists.append(item); + } + + item.type = tmpls; + item.points.clear(); + + if(tmpls == 0xffff) // 结束 + { + break; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线 + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + // 点个数 + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + lsdata = (unsigned short)ch2 * 256 + ch1; + pointsNum += lsdata; + + if (lsdata > 1) + { + // 第一个点 + if (i >= datasize){break;} + BYTE ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + BYTE ch2 = m_quiFileData.at(i++); + deltx2 = (ch2 * 256.0 + ch1)/factorx; + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + delty2 = (ch2 * 256.0 + ch1)/factory; + + item.points.append(QPointF(deltx2,delty2)); + + for(idx = 1; idx < lsdata; idx++) // 其余的点 + { + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + deltx2 = (ch2 * 256.0 + ch1)/factorx; + + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + delty2 = (ch2 * 256.0 + ch1)/factory; + + item.points.append(QPointF(deltx2,delty2)); + } + if (idx != lsdata) + { + break; + } + } + break; + } + case QUI_TYPE_ARC: // 三点圆弧 + { + for (idx = 0; idx < 3; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1)/factorx; + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1)/factory; + + item.points.append(QPointF(threex[idx],threey[idx])); + } + + if (idx != 3) + { + break; + } + pointsNum += 3; + break; + } + case QUI_TYPE_BES: // 贝塞尔曲线 + { + for (idx = 0; idx < 4; idx++) + { + // 点x + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threex[idx] = (ch2 * 256.0 + ch1)/factorx; + + // 点y + if (i >= datasize){break;} + ch1 = m_quiFileData.at(i++); + if (i >= datasize){break;} + ch2 = m_quiFileData.at(i++); + threey[idx] = (ch2 * 256.0 + ch1)/factory; + + item.points.append(QPointF(threex[idx],threey[idx])); + } + + if (idx != 4) + { + break; + } + pointsNum += 4; + break; + } + default: + break; + } + } + + double unit = 100.0;//数据是0.01毫米 + + int dpx = (sizeX)/2.0; + int dpy = (sizeY)/2.0; + + if(m_drawItemLists.size() <= 0) + { + return; + } + + double firstx,firsty; + firstx = firsty = 0; + if(m_drawItemLists[0].points.size() > 0) + { + firstx = m_drawItemLists[0].points[0].x(); + firsty = m_drawItemLists[0].points[0].y(); + } + + for(int i = 0; i < m_drawItemLists.size(); i++) + { + for(int j = 0; j < m_drawItemLists[i].points.size(); j++) + { + m_drawItemLists[i].points[j].setX((m_drawItemLists[i].points[j].x()-firstx)/unit+dpx); + m_drawItemLists[i].points[j].setY((m_drawItemLists[i].points[j].y()-firsty)/unit*QUI_SHOWDIRY+dpy); + } + } +} + +int DataFileQui::getStitchNums() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->itemNums; +} + +int DataFileQui::getDatWidth() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return (pHead->maxX - pHead->minX); +} + +int DataFileQui::getDatHeight() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return (pHead->maxY - pHead->minY); +} + +int DataFileQui::getMaxX() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->maxX; +} + +int DataFileQui::getMinX() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->minX; +} + +int DataFileQui::getMaxY() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->maxY; +} + +int DataFileQui::getMinY() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->minY; +} diff --git a/datafile/datafilequi.h b/datafile/datafilequi.h new file mode 100644 index 0000000..1a72925 --- /dev/null +++ b/datafile/datafilequi.h @@ -0,0 +1,155 @@ +#ifndef DATAFILEQUI_H +#define DATAFILEQUI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "math.h" +#include +#include "stdint.h" + +//#include "vectorsqrt.h" +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" +#include "datafile/dataoperat.h" +#include "main.h" + +#define QUI_DATADIRX (1) // X向数据坐标与下位机坐标系统的差异 +#define QUI_DATADIRY (1) // Y向数据坐标与下位机坐标系统的差异 +#define QUI_DATADIRR (-1) // R向数据坐标与下位机坐标系统的差异 + +#define QUI_SHOWDIRX (1) // X向显示坐标和数据坐标的差异 +#define QUI_SHOWDIRY (-1) // Y向显示坐标和数据坐标的差异 + +#define QUI_PREVIEW_SIDE (15) // 留边大小 +#define QUI_PREVIEW_WIDTH (156) // 默认预览图区域宽度 +#define QUI_PREVIEW_HEIGHT (164) // 默认预览图区域高度 + +#pragma pack(1)//设定为1字节对齐 + +typedef struct tagQuiltingFileHead +{ + char id[4]; // 0x00—0x03; 标志:=="RICH" + char name[8]; // 0x04—0x07; 文件名 + unsigned char reserve1[4]; // 0x0C—0x0F; 保留 + unsigned char ver; // 0x10; 版本号 + unsigned char unit; // 0x11; 单位 0x00: 0.1mm; 0x01: 1/1000inch; 0x02: 0.04mm;0x03: 0.01mm + unsigned char type; // 0x12; 类型, 0x00: 多针机英制; 0x01: 多针机公制; 0x10: 单头机英制; 0x11:单头机公制 + unsigned char reserve2[11]; // 0x13—0x1D; 保留 + unsigned short HStep; // 0x1E—0x1F; 水平方向针距 单位:0.1mm(绘制用,多针机) + unsigned short leftRightLen; // 0x20—0x21; 左针右针距离 单位:0.1mm(绘制用,多针机) + unsigned short VStep12; // 0x22—0x23; 第1 2排针距 单位:0.1mm(绘制用,多针机) + unsigned short VStep23; // 0x24—0x25; 第2 3排针距 单位:0.1mm(绘制用,多针机) + + // 排针每个字节:XXXX XXXX + // 针位n (0x00:无针,0x01:右针, 0x10:左针,0x11:左右针) + unsigned char arrayNeedle1[48]; // 0x26—0x55; 第1排排针(绘制用,多针机) + unsigned char arrayNeedle2[48]; // 0x56—0x85; 第2排排针(绘制用,多针机) + unsigned char arrayNeedle3[48]; // 0x86—0xB5; 第3排排针(绘制用,多针机) + unsigned char rotateStyle; // 0xB6; 旋转式样 + unsigned char rotateAngle; // 0xB7; 旋转角度 + unsigned char reinMode; // 0xB8; 加固方式 + unsigned char reinNum; // 0xB9; 次数 + unsigned char uniScale; // 等比缩放 + unsigned char reserve3[3]; // 0xBB—0xBD; 保留 + unsigned short angleCorrOffset; // 0xBE ; 角度修正量 (中间数据后,可以修改,拐角补偿,单针机和多针机,新加-hhy) + char angleCorrPosX; // 0xC0 ; 角度修正x正(中间数据后,可以修改,拐角补偿,单针机和多针机) + char angleCorrPosY; // 0xC1 ; 角度修正y正(中间数据后,可以修改,拐角补偿,单针机和多针机) + char angleCorrNegX; // 0xC2 ; 角度修正x负(中间数据后,可以修改,拐角补偿,单针机和多针机) + char angleCorrNegY; // 0xC3 ; 角度修正y负(中间数据后,可以修改,拐角补偿,单针机和多针机) + unsigned char stepQui[2]; // 0xC4—0xC5; 跨步绗缝 + unsigned char reinNeedles; // 0xC6; 加固绗缝针数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机) + short int rollaYUpDn; // 0xC7; 罗拉补偿y上下(中间数据后,让图形闭合,可以修改,多针机) +// unsigned char rollaYRev; // 0xC8; 罗拉补偿y预留 + unsigned char normalStep; // 0xC9; 针步大小(中间数据前,可以修改,单针机和多针机) + unsigned char miniStep; // 0xCA; 最小针步 + unsigned char reserve4[4]; // 0xCB—0xCE; 保留 + unsigned char saddleRatio[2]; // 0xCF—0xD0; 鞍架比例 + unsigned char rollaRatio[2]; // 0xD1—0xD2; 罗拉比例 + unsigned char reinQuiNeedleHigh; // 0xD3; 加固绗缝针数高字节 + unsigned short left; // 0xD4—0xD5; 左边 (中间数据后,可以修改,改变起始点,单针机) + unsigned short front; // 0xD6—0xD7; 前边 (中间数据后,可以修改,改变起始点,单针机) + unsigned short scanX; // 0xD8—0xD9; 缩放X (中间数据前,可以修改,单针机和多针机) + unsigned short scanY; // 0xDA—0xDB; 缩放Y (中间数据前,可以修改,单针机和多针机) + unsigned short totalOutput; // 0xDC—0xDD; 本花样累计总产量 + unsigned short currentOutput; // 0xDE—0xDF; 本花样当次产量 + unsigned short serWorkLa; // 0xE0-0xE1; 连续作业前留边 + unsigned short serWorkLb; // 0xE2-0xE3; 连续作业后留边 + unsigned char stepCompUpDn; // 0xE4; 跨步补偿y上下(多针机专业)(中间数据后,可以修改,多针机) + int startX; //用于存放起始点 + int startY; + + unsigned char setNormalStep; // 0xED; 针步大小 + + short int rollaYUpDnXNeg; + short int rollaYUpDnXZero; + unsigned char reserve6[14]; // 0xEE—0xFF; 保留 + +} __attribute__ ((packed)) QuiFileHead; + + +class DataFileQui +{ +public: + DataFileQui(); + DataFileQui(const QString & fullPathName); + +protected: + QString m_fileFullPathName; // 文件路径 + QByteArray m_absData; // 转换后的绝对坐标数据 + QByteArray m_quiFileData;// 文件数据内容(原始数据) + QList m_drawItemLists; + +private: + double m_minX; + double m_maxX; + double m_minY; + double m_maxY; + QuiPoint m_firstPoint; //qui内部计算时使用 + QPoint m_firstAbsolutePoint; //第一针实际绝对坐标点 + +private: + void creatAbsHeadAndAr(double left, double front);//生成绝对坐标数据文件头及ar + int checkFileHead(); + double getMutiUnit(int unit); + +public: + void initFile(const QString & fullPathName); + void clear(); + void loadFile(); + void convertDataToEmbAbs(s16 flag = 1); + int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称 + inline QByteArray & getEmbAbsData() {return m_absData;} // 得到转换后的数据 + QuiFileHead *getQuiHead(); + void writePatternParaToFile(QuiFileHead *head);//将花样参数配置写到文件中 + void moveDataBeginPonit(s32 left, s32 front);//移动数据起始点 + void creatDrawData(s32 scanX,s32 scanY,double sizeX,double sizeY, + int &maxX, int &minX, int &maxY, int &minY, int &pointsNum);//创建绘制数据 + inline QList getDrawData() {return m_drawItemLists;} // 得到绘制数据 + +public: + int getStitchNums();//得到数据的针数 + int getDatWidth();//得到数据的图形宽度 + int getDatHeight();//得到数据的图形高度 + int getMaxX();//得到数据最大X+ + int getMinX();//得到数据最小X- + int getMaxY();//得到数据最大Y+ + int getMinY();//得到数据最小Y- + + inline int getDatMaxX(){return m_maxX;}//得到数据最大X+ + inline int getDatMinX(){return m_minX;}//得到数据最小X- + inline int getDatMaxY(){return m_maxY;}//得到数据最大Y+ + inline int getDatMinY(){return m_minY;}//得到数据最小Y- + + void getQuiMinMax(); + void writeFileLL(int left, int front, int startX, int startY); //写入左边前边 + const QPoint getFirstPoint(); +}; + +#endif // DATAFILEQUI_H diff --git a/datafile/datafilequix.cpp b/datafile/datafilequix.cpp new file mode 100644 index 0000000..b226403 --- /dev/null +++ b/datafile/datafilequix.cpp @@ -0,0 +1,2523 @@ +#include "datafilequix.h" + + +DataFileQuix::DataFileQuix() +{ + clear(); +} + +DataFileQuix::DataFileQuix(const QString &fullPathName) +{ + initFile(fullPathName); + loadFile(); + convertDataToEmbAbs(); +} + +void DataFileQuix::writeLeftFrontToFileDoubleHead(QString filePath,int left,int front) +{ + QFile rdfile(filePath); + if(!rdfile.open(QIODevice::ReadOnly)) + { + return; + } + + QByteArray fileData = rdfile.readAll(); + rdfile.close(); + + if(fileData.size() <= 0) + { + return; + } + + QuixFileHead * head = (QuixFileHead *)(fileData.data());//头文件的结构体 + head->left = left; + head->front = front; + + QFile wfile(filePath); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + return; + } + + wfile.write(fileData); + wfile.close(); + +#ifdef Q_OS_LINUX + system("sync"); +#endif +} + +void DataFileQuix::convertDataToEmbAbs(s16 flag) +{ + m_absData.clear(); + getQuixMinMax(); + + QuixFileHead head; + + // 图形数据 + u32 i, datasize, idx; + unsigned char ctrl, tmpls; + + u8 c1, c2, c3, c4; + u32 lsdata; + double deltx1, delty1, deltx2, delty2; + double threex[4], threey[4]; + s16 nmstep; + + double factorx, factory, unitmuti; + memcpy(&head, m_fileData.data(), sizeof(QuixFileHead)); + unitmuti = getMutiUnit(0); + + double scanx = head.scanX * unitmuti; // 宽度 + double scany = head.scanY * unitmuti; // 长度 + + if (scanx < 1) + { + scanx = 1; + } + if (scany < 1) + { + scany = 1; + } + + // 计算缩放系数 + factorx = (double)((m_maxX-m_minX) / (scanx)); + factory = (double)((m_maxY-m_minY) / (scany)); + + if(factorx == 0){factorx = 1;} + if(factory == 0){factory = 1;} + // factorx = 1; + // factory = 1; + + if(flag != 1) + { + factorx = 1; + factory = 1; + } + + nmstep = head.normalStep * unitmuti; + if(nmstep == 0) + { + nmstep = 200; //单位0.01mm(2mm) + } + + i = sizeof(QuixFileHead); + datasize = m_fileData.size(); + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + //将第一个点加进来 +// absItem.ctrl = m_firstPoint.ctrl; +// absItem.ax = m_firstPoint.x / factorx; +// absItem.ay = m_firstPoint.y / factory; +// m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + + while(i < datasize) + { + // 功能控制字 + if (i >= datasize){break;} + ctrl = m_fileData.at(i++); + + // 图元类型 + if (i >= datasize){break;} + tmpls = m_fileData.at(i++); + + // 附加控制字 + if (i >= datasize){break;} + m_fileData.at(i++); + if (i >= datasize){break;} + m_fileData.at(i++); + + if(ctrl == 0x00) // 结束 + { + break; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线 + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + //增加剪线 + if(tmpls == QUI_TYPE_STEP || tmpls == QUI_TYPE_HSTEP) + { + if((u32)m_absData.size() >= sizeof(DsAbsItem)) + { + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_CUTTRD; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if (lsdata > 1) + { + // 第一个点 + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx2 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty2 = y/factory; + + for(idx = 1; idx < lsdata; idx++) // 其余的点 + { + deltx1 = deltx2; + delty1 = delty2; + + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx2 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty2 = y/factory; + + // 处理直线 + calcLine(deltx1, delty1, deltx2, delty2, nmstep, m_absData, tmpls); + } + + if (idx != lsdata) + { + break; + } + } + break; + } + case QUI_TYPE_ARC: // 三点圆弧 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + if(lsdata != 3) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threex[idx] = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threey[idx] = y/factory; + } + + calcCurve(threex, threey, nmstep, m_absData); + + if (idx != 3) + { + break; + } + break; + } + case QUI_TYPE_BES: // 贝塞尔曲线 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + if(lsdata != 4) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threex[idx] = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threey[idx] = y/factory; + } + + // 处理贝塞尔曲线 + QList splineListXY;//拟合后的点 + splineListXY.clear(); + getBezierPointList(threex, threey, nmstep,splineListXY); + + QList splitListXY;//均分后的点 + splitListXY.clear(); + if(splineListXY.size() > 0) + { + getCurvePointFillLine(splineListXY,nmstep,splitListXY,0,OBJECT_STITCHLEN_NEW_SAMALL); + } + + //添加贝塞尔曲线数据点 + for(int i = 0; i < splitListXY.size(); i++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + + deltx1 = splitListXY[i].x(); + delty1 = splitListXY[i].y(); + + absItem.ctrl = DATA_SEWING; + absItem.ax = deltx1; + absItem.ay = delty1; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + //calcBezier(threex, threey, nmstep, m_absData); + + if (idx != 4) + { + break; + } + break; + } + case QUI_TYPE_SPLINE: // 样条 + { + QList quiListPoint;//样条拟合前的点集合 + quiListPoint.clear(); + + // 点个数 + if (i >= datasize){break;} + unsigned char c1 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c2 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c3 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + for(idx = 0; idx < lsdata; idx++) // 点 + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx1 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty1 = y/factory; + + QPointF point(deltx1,delty1); + quiListPoint.append(point); + } + + QList splineListXY;//拟合后的点 + splineListXY.clear(); + if(quiListPoint.size() <= 0) + { + break; + } + getSplineNew(quiListPoint,splineListXY); + + // 均分 + QList splitListXY;//均分后的点 + splitListXY.clear(); + if(splineListXY.size() > 0) + { + getCurvePointFillLine(splineListXY,nmstep,splitListXY,0,OBJECT_STITCHLEN_NEW_SAMALL); + } + + //添加样条曲线数据点 + for(int i = 0; i < splitListXY.size(); i++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + + deltx1 = splitListXY[i].x(); + delty1 = splitListXY[i].y(); + + absItem.ctrl = DATA_SEWING; + absItem.ax = deltx1; + absItem.ay = delty1; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + + if(idx != lsdata) + { + break; + } + break; + } + default: + break; + } + } + + //生成绝对坐标数据的文件头 + creatAbsHeadAndAr(); +} + +void DataFileQuix::creatAbsHeadAndAr() +{ + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + int stepSize = m_absData.size()/sizeof(DsAbsItem); + if(stepSize <= 0) + { + return; + } + + DsAbsItem * absDataPtr = (DsAbsItem *)(m_absData.data()); + + double minX, maxX, minY, maxY; + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + double curx,cury,dx,dy,ar; + curx = cury = dx = dy = ar = 0; + + //取反并求最大最小值 + for (int i = 0; i < stepSize; i++) + { + absDataPtr->ax *= QUIX_DATADIRX; + absDataPtr->ay *= QUIX_DATADIRY; + + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + if(curx > maxX) + { + maxX = curx; + } + if(curx < minX) + { + minX = curx; + } + + if(cury > maxY) + { + maxY = cury; + } + if(cury < minY) + { + minY = cury; + } + + absDataPtr++; + } + + absDataPtr = (DsAbsItem *)(m_absData.data()); + double begX = absDataPtr->ax;//起始点 + double begY = absDataPtr->ay; + int begR = 0; + + m_firstPoint.x = begX; + m_firstPoint.y = begY; + m_firstPoint.ctrl = absDataPtr->ctrl; + + //增加结束码 + if((u32)m_absData.size() >= sizeof(DsAbsItem)) + { + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_END; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + stepSize++; + } + + m_maxX = maxX; + m_minX = minX; + m_maxY = maxY; + m_minY = minY; + + //生成文件头 + dhead.maxX = maxX; + dhead.maxY = maxY; + dhead.minX = minX; + dhead.minY = minY; + dhead.beginX = begX; + dhead.beginY = begY; + dhead.beginR = begR; + dhead.anchorX = 0; + dhead.anchorY = 0; + dhead.itemNums = stepSize; + dhead.dataSize = stepSize*sizeof(DsAbsItem); // 数据字节数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.dataChecksum = calcCheckSum32((u8 *)(m_absData.data()) , dhead.dataSize);; // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + dhead.fileid = dhead.checkCrc; + m_absData.insert(0,(char*)&dhead,sizeof(DataDs16FileHead)); +} + +void DataFileQuix::getQuixMinMax() +{ + QuixFileHead head; + memcpy(&head, m_fileData.data(), sizeof(QuixFileHead)); + + u32 i, idx, datasize; + unsigned char ctrl, tmpls; + u8 c1, c2, c3, c4; + u32 lsdata; + double deltx, delty; + double threex[4], threey[4]; + + int first = 0; + double minx, maxx, miny, maxy; + + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + i = sizeof(QuixFileHead); + datasize = m_fileData.size(); + while(i < datasize) + { + // 功能控制字 + if (i >= datasize){break;} + ctrl = m_fileData.at(i++); + + // 图元类型 + if (i >= datasize){break;} + tmpls = m_fileData.at(i++); + + // 附加控制字1和2 + if (i >= datasize){break;} + m_fileData.at(i++); + if (i >= datasize){break;} + m_fileData.at(i++); + + if(ctrl == 0x00) // 结束 + { + break; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线(折线) + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if (lsdata > 1) + { + for(idx = 0; idx < lsdata; idx++) // 点 + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + deltx = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + delty = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if (first == 0) + { + m_firstPoint.x = deltx; + m_firstPoint.y = delty; + m_firstPoint.ctrl = ctrl; + first = 1; + } + + if(deltx > maxx) + { + maxx = deltx; + } + if(deltx < minx) + { + minx = deltx; + } + + if(delty > maxy) + { + maxy = delty; + } + if(delty < miny) + { + miny = delty; + } + } + + if (idx != lsdata) + { + break; + } + } + } + break; + case QUI_TYPE_ARC: // 三点圆弧 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if(lsdata != 3) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + threex[idx] = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + threey[idx] = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if (first == 0) + { + m_firstPoint.x = threex[0]; + m_firstPoint.y = threey[0]; + m_firstPoint.ctrl = ctrl; + first = 1; + } + } + if (idx != 3) + { + break; + } + } + break; + case QUI_TYPE_BES: // 贝塞尔曲线 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if(lsdata != 4) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + threex[idx] = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + threey[idx] = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if (first == 0) + { + m_firstPoint.x = threex[0]; + m_firstPoint.y = threey[0]; + m_firstPoint.ctrl = ctrl; + first = 1; + } + } + if (idx != 4) + { + break; + } + + getBezierMinMax(threex, threey, &minx, &maxx, &miny, &maxy); + } + break; + case QUI_TYPE_SPLINE: // 样条 + { + QList quiListPoint;//样条拟合前的点集合 + quiListPoint.clear(); + + // 点个数 + if (i >= datasize){break;} + unsigned char c1 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c2 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c3 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + for(idx = 0; idx < lsdata; idx++) // 点 + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + deltx = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + delty = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + QPointF point(deltx,delty); + quiListPoint.append(point); + + if (first == 0) + { + m_firstPoint.x = deltx; + m_firstPoint.y = delty; + m_firstPoint.ctrl = ctrl; + first = 1; + } + } + getSplineMinMax(quiListPoint, &minx, &maxx, &miny, &maxy); + } + break; + } + } + + if (first == 0) + { + minx = 0; + maxx = 0; + miny = 0; + maxy = 0; + + m_firstPoint.x = 0; + m_firstPoint.y = 0; + m_firstPoint.ctrl = 0; + } + + m_minX = minx; + m_maxX = maxx; + m_minY = miny; + m_maxY = maxy; + + return; +} + +const QPoint DataFileQuix::getFirstPoint() +{ + QPoint p(m_firstPoint.x,m_firstPoint.y); + return p; +} + +int DataFileQuix::checkFileHead() +{ + if (m_fileData.size() >= (int)sizeof(QuixFileHead)) + { + QuixFileHead * pHead; + pHead = (QuixFileHead *)(m_fileData.data()); + + if (pHead->normalStep < 1) + { + pHead->normalStep = 40; + } + + if (pHead->scanX < 1) + { + pHead->scanX = m_maxX - m_minX; + } + + if (pHead->scanY < 1) + { + pHead->scanY = m_maxY - m_minY; + } + + QFile wrfile(m_fileFullPathName); + if(!wrfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + return -1; + } + else + { + wrfile.write(m_fileData); + wrfile.close(); + } + } + + return 0; +} + +double DataFileQuix::getMutiUnit(int unit) +{ + double unitmuti; + if (unit == 0x00) // 0x00: 0.1mm; + { + unitmuti = 10; + } + else if (unit == 0x01) // 0x01: 1/1000inch; + { + unitmuti = 2.54; + } + else if (unit == 0x02) // 0x02: 0.04mm + { + unitmuti = 10; + } + else + { + unitmuti = 1; + } + return unitmuti; +} + +void DataFileQuix::initFile(const QString &fullPathName) +{ + clear(); + QFileInfo file(fullPathName); + if (file.exists() && file.isFile()) + { + m_fileFullPathName = fullPathName; + } + else + { + qDebug() << "Init file failed path =" << m_fileFullPathName; + } + loadFile(); +} + +void DataFileQuix::clear() +{ + m_firstPoint.x = 0; + m_firstPoint.y = 0; + m_firstPoint.ctrl = 0; + + m_firstPointLeft.x = 0; + m_firstPointLeft.y = 0; + m_firstPointLeft.ctrl = 0; + + m_firstPointRight.x = 0; + m_firstPointRight.y = 0; + m_firstPointRight.ctrl = 0; + + m_minX = INT32_MAX; + m_maxX = INT32_MIN; + m_minY = INT32_MAX; + m_maxY = INT32_MIN; + + m_fileFullPathName.clear(); // 文件路径 + m_fileData.clear(); // 文件数据内容 + m_absData.clear(); // 转换后的数据 +} + +void DataFileQuix::loadFile() +{ + QFile rdfile(m_fileFullPathName); + if(!rdfile.open(QIODevice::ReadOnly)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + m_fileData = rdfile.readAll(); + rdfile.close(); +} + +int DataFileQuix::createPreviewImage(QImage *pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + s16 existFlag = 1; + + if(reDraw == 0)//图片存在则不重画 + { + existFlag = 0; + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + int width, height; + if (pImg == NULL) + { + width = QUIX_PREVIEW_WIDTH; + height = QUIX_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + if (width <= QUIX_PREVIEW_SIDE*2 || height <= QUIX_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + // 图形 + //qDebug()<<"convertDataToAbs defore"; + convertDataToEmbAbs(existFlag); // 转换为绝对坐标数据 + //qDebug()<<"convertDataToAbs end"; + + // absdat数据 + int size = m_absData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("2 data less then head size"); + return -1; + } + DataDs16FileHead * pAbsHead = (DataDs16FileHead *)(m_absData.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(m_absData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //-------- + + // 图形显示区域 + int dpminx = QUIX_PREVIEW_SIDE; + int dpmaxx = width - QUIX_PREVIEW_SIDE; + int dpminy = QUIX_PREVIEW_SIDE; + int dpmaxy = height - QUIX_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(fabs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按x计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + double dpx = (double)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + double dpy = (double)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + // 显示花样图形 + u8 ctrlByte; + double dx; + double dy; + + double datposx, datposy; + datposx = datposy = 0.; + double curx, cury, prex, prey; + curx = cury = prex = prey = 0; + + datposx = pAbsHead->beginX; + datposy = pAbsHead->beginY; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (QUIX_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (QUIX_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + absDataPtr = pData; + + QColor color = QColor(Qt::green); + pen.setColor(color); + painter.setPen(pen); + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + ctrlByte = absDataPtr->ctrl; + + prex = curx; + prey = cury; + + dx = absDataPtr->ax; + dy = absDataPtr->ay; + + datposx = dx; + datposy = dy; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (QUIX_SHOWDIRX == -1) + { + curx = (width)-curx; + } + if (QUIX_SHOWDIRY == -1) + { + cury = (height)-cury; + } + + if(i == 0) + { + absDataPtr++; + continue; + } + + if (ctrlByte == DATA_SEWING) + { + QPointF p1(prex, prey); + QPointF p2(curx, cury); + painter.drawLine(p1, p2); + } + else + { + //painter.drawLine(prex, prey, curx, cury); + //qDebug("other type=0x%x", ctrlByte); + } + + absDataPtr++; + } + + // 保存成文件 + QString preview = getFileFullPathName(); + if (saveflag != 0 && preview.isEmpty() == false) + { +#if (1) + preview += ".preview.png"; + pImage->save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +QuixFileHead *DataFileQuix::getQuixHead() +{ + if(m_fileData.size() <= 0) + { + loadFile(); + } + + QuixFileHead *head = NULL; + + int size = m_fileData.size(); + if (size <= (int)(sizeof(QuixFileHead))) + { + head = new QuixFileHead; + memset(head,0,sizeof(QuixFileHead)); + return head; + } + + head = (QuixFileHead *)(m_fileData.data()); + return head; +} + +void DataFileQuix::writePatternParaToFile(QuixFileHead *head) +{ + if(m_fileData.size() <= 0) + { + return; + } + + memcpy(m_fileData.data(),(char*)head,sizeof(QuixFileHead)); + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); +} + +void DataFileQuix::moveDataBeginPonit(s32 left, s32 front) +{ + if((u32)m_absData.size() > sizeof(DataDs16FileHead)) + { + DataDs16FileHead *dhead = (DataDs16FileHead *)( m_absData.data()); + dhead->beginX += left; + dhead->beginY += front; + dhead->maxX += left; + dhead->minX += left; + dhead->maxY += front; + dhead->minY += front; + } +} + +int DataFileQuix::doubleHeadCreatePreviewImage(QImage *pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + if(reDraw == 0)//图片存在则不重画 + { + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + double width, height; + if (pImg == NULL) + { + width = QUIX_PREVIEW_WIDTH; + height = QUIX_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + if (width <= QUIX_PREVIEW_SIDE*2 || height <= QUIX_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + // 图形 + //qDebug()<<"convertDataToAbs defore"; + doubleHeadConvertDataToEmbAbs(0); // 转换为绝对坐标数据 + //qDebug()<<"convertDataToAbs end"; + + // absdat数据 + int size = m_absData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("2 data less then head size"); + return -1; + } + //DataDs16FileHead * pAbsHead = (DataDs16FileHead *)(m_absData.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(m_absData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //-------- + + // 图形显示区域 + int dpminx = QUIX_PREVIEW_SIDE; + int dpmaxx = width - QUIX_PREVIEW_SIDE; + int dpminy = QUIX_PREVIEW_SIDE; + int dpmaxy = height - QUIX_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(fabs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按x计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + double dpx = (double)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + double dpy = (double)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + // 显示花样图形 + u8 ctrlByte; + double dx; + double dy; + + double firOftX = m_firstPointLeft.x - m_firstAbsPoint.x(); + double firOftY = 0 - (m_firstPointLeft.y - m_firstAbsPoint.y()); + + double secOftX = m_firstPointRight.x - m_firstPointLeft.x; + double secOftY = 0 - (m_firstPointRight.y - m_firstPointLeft.y);//因为中间数据y向取反了,所以这里用0减 + + double datposx1, datposy1, datposx2, datposy2; + datposx1 = datposy1 = datposx2 = datposy2 = 0.; + double curx1, cury1, prex1, prey1; + curx1 = cury1 = prex1 = prey1 = 0; + double curx2, cury2, prex2, prey2; + curx2 = cury2 = prex2 = prey2 = 0; + + //判断数据是否为第二机头开始 + if(absDataPtr->ctrl == DATA_OFFSET_SEC || absDataPtr->ctrl == DATA_SEWING_R) + { + datposx2 = 0; + datposy2 = 0; + + datposx1 = 0 - secOftX; + datposy1 = 0 - secOftY; + } + else + { + datposx1 = 0; + datposy1 = 0; + + datposx2 = secOftX; + datposy2 = secOftY; + } + + curx1 = (datposx1) / factor + dpx; + cury1 = (datposy1) / factor + dpy; + + int showDirX = QUIX_SHOWDIRX; + int showDirY = QUIX_SHOWDIRY; + + if (showDirX == -1) + { + curx1 = (width)-curx1; + } + if (showDirY == -1) + { + cury1 = (height)-cury1; + } + + curx2 = (datposx2) / factor + dpx; + cury2 = (datposy2) / factor + dpy; + + if (showDirX == -1) + { + curx2 = (width)-curx2; + } + if (showDirY == -1) + { + cury2 = (height)-cury2; + } + + absDataPtr = pData; + + QColor color = QColor(Qt::green); + pen.setColor(color); + painter.setPen(pen); + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + ctrlByte = absDataPtr->ctrl; + + if(ctrlByte == QUIX_OFFSET) + { + firOftX = absDataPtr->ax; + firOftY = absDataPtr->ay; + } + + if(ctrlByte == QUIX_OFFSET_SEC) + { + secOftX = absDataPtr->ax - firOftX; + secOftY = absDataPtr->ay - firOftY; + } + + if(ctrlByte == QUIX_SEWING || ctrlByte == QUIX_OFFSET || + ctrlByte == QUIX_SYNC_OFFSET || ctrlByte == QUIX_MIRROR_SEC || + ctrlByte == QUIX_MIRROR_OFT_SEC || ctrlByte == QUIX_SYNC_SEWING)//左机头 + { + //左机头 + prex1 = curx1; + prey1 = cury1; + + dx = absDataPtr->ax; + dy = absDataPtr->ay; + + datposx1 = dx; + datposy1 = dy; + + curx1 = (datposx1) / factor + dpx; + cury1 = (datposy1) / factor + dpy; + + if (showDirX == -1) + { + curx1 = (width)-curx1; + } + if (showDirY == -1) + { + cury1 = (height)-cury1; + } + + if (ctrlByte == QUIX_OFFSET || ctrlByte == QUIX_SYNC_OFFSET || ctrlByte == QUIX_MIRROR_OFT_SEC || ctrlByte == DATA_NULL) + { + //偏移数据和j结束不绘制 + //painter.drawLine(QLineF(prex1, prey1, curx1, cury1)); + } + else + { + painter.drawLine(QLineF(prex1, prey1, curx1, cury1)); + //qDebug()<<"1"<ax; + dy = absDataPtr->ay; + } + else + { + dx = absDataPtr->ax + secOftX; + dy = absDataPtr->ay + secOftY; + } + + if(ctrlByte == QUIX_MIRROR_SEC || ctrlByte == QUIX_MIRROR_OFT_SEC) + { + dx = secOftX + (firOftX - absDataPtr->ax) + firOftX; + } + + datposx2 = dx; + datposy2 = dy; + + curx2 = (datposx2) / factor + dpx; + cury2 = (datposy2) / factor + dpy; + + if (showDirX == -1) + { + curx2 = (width)-curx2; + } + if (showDirY == -1) + { + cury2 = (height)-cury2; + } + + if (ctrlByte == QUIX_OFFSET_SEC || ctrlByte == QUIX_SYNC_OFFSET || ctrlByte == QUIX_MIRROR_OFT_SEC || ctrlByte == DATA_NULL) + { + //偏移数据和j结束不绘制 + //painter.drawLine(QLineF(prex2, prey2, curx2, cury2)); + } + else + { + painter.drawLine(prex2, prey2, curx2, cury2); + //qDebug()<<"2"<save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +void DataFileQuix::doubleHeadConvertDataToEmbAbs(s16 flag) +{ + if(flag == 0){}//去掉编译警告 + m_absData.clear(); + + // 图形数据 + u32 i, datasize, idx; + unsigned char ctrl, tmpls; + + u8 c1, c2, c3, c4; + u32 lsdata; + double deltx, delty, deltx1, delty1, deltx2, delty2; + double threex[4], threey[4]; + s16 nmstep; + + double factorx, factory, unitmuti; + factorx = factory = unitmuti = 1; + QuixFileHead * head = (QuixFileHead *)(m_fileData.data());//头文件的结构体 + + nmstep = head->normalStep * 10; + if(nmstep == 0) + { + nmstep = 200; //单位0.01mm(2mm) + } + + i = sizeof(QuixFileHead); + datasize = m_fileData.size(); + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + int firstLeftOft = 0;//左机头第一个偏移点,要记作左机头的起始点,双头组合机型 + int firstRightOft = 0;//右机头第一个偏移点,要记作右机头的起始点,双头组合机型 + + while(i < datasize) + { +#if(0) + int stepSize = m_absData.size()/sizeof(DsAbsItem); + if(stepSize >= 2700) + { + int a = 0; + a = 1; + } +#endif + // 功能控制字 + if (i >= datasize){break;} + ctrl = m_fileData.at(i++); + + // 图元类型 + if (i >= datasize){break;} + tmpls = m_fileData.at(i++); + + // 附加控制字 + if (i >= datasize){break;} + m_fileData.at(i++); + if (i >= datasize){break;} + m_fileData.at(i++); + + if(ctrl == 0x00) // 结束 + { + break; + } + + //如果为剪线,直接向后加12(点个数1和xy坐标值,共12字节),且将剪线码添加到m_absData中,坐标与前一坐标值相同 + if(ctrl == QUIX_CUTTER || ctrl == QUIX_SYNC_CUTTER || ctrl == QUIX_CUTTER_SEC) + { + i += 12; + if (i >= datasize){break;} + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + if(ctrl == QUIX_CUTTER) + { + ctrl = DATA_CUTTRD; + } + else if(ctrl == QUIX_CUTTER_SEC) + { + ctrl = DATA_CUTTER_SEC; + } + else if(ctrl == QUIX_SYNC_CUTTER) + { + ctrl = DATA_SYNC_CUTTER; + } + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + continue; + } + + switch(tmpls) + { + case QUI_TYPE_LINE: // 直线 + case QUI_TYPE_STEP: // 跨步 + case QUI_TYPE_HSTEP: // 翻头跨步 + { + //增加剪线 + if(tmpls == QUI_TYPE_STEP || tmpls == QUI_TYPE_HSTEP) + { + if((u32)m_absData.size() >= sizeof(DsAbsItem)) + { + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_CUTTRD; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if(lsdata == 1) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty = y/factory; + + //非起始点偏移,加到m_absData中 + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ax = deltx; + absItem.ay = delty; + //if((firstLeftOft == 1 && ctrl == QUIX_OFFSET) || (firstRightOft == 1 && ctrl == QUIX_OFFSET_SEC)) + //if(ctrl == QUIX_OFFSET || ctrl == QUIX_OFFSET_SEC) + { + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else if (lsdata > 1) + { + // 第一个点 + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx2 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty2 = y/factory; + + for(idx = 1; idx < lsdata; idx++) // 其余的点 + { + deltx1 = deltx2; + delty1 = delty2; + + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx2 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty2 = y/factory; + + // 处理直线 + calcLine(deltx1, delty1, deltx2, delty2, nmstep, m_absData, tmpls, ctrl); + } + + if (idx != lsdata) + { + break; + } + } + + //双头组合机型每个图元起始都会有一个偏移点 + if(firstLeftOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET) + { + firstLeftOft = 1; + m_firstPointLeft.x = deltx; + m_firstPointLeft.y = delty; + m_firstPointLeft.ctrl = ctrl; + } + if(firstRightOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET_SEC) + { + firstRightOft = 1; + m_firstPointRight.x = deltx; + m_firstPointRight.y = delty; + m_firstPointRight.ctrl = ctrl; + } + + break; + } + case QUI_TYPE_ARC: // 三点圆弧 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if(lsdata == 1) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty = y/factory; + + //非起始点偏移,加到m_absData中 + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ax = deltx; + absItem.ay = delty; + //if((firstLeftOft == 1 && ctrl == QUIX_OFFSET) || (firstRightOft == 1 && ctrl == QUIX_OFFSET_SEC)) + //if(ctrl == QUIX_OFFSET || ctrl == QUIX_OFFSET_SEC) + { + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else + { + if(lsdata != 3) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threex[idx] = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threey[idx] = y/factory; + } + + //添加圆弧第一个点 + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ax = threex[0]; + absItem.ay = threey[0]; + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + calcCurve(threex, threey, nmstep, m_absData, ctrl); + + if (idx != 3) + { + break; + } + } + + //双头组合机型每个图元起始都会有一个偏移点 + if(firstLeftOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET) + { + firstLeftOft = 1; + m_firstPointLeft.x = deltx; + m_firstPointLeft.y = delty; + m_firstPointLeft.ctrl = ctrl; + } + if(firstRightOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET_SEC) + { + firstRightOft = 1; + m_firstPointRight.x = deltx; + m_firstPointRight.y = delty; + m_firstPointRight.ctrl = ctrl; + } + break; + } + case QUI_TYPE_BES: // 贝塞尔曲线 + { + // 点个数 + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + if(lsdata == 1) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty = y/factory; + + //非起始点偏移,加到m_absData中 + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ax = deltx; + absItem.ay = delty; + //if((firstLeftOft == 1 && ctrl == QUIX_OFFSET) || (firstRightOft == 1 && ctrl == QUIX_OFFSET_SEC)) + //if(ctrl == QUIX_OFFSET || ctrl == QUIX_OFFSET_SEC) + { + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else + { + if(lsdata != 4) + { + break; + } + + for (idx = 0; idx < lsdata; idx++) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threex[idx] = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + threey[idx] = y/factory; + } + + // 处理贝塞尔曲线 + QList splineListXY;//拟合后的点 + splineListXY.clear(); + getBezierPointList(threex, threey, nmstep,splineListXY); + + QList splitListXY;//均分后的点 + splitListXY.clear(); + if(splineListXY.size() > 0) + { + getCurvePointFillLine(splineListXY,nmstep,splitListXY,0,OBJECT_STITCHLEN_NEW_SAMALL); + } + + //添加贝塞尔曲线数据点 + for(int i = 0; i < splitListXY.size(); i++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + + deltx1 = splitListXY[i].x(); + delty1 = splitListXY[i].y(); + + absItem.ctrl = ctrl; + absItem.ax = deltx1; + absItem.ay = delty1; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + //calcBezier(threex, threey, nmstep, m_absData); + if (idx != 4) + { + break; + } + } + + //双头组合机型每个图元起始都会有一个偏移点 + if(firstLeftOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET) + { + firstLeftOft = 1; + m_firstPointLeft.x = deltx; + m_firstPointLeft.y = delty; + m_firstPointLeft.ctrl = ctrl; + } + if(firstRightOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET_SEC) + { + firstRightOft = 1; + m_firstPointRight.x = deltx; + m_firstPointRight.y = delty; + m_firstPointRight.ctrl = ctrl; + } + + break; + } + case QUI_TYPE_SPLINE: // 样条 + { + QList quiListPoint;//样条拟合前的点集合 + quiListPoint.clear(); + + // 点个数 + if (i >= datasize){break;} + unsigned char c1 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c2 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c3 = m_fileData.at(i++); + if (i >= datasize){break;} + unsigned char c4 = m_fileData.at(i++); + lsdata = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + + if(lsdata == 1) + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty = y/factory; + + //非起始点偏移,加到m_absData中 + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ax = deltx; + absItem.ay = delty; + //if((firstLeftOft == 1 && ctrl == QUIX_OFFSET) || (firstRightOft == 1 && ctrl == QUIX_OFFSET_SEC)) + //if(ctrl == QUIX_OFFSET || ctrl == QUIX_OFFSET_SEC) + { + absItem.ctrl = ctrl; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else + { + for(idx = 0; idx < lsdata; idx++) // 点 + { + //点x + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double x = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + deltx1 = x/factorx; + + //点y + if (i >= datasize){break;} + c1 = m_fileData.at(i++); + if (i >= datasize){break;} + c2 = m_fileData.at(i++); + if (i >= datasize){break;} + c3 = m_fileData.at(i++); + if (i >= datasize){break;} + c4 = m_fileData.at(i++); + double y = (c4 << 24) + (c3 << 16) + (c2 << 8) + (c1); + delty1 = y/factory; + + QPointF point(deltx1,delty1); + quiListPoint.append(point); + } + + QList splineListXY;//拟合后的点 + splineListXY.clear(); + if(quiListPoint.size() <= 0) + { + break; + } + getSplineNew(quiListPoint,splineListXY); + + // 均分 + QList splitListXY;//均分后的点 + splitListXY.clear(); + if(splineListXY.size() > 0) + { + getCurvePointFillLine(splineListXY,nmstep,splitListXY,0,OBJECT_STITCHLEN_NEW_SAMALL); + } + + //添加样条曲线数据点 + for(int i = 0; i < splitListXY.size(); i++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + + deltx1 = splitListXY[i].x(); + delty1 = splitListXY[i].y(); + + absItem.ctrl = ctrl; + absItem.ax = deltx1; + absItem.ay = delty1; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + } + + if(idx != lsdata) + { + break; + } + } + + //双头组合机型每个图元起始都会有一个偏移点 + if(firstLeftOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET) + { + firstLeftOft = 1; + m_firstPointLeft.x = deltx; + m_firstPointLeft.y = delty; + m_firstPointLeft.ctrl = ctrl; + } + if(firstRightOft == 0 && lsdata == 1 && ctrl == QUIX_OFFSET_SEC) + { + firstRightOft = 1; + m_firstPointRight.x = deltx; + m_firstPointRight.y = delty; + m_firstPointRight.ctrl = ctrl; + } + break; + } + default: + break; + } + } + + //生成绝对坐标数据的文件头 + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + int stepSize = m_absData.size()/sizeof(DsAbsItem); + if(stepSize <= 0) + { + return; + } + + DsAbsItem * absDataPtr = (DsAbsItem *)(m_absData.data()); + double firstX = absDataPtr->ax; + double firstY = absDataPtr->ay; + m_firstAbsPoint.setX(firstX); + m_firstAbsPoint.setY(firstY); + + double minX, maxX, minY, maxY; + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + int dataDirY = QUIX_DATADIRY*-1; + + double prex,prey,curx,cury,dx,dy,ar; + prex = prey = curx = cury = dx = dy = ar = 0; + double curx2,cury2; + curx2 = cury2 = 0; + + double firOftX = 0; + double firOftY = 0; + + double secOftX = m_firstPointRight.x - m_firstPointLeft.x; + double secOftY = m_firstPointRight.y - m_firstPointLeft.y; + + //将absDataPtr的每个点都减去起始点,并求最大最小值(包括左机头和右机头),将起点看作零 + for (int i = 0; i < stepSize; i++) + { + ctrl = absDataPtr->ctrl; + +#if(0) + if(ctrl == DATA_CUTTRD || ctrl == DATA_CUTTER_SEC || ctrl == DATA_SYNC_CUTTER || i >= 25) + { + int a = 0; + a = 1; + } +#endif + + absDataPtr->ax -= firstX; + absDataPtr->ay -= firstY; + + absDataPtr->ax *= QUIX_DATADIRX; + absDataPtr->ay *= dataDirY; + + if(ctrl == QUIX_OFFSET) + { + firOftX = absDataPtr->ax; + firOftY = absDataPtr->ay; + } + + if(ctrl == QUIX_OFFSET_SEC) + { + secOftX = absDataPtr->ax - firOftX; + secOftY = absDataPtr->ay - firOftY; + } + + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + if(ctrl == QUIX_OFFSET_SEC || ctrl == QUIX_SEWING_SEC) + { + curx2 = absDataPtr->ax; + cury2 = absDataPtr->ay; + } + else + { + if(ctrl != QUIX_OFFSET && ctrl != QUIX_SEWING) + { + curx2 = curx + secOftX; + cury2 = cury - secOftY;//因为y方向取反了,所以这里用减法,如果不取反,应该用加法 + } + } + + if(ctrl == QUIX_MIRROR_SEC) + { + curx2 = secOftX + (firOftX - curx) + firOftX; + } + + if(curx > maxX) + { + maxX = curx; + } + if(curx < minX) + { + minX = curx; + } + + if(cury > maxY) + { + maxY = cury; + } + if(cury < minY) + { + minY = cury; + } + + if(curx2 > maxX) + { + maxX = curx2; + } + if(curx2 < minX) + { + minX = curx2; + } + + if(cury2 > maxY) + { + maxY = cury2; + } + if(cury2 < minY) + { + minY = cury2; + } + + absDataPtr++; + } + + absDataPtr = (DsAbsItem *)(m_absData.data()); + double btar = atan2(m_firstPointLeft.y,m_firstPointLeft.x); + double begR = (btar*10000+0.5*(btar>0?1:-1)); + + btar = atan2(m_firstPointRight.y,m_firstPointRight.x); + double begR2 = (btar*10000+0.5*(btar>0?1:-1)); + + prex = 0;//等于起始点,这里以左机头计算角度,因为左右机头轨迹相同 + prey = 0; + + //缩放并求dr + m_maxX = maxX; + m_minX = minX; + m_maxY = maxY; + m_minY = minY; + + unitmuti = getMutiUnit(0); + unitmuti = 1; + + double scanx = head->scanX * unitmuti; // 宽度 + double scany = head->scanY * unitmuti; // 长度 + + if (scanx < 1) + { + scanx = m_maxX-m_minX; + } + if (scany < 1) + { + scany = m_maxY-m_minY; + } + + // 计算缩放系数 + factorx = (double)((m_maxX-m_minX) / (scanx)); + factory = (double)((m_maxY-m_minY) / (scany)); + + if(factorx == 0){factorx = 1;} + if(factory == 0){factory = 1;} + + // if(flag == 1)//双头组合机型注释掉 + // { + // factorx = 1; + // factory = 1; + // } + + for (int i = 0; i < stepSize; i++) + { + absDataPtr->ax /= factorx; + absDataPtr->ay /= factory; + + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + dx = curx - prex; + dy = cury - prey; + + double tar = atan2(dy,dx); + ar = (tar*10000+0.5*(tar>0?1:-1)); + absDataPtr->ar = ar; + + prex = curx; + prey = cury; + + absDataPtr++; + } + + //增加结束码 + if((u32)m_absData.size() >= sizeof(DsAbsItem)) + { + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + memcpy((char*)&absItem,m_absData.data()+m_absData.size()-sizeof(DsAbsItem),sizeof(DsAbsItem)); + absItem.ctrl = DATA_END; + m_absData.append((char*)&absItem,sizeof(DsAbsItem)); + stepSize++; + } + + maxX /= factorx; + maxY /= factory; + minX /= factorx; + minY /= factory; + + m_maxX = maxX; + m_minX = minX; + m_maxY = maxY; + m_minY = minY; + + m_firstPointLeft.x /= factorx; + m_firstPointLeft.y /= factory; + m_firstPointRight.x /= factorx; + m_firstPointRight.y /= factory; + + //生成文件头 + dhead.maxX = maxX; + dhead.maxY = maxY; + dhead.minX = minX; + dhead.minY = minY; + dhead.beginX = m_firstPointLeft.x; + dhead.beginY = m_firstPointLeft.y; + dhead.beginR = begR; + dhead.beginX2 = m_firstPointRight.x; + dhead.beginY2 = m_firstPointRight.y; + dhead.beginR2 = begR2; + dhead.anchorX = 0; + dhead.anchorY = 0; + dhead.itemNums = stepSize; + dhead.dataSize = stepSize*sizeof(DsAbsItem); // 数据字节数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.dataChecksum = calcCheckSum32((u8 *)(m_absData.data()) , dhead.dataSize);; // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + dhead.fileid = dhead.checkCrc; + m_absData.insert(0,(char*)&dhead,sizeof(DataDs16FileHead)); +} + +void DataFileQuix::writeFileLL(int left, int front, int startX, int startY) +{ + QuixFileHead *pQuixHead = getQuixHead(); + + if(left < 0) + { + left = 0; + } + if(front < 0) + { + front = 0; + } + + pQuixHead->left = left; + pQuixHead->front = front; + + pQuixHead->startX = startX; + pQuixHead->startY = startY; + + QFile wfile(m_fileFullPathName); + if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when read, path =" << m_fileFullPathName; + return; + } + + wfile.write(m_fileData); + wfile.close(); + +#ifdef Q_OS_LINUX + system("sync"); +#endif +} + +int DataFileQuix::getStitchNums() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->itemNums; +} + +int DataFileQuix::getDatWidth() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return (pHead->maxX - pHead->minX); +} + +int DataFileQuix::getDatHeight() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return (pHead->maxY - pHead->minY); +} + +int DataFileQuix::getMaxX() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->maxX; +} + +int DataFileQuix::getMinX() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->minX; +} + +int DataFileQuix::getMaxY() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->maxY; +} + +int DataFileQuix::getMinY() +{ + if(m_absData.size() <= 0) + { + return 0; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)((m_absData.data())); + return pHead->minY; +} diff --git a/datafile/datafilequix.h b/datafile/datafilequix.h new file mode 100644 index 0000000..737c85c --- /dev/null +++ b/datafile/datafilequix.h @@ -0,0 +1,157 @@ +#ifndef DATAFILEQUIX_H +#define DATAFILEQUIX_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "math.h" +#include +#include "stdint.h" + +//#include "vectorsqrt.h" +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" +#include "datafile/dataoperat.h" + +#define QUIX_DATADIRX (1) // X向数据坐标与下位机坐标系统的差异 +#define QUIX_DATADIRY (1) // Y向数据坐标与下位机坐标系统的差异 +#define QUIX_DATADIRR (-1) // R向数据坐标与下位机坐标系统的差异 + +#define QUIX_SHOWDIRX (1) // X向显示坐标和数据坐标的差异 +#define QUIX_SHOWDIRY (-1) // Y向显示坐标和数据坐标的差异 + +#define QUIX_PREVIEW_SIDE (15) // 留边大小 +#define QUIX_PREVIEW_WIDTH (156) // 默认预览图区域宽度 +#define QUIX_PREVIEW_HEIGHT (164) // 默认预览图区域高度 + +#define QUIX_SEWING 0x01 // 缝纫数据 +#define QUIX_OFFSET 0x02 // 偏移数据 +#define QUIX_SYNC_SEWING 0x07 // 同步缝纫数据 +#define QUIX_SYNC_CUTTER 0x0A // 左右机头剪线 +#define QUIX_SYNC_OFFSET 0x0F // 同步偏移数据 +#define QUIX_SEWING_SEC 0x06 // 第二机头缝纫数据 +#define QUIX_OFFSET_SEC 0x12 // 第二机头偏移数据 +#define QUIX_MIRROR_SEC 0x17 // 第二机头x缝纫镜像 + +#define QUIX_CUTTER 0x1A // 左机头剪线 +#define QUIX_CUTTER_SEC 0x1E // 右机头剪线 + +#define QUIX_MIRROR_OFT_SEC 0x1F // 第二机头x偏移镜像 + + +typedef struct tagQuixFileHead +{ + char id[7]; // 0x0000~0x0006; 标志:=="GA-QUIX" + char name[1]; // 0x0007; 文件名 + unsigned char reserve1[6]; // 0x0008~0x000D; 保留 + unsigned char rotateStyle; // 0x000E; 旋转式样 + unsigned char rotateAngle; // 0x000F; 旋转角度 + unsigned int left; // 0x0010~0x0013; 左边 (中间数据后,可以修改,改变起始点,单针机) + unsigned int front; // 0x0014~0x0017; 前边 (中间数据后,可以修改,改变起始点,单针机) + unsigned int scanX; // 0x0018~0x001B; 缩放X (中间数据前,可以修改,单针机和多针机) + unsigned int scanY; // 0x001C~0x001F; 缩放Y (中间数据前,可以修改,单针机和多针机) + unsigned int normalStep; // 0x0020~0x0023; 针步大小(中间数据前,可以修改,单针机和多针机) + unsigned int reinMode; // 0x0024~0x0027; 加固模式(中间数据后,可以修改,终点有跨步的才加,单针机和多针机) + unsigned int reinNeedles; // 0x0028~0x002B; 加固针数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机) + unsigned int reinNum; // 0x002C~0x002F; 加固次数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机) + unsigned int angleCorrPosX; // 0x0030~0x0033; 角度修正x正(中间数据后,可以修改,拐角补偿,单针机和多针机) + unsigned int angleCorrPosY; // 0x0034~0x0037; 角度修正y正(中间数据后,可以修改,拐角补偿,单针机和多针机) + unsigned int angleCorrNegX; // 0x0038~0x003B; 角度修正x负(中间数据后,可以修改,拐角补偿,单针机和多针机) + unsigned int angleCorrNegY; // 0x003C~0x003F; 角度修正y负(中间数据后,可以修改,拐角补偿,单针机和多针机) + unsigned int stepQuiCorrection; // 0x0040~0x0043; 跨步绗缝修正(中间数据后,可以修改,拐角补偿,单针机和多针机) + int rollaComp; // 0x0044~0x0047; 罗拉补偿(中间数据后,让图形闭合,可以修改,多针机) + unsigned short angleCorrOffset; // 0x0048~0x0049; 角度修正量 (中间数据后,可以修改,拐角补偿,单针机和多针机,新加-hhy) + unsigned char reserve2[6]; // 0x004A~0x004F; 保留 + unsigned int HStep; // 0x0050~0x0053; 水平方向针距 单位:0.1mm(绘制用,多针机) + unsigned int leftRightLen; // 0x0054~0x0057; 左针右针距离 单位:0.1mm(绘制用,多针机) + unsigned int VStep12; // 0x0058~0x005B; 第1 2排针距 单位:0.1mm(绘制用,多针机) + unsigned int VStep23; // 0x005C~0x005F; 第2 3排针距 单位:0.1mm(绘制用,多针机) + // 排针每个字节:XXXX XXXX + // 针位n (0x00:无针,0x01:右针, 0x10:左针,0x11:左右针) + unsigned char arrayNeedle1[48]; // 0x0060~0x008F; 第1排排针(绘制用,多针机) + unsigned char arrayNeedle2[48]; // 0x0090~0x00BF; 第2排排针(绘制用,多针机) + unsigned char arrayNeedle3[48]; // 0x00C0~0x00EF; 第3排排针(绘制用,多针机) + unsigned int firstPullLen; // 0x00F0~0x00F3; 一次拉料长度 + unsigned int secondPullLen; // 0x00F4~0x00F7; 二次拉料长度 + unsigned int triplePullLen; // 0x00F8~0x00FB; 三次拉料长度 + unsigned int oftNeedleSize; //去除偏移针步大小设置 + + unsigned int startX; + unsigned int startY; + unsigned int setNormalStep; + unsigned char reserve4[756]; // 0x010E~0x0400; 保留 + unsigned char reserve5[3072]; // 0x0401~0x1000; 保留 + +} __attribute__ ((packed)) QuixFileHead; + +class DataFileQuix +{ +public: + DataFileQuix(); + DataFileQuix(const QString & fullPathName); + + void writeLeftFrontToFileDoubleHead(QString filePath,int left,int front); //写入左边前边 + +protected: + QString m_fileFullPathName; // 文件路径 + QByteArray m_absData; // 转换后的绝对坐标数据 + QByteArray m_fileData;// 文件数据内容(原始数据) + +private: + double m_minX; + double m_maxX; + double m_minY; + double m_maxY; + QuiPoint m_firstPoint; + + QuiPoint m_firstPointLeft;//左机头第一个点 + QuiPoint m_firstPointRight;//右机头第一个点 + QPointF m_firstAbsPoint; + +private: + void creatAbsHeadAndAr();//生成绝对坐标数据文件头及ar + int checkFileHead(); + double getMutiUnit(int unit); + +public: + void initFile(const QString & fullPathName); + void clear(); + void loadFile(); + void convertDataToEmbAbs(s16 falg = 1); + int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称 + inline QByteArray & getEmbAbsData() {return m_absData;} // 得到转换后的数据 + QuixFileHead *getQuixHead(); + void writePatternParaToFile(QuixFileHead *head);//将花样参数配置写到文件中 + void moveDataBeginPonit(s32 left, s32 front);//移动数据起始点 + + //双头组合机型 + int doubleHeadCreatePreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + void doubleHeadConvertDataToEmbAbs(s16 flag = 1); + + void writeFileLL(int left, int front, int startX, int startY); //写入左边前边 + +public: + int getStitchNums();//得到数据的针数 + int getDatWidth();//得到数据的图形宽度 + int getDatHeight();//得到数据的图形高度 + int getMaxX();//得到数据最大X+ + int getMinX();//得到数据最小X- + int getMaxY();//得到数据最大Y+ + int getMinY();//得到数据最小Y- + + inline int getDatMaxX(){return m_maxX;}//得到数据最大X+ + inline int getDatMinX(){return m_minX;}//得到数据最小X- + inline int getDatMaxY(){return m_maxY;}//得到数据最大Y+ + inline int getDatMinY(){return m_minY;}//得到数据最小Y- + + void getQuixMinMax(); + const QPoint getFirstPoint(); +}; + +#endif // DATAFILEQUI_H diff --git a/datafile/dataoperat.cpp b/datafile/dataoperat.cpp new file mode 100644 index 0000000..3ffe632 --- /dev/null +++ b/datafile/dataoperat.cpp @@ -0,0 +1,2330 @@ +#include "dataoperat.h" + +int isThreePointOnALine(const double threex[],const double threey[]) +{ + double k0,k1,k2; + + if (fabs(threex[0]-threex[1]) < 1e-6 + && fabs(threex[0]-threex[2]) < 1e-6 + && fabs(threex[2]-threex[1]) < 1e-6 + && fabs(threey[0]-threey[1]) < 1e-6 + && fabs(threey[0]-threey[2]) < 1e-6 + && fabs(threey[2]-threey[1]) < 1e-6 ) //三点几乎重合 + { + //printf("1.IsThreePointOnALine\n"); + return 1; + } + else if ((fabs(threex[0]-threex[1]) < 1e-6 && fabs(threey[0]-threey[1]) < 1e-6) + || (fabs(threex[0]-threex[2]) < 1e-6 && fabs(threey[0]-threey[2]) < 1e-6) + || (fabs(threex[2]-threex[1]) < 1e-6 && fabs(threey[2]-threey[1]) < 1e-6) ) + { + //三点间,有2点几乎重合 + if (fabs(threex[0]-threex[2]) < 1e-6 && fabs(threey[0]-threey[2]) < 1e-6) + { + //如果是两边2个点几乎重合,则将第2个点坐标->第3个点 + return 2; + } + else + { + //printf("2.IsThreePointOnALine\n"); + return 1; + } + } + else if (fabs(threex[0]-threex[1]) < 1e-6 + && fabs(threex[0]-threex[2]) < 1e-6 + && fabs(threex[2]-threex[1]) < 1e-6 ) + { + //三个点,X的差距极小 + //printf("3.IsThreePointOnALine\n"); + if (threey[0] < threey[2]) + { + if (threey[1] > threey[2]) + { + return 2; + } + } + else + { + if (threey[1] < threey[2]) + { + return 2; + } + } + return 1; + } + else if (fabs(threey[0]-threey[1]) < 1e-6 + && fabs(threey[0]-threey[2]) < 1e-6 + && fabs(threey[2]-threey[1]) < 1e-6 ) + { //三个点,Y的差距极小 + // printf("4.IsThreePointOnALine\n"); + if (threex[0] < threex[2]) + { + if (threex[1] > threex[2]) + { + return 2; + } + } + else + { + if (threex[1] < threex[2]) + { + return 2; + } + } + return 1; + } + else if (fabs(threex[2]-threex[1]) >= 1e-6 + && fabs(threex[2]-threex[0]) >= 1e-6 + && fabs(threex[1]-threex[0]) >= 1e-6 + && fabs(threey[2]-threey[1]) >= 1e-6 + && fabs(threey[2]-threey[0]) >= 1e-6 + && fabs(threey[1]-threey[0]) >= 1e-6 ) + { + k0 = (threey[2]-threey[1])/(threex[2]-threex[1]); + k1 = (threey[2]-threey[0])/(threex[2]-threex[0]); + k2 = (threey[1]-threey[0])/(threex[1]-threex[0]); + + if(fabs(k0-k1) < 1e-6 && fabs(k1-k2) < 1e-6) + { + //三个点,2点之间的斜率差极小 + //printf("5.IsThreePointOnALine\n"); + if ( (threex[0] < threex[1] && threex[1] < threex[2] ) + || (threex[0] > threex[1] && threex[1] > threex[2])) + { + } + else + { + return 2; + } + + return 1; + } + else + { + //printf("6.IsThreePointOnALine\n"); + return 0; + } + } + else + { + //printf("7.IsThreePointOnALine\n"); + return 0; + } +} + +int getArcCenter(const double x[], const double y[], double * pxc, double * pyc, double * pr) +{ +#if 0 + double x20, x21, xh0, xh1, y20, y21, yk0, yk1; + double x2y20, x2y21, xnyn, ykn; + + double xx0,xx1,xx2; + double yy0,yy1,yy2; + xx0=x[0]; + yy0=y[0]; + xx1=x[1]; + yy1=y[1]; + xx2=x[2]; + yy2=y[2]; + + if(fabs(xx0-xx1)<1e-6) + { + yc=(yy0+yy1)/2; + xc=(xx0*xx0-xx2*xx2+yy0*yy0-yy2*yy2+2*yy2*yc-2*yy0*yc)/(2*xx0-2*xx2); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else if(fabs(xx0-xx2)<1e-6) + { + yc=(yy0+yy2)/2; + xc=(xx0*xx0-xx1*xx1+yy0*yy0-yy1*yy1+2*yy1*yc-2*yy0*yc)/(2*xx0-2*xx1); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else if(fabs(xx1-xx2)<1e-6) + { + yc=(yy1+yy2)/2; + xc=(xx1*xx1-xx0*xx0+yy1*yy1-yy0*yy0+2*yy0*yc-2*yy1*yc)/(2*xx1-2*xx0); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else if(fabs(yy0-yy1)<1e-6) + { + xc=(xx0+xx1)/2; + yc=(yy0*yy0-yy2*yy2+xx0*xx0-xx2*xx2+2*xx2*xc-2*xx0*xc)/(2*yy0-2*yy2); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else if(fabs(yy0-yy2)<1e-6) + { + xc=(xx0+xx2)/2; + yc=(yy0*yy0-yy1*yy1+xx0*xx0-xx1*xx1+2*xx1*xc-2*xx0*xc)/(2*yy0-2*yy1); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else if(fabs(yy1-yy2)<1e-6) + { + xc=(xx1+xx2)/2; + yc=(yy1*yy1-yy0*yy0+xx1*xx1-xx0*xx0+2*xx0*xc-2*xx1*xc)/(2*yy1-2*yy0); + r=sqrt((xx0-xc)*(xx0-xc)+(yy0-yc)*(yy0-yc)); + } + else + { + x20=xx0*xx0-xx1*xx1; + xh0=2*xx0-2*xx1; + y20=yy0*yy0-yy1*yy1; + yk0=2*yy0-2*yy1; + + x21=xx1*xx1-xx2*xx2; + xh1=2*xx1-2*xx2; + y21=yy1*yy1-yy2*yy2; + yk1=2*yy1-2*yy2; + + x2y20=x20+y20; + x2y21=x21+y21; + + xnyn=x2y20; + ykn=yk0; + + x2y20 *= xh1; + yk0 *= xh1; + + x2y21 *= xh0; + yk1 *= xh0; + + yc = (x2y20-x2y21)/(yk0-yk1); + xc = (xnyn-yc*ykn)/xh0; + + xx0 -= xc; + yy0 -= yc; + + r=sqrt(xx0*xx0+yy0*yy0); + } + +#else + + double a, b, c, d, e, f; + double xc, yc, r; + + if (isThreePointOnALine(x, y) >= 1) + { + return -1; + } + + a = 2 * (x[1]-x[0]); + b = 2 * (y[1]-y[0]); + c = x[1]*x[1] + y[1]*y[1] - x[0]*x[0] - y[0]*y[0]; + d = 2 * (x[2]-x[1]); + e = 2 * (y[2]-y[1]); + f = x[2]*x[2] + y[2]*y[2] - x[1]*x[1] - y[1]*y[1]; + + xc = (b*f-e*c)/(b*d-e*a); + yc = (d*c-a*f)/(b*d-e*a); + r = sqrt((xc-x[0])*(xc-x[0])+(yc-y[0])*(yc-y[0])); +#endif + + *pxc = xc; + *pyc = yc; + *pr = r; + + return 0; +} + +int getArcMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy) +{ + double k, xc, yc, r; + int beg = 0; + int mid = 0; + int end = 0; + double minx, miny, maxx, maxy; + + getArcCenter(x, y, &xc, &yc, &r); + // printf("cx=%f, cy=%f, r=%f\n", xc, yc, r); + // 区分象限和方向 + k = (x[0]-x[1])*(x[2]-x[1]) + (y[0]-y[1])*(y[2]-y[1]); // 向量 01 和 向量 21 的夹角的余弦的符号-- + // > 0 小于90度 向量夹角小于90度, 说明弧是大于半圆 + // < 0 大于90度 向量夹角大于90度, 说明弧是小于半圆 + // = 0 90 度 向量夹角等于90度, 说明弧是半圆 + + if (x[0] > xc && y[0] > yc) // 起点在第一象限 + { + beg = 1; + } + else if (x[0] < xc && y[0] > yc) // 起点在第二象限 + { + beg = 2; + } + else if (x[0] < xc && y[0] < yc) // 起点在第三象限 + { + beg = 3; + } + else if (x[0] > xc && y[0] < yc) // 起点在第四象限 + { + beg = 4; + } + else if (fabs(y[0]-yc) < 1e-6) // 起点在x轴上 + { + if (x[0] > xc) + { + beg = 5; // x正半轴 + } + else + { + beg = 6; // x负半轴 + } + } + else if (fabs(x[0]-xc) < 1e-6) // 起点在y轴上 + { + if (y[0] > yc) + { + beg = 7; // y正半轴 + } + else + { + beg = 8; // y正半轴 + } + } + else + { + printf("this is an new selection for first point\n"); + } + + if (x[1] > xc && y[1] > yc) // 中点在第一象限 + { + mid = 1; + } + else if (x[1] < xc && y[1] > yc) // 中点在第二象限 + { + mid = 2; + } + else if (x[1] < xc && y[1] < yc) // 中点在第三象限 + { + mid = 3; + } + else if (x[1] > xc && y[1] < yc) // 中点在第四象限 + { + mid = 4; + } + else if (fabs(y[1]-yc)<1e-6) // 中点在x轴上 + { + if (x[1] > xc) {mid = 5;} // x正半轴 + else{ mid = 6; } // x负半轴 + } + else if (fabs(x[1]-xc)<1e-6) // 中点在y轴上 + { + if (y[1] > yc) // y正半轴 + { + mid = 7; + } + else { mid = 8; } // y负半轴 + } + else + { + printf("this is an new selection for second point\n"); + } + + if (x[2] > xc && y[2] > yc) // 终点在第一象限 + { + end = 1; + } + else if (x[2] < xc && y[2] > yc) // 终点在第二象限 + { + end = 2; + } + else if (x[2] < xc && y[2] < yc) // 终点在第三象限 + { + end = 3; + } + else if (x[2] > xc && y[2] < yc) // 终点在第四象限 + { + end = 4; + } + else if (fabs(y[2]-yc)<1e-6) // 终点在x轴上 + { + if (x[2] > xc) {end = 5;} // x正半轴 + else{end = 6;} // x负半轴 + } + else if (fabs(x[2]-xc)<1e-6) // 终点在y轴上 + { + if (y[2] > yc){ end = 7;} // y正半轴 + else{end = 8;} // y负半轴 + } + else + { + printf("this is an new selection for third point\n"); + } + + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + switch (beg) + { + case 1: // 起点在第一象限内 + { + switch (end) + { + case 1: // 终点在第一象限内 + case 5: // 终点在x正半轴上 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("1 Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + case 6: // 终点在x负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else // 半弧 + { + printf("2 Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 3: // 终点在第三象限内 + if (mid == 2 || mid == 6 || mid == 7 || (mid == 1 && x[1] < x[0]) || (mid == 3 && x[1] < x[2])) // 逆时针方向 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (mid == 4 || mid == 5 || mid == 8 || (mid == 1 && x[1] > x[0]) || (mid == 3 && x[1] > x[2])) // 顺时针方向 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else + { + printf("3. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 4: // 终点在第四象限内 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("4. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + default: + break; + } + + break; + } + case 2: // 起点在第二象限内 + { + switch (end) + { + case 1: // 终点在第一象限内 + case 5: // 终点在x正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else // 半弧 + { + printf("5. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + case 6: // 终点在x负半轴上 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("6. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 3: // 终点在第三象限内 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("7. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 4: // 终点在第四象限内 + if (mid == 3 || mid == 6 || mid == 8 || (mid == 2 && x[1] < x[0]) || (mid == 4 && x[1] < x[2])) // 逆时针方向 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (mid == 1 || mid == 5 || mid == 7 || (mid == 2 && x[1] > x[0]) || (mid == 4 && x[1] > x[2])) // 顺时针方向 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else + { + printf("8. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + default: + break; + } + break; + } + case 3: // 起点在第三象限内 + { + switch (end) + { + case 1: // 终点在第一象限内 + if (mid == 4 || mid == 5 || mid == 8 || (mid == 1 && x[1] > x[0]) || (mid == 3 && x[1] > x[2])) // 逆时针方向 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (mid == 2 || mid == 6 || mid == 7 || (mid == 1 && x[1] < x[0]) || (mid == 3 && x[1] < x[2])) // 顺时针方向 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else + { + printf("9. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("10. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + case 3: // 终点在第三象限内 + case 6: // 终点在x负半轴上 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("11. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + case 4: // 终点在第四象限内 + case 5: // 终点在x正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("12. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + default: + break; + } + break; + } + case 4: // 起点在第四象限内 + { + switch (end) + { + case 1: // 终点在第一象限内 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("13. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + if (mid == 1 || mid == 5 || mid == 7 || (mid == 2 && x[1] > x[0]) || (mid == 4 && x[1] > x[2])) // 逆时针方向 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (mid == 3 || mid == 6 || mid == 8 || (mid == 2 && x[1] < x[0]) || (mid == 4 && x[1] < x[2])) // 顺时针方向 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else + { + printf("14. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 3: // 终点在第三象限内 + case 6: // 终点在x负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("15. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 4: // 终点在第四象限内 + case 5: // 终点在x正半轴上 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("16. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + default: + break; + } + break; + } + case 5: // 起点在在x正半轴上 + { + maxx = xc + r; + + switch (end) + { + case 1: // 终点在第一象限内 + case 4: // 终点在第四象限内 + if (k > 0) // 大半弧 + { + minx = xc - r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("17. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else // 半弧 + { + printf("18. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 3: // 终点在第三象限内 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("19. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 5: // 终点在x正半轴上 + printf("20. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + break; + + case 6: // 终点在x负半轴上 + minx = xc - r; + if (y[1] > yc) // 逆时针 + { + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (y[1] < yc) // 顺时针 + { + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else + { + printf("21. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + default: + break; + } + break; + } + case 6: // 起点在x负半轴上 + { + minx = xc - r; + + switch (end) + { + case 1: // 终点在第一象限内 + case 7: // 终点在y正半轴上 + if (k > 0) // 大半弧 + { + maxx = xc + r; + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else if (k < 0) // 小半弧 + { + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else // 半弧 + { + printf("22. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 2: // 终点在第二象限内 + case 3: // 终点在第三象限内 + if (k > 0) // 大半弧 + { + maxx = xc + r; + miny = yc - r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("23. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 4: // 终点在第四象限内 + case 8: // 终点在y负半轴上 + if (k > 0) // 大半弧 + { + maxx = xc + r; + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + maxx = MAX(x[0], x[2]); + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("24. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 5: // 终点在x正半轴上 + maxx = xc + r; + if (y[1] > yc) // 顺时针 + { + miny = MIN(y[0], y[2]); + maxy = yc + r; + } + else if (y[1] < yc) // 逆时针 + { + miny = yc - r; + maxy = MAX(y[0], y[2]); + } + else + { + printf("25. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 6: // 终点在x负半轴上 + printf("26. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + break; + + default: + break; + } + break; + } + + case 7: // 起点在y正半轴上 + { + maxy = yc + r; + + switch (end) + { + + case 1: // 终点在第一象限内 + case 2: // 终点在第二象限内 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + miny = yc - r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + } + else // 半弧 + { + printf("27. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 3: // 终点在第三象限内 + case 6: // 终点在x负半轴上 + if (k > 0) // 大半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = yc - r; + } + else if (k < 0) // 小半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = MIN(y[0], y[2]); + } + else // 半弧 + { + printf("28. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 4: // 终点在第四象限内 + case 5: // 终点在x正半轴上 + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + miny = yc - r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + miny = MIN(y[0], y[2]); + } + else // 半弧 + { + printf("29. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + + case 7: // 终点在y正半轴上 + printf("30. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + break; + + case 8: // 终点在y负半轴上 + miny = yc - r; + if (x[1] > xc) // 顺时针 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + } + else if (x[1] < xc) // 逆时针 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + } + else + { + printf("31. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + default: + break; + } + break; + } + case 8: // 起点在y负半轴上 + { + miny = yc - r; + switch (end) + { + case 1: // 终点在第一象限内 + case 5: // 终点在x正半轴上 + { + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("32. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + } + case 2: // 终点在第二象限内 + case 6: // 终点在x负半轴上 + { + if (k > 0) // 大半弧 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("33. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + } + case 3: // 终点在第三象限内 + case 4: // 终点在第四象限内 + { + if (k > 0) // 大半弧 + { + minx = xc - r; + maxx = xc + r; + maxy = yc + r; + } + else if (k < 0) // 小半弧 + { + minx = MIN(x[0], x[2]); + maxx = MAX(x[0], x[2]); + maxy = MAX(y[0], y[2]); + } + else // 半弧 + { + printf("34. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + } + case 7: // 终点在y正半轴上 + { + maxy = yc + r; + + if (x[1] > xc) // 逆时针 + { + minx = MIN(x[0], x[2]); + maxx = xc + r; + } + else if (x[1] < xc) // 顺时针 + { + minx = xc - r; + maxx = MAX(x[0], x[2]); + } + else + { + printf("35. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + } + break; + } + case 8: // 终点在y负半轴上 + { + printf("36. Impossible in GetMinMax. beg=%d, end=%d\n", beg, end); // 不可能出现的情况 + break; + } + default: + break; + } + break; + } + + default: + break; + } + + if (minx < *pminx) + { + *pminx = minx; + } + + if (miny < *pminy) + { + *pminy = miny; + } + + if (maxx > *pmaxx) + { + *pmaxx = maxx; + } + + if (maxy > *pmaxy) + { + *pmaxy = maxy; + } + + // printf("minx=%.2f, maxx=%.2f, miny=%.2f, maxy=%.2f\n", minx, maxx, miny, maxy); + return 0; +} + +void rotatec(double xin, double yin, double * px, double * py, double angle) +{ + *px=xin*cos(angle)-yin*sin(angle); + *py=xin*sin(angle)+yin*cos(angle); +} + +int arcDir(const double x[], const double y[]) +{ + double k; + if(x[1] > x[0]) + { + k = (y[1] - y[0]) / (x[1]-x[0]); + if (y[2] < (k*(x[2]-x[1]) + y[1])) + { + return -1; + } + else + { + return 1; + } + } + else if (x[1] < x[0]) + { + k = (y[1] - y[0]) / (x[1] - x[0]); + if (y[2] < (k * (x[2]-x[1]) + y[1])) + { + return 1; + } + else + { + return -1; + } + } + else if ( (x[2]>x[1] && y[1]x[1] && y[1]>y[0]) || (x[2]y[1]) ) + { + return -1; + } + else + { + printf("1. what's this case?\n"); + return 0; + } +} + +Point2D pointOnCubicBezier(Point2D* cp, double t) +{ +#if(1) + double ax, bx, cx; double ay, by, cy; + double tSquared, tCubed; Point2D result; + + /* 计算多项式系数 */ + cx = 3.0 * (cp[1].x - cp[0].x); + bx = 3.0 * (cp[2].x - cp[1].x) - cx; + ax = cp[3].x - cp[0].x - cx - bx; + cy = 3.0 * (cp[1].y - cp[0].y); + by = 3.0 * (cp[2].y - cp[1].y) - cy; + ay = cp[3].y - cp[0].y - cy - by; + + /* 计算t位置的点值 */ + tSquared = t * t; + tCubed = tSquared * t; + result.x =((ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x); + result.y =((ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y); + return result; +#endif +} + +void computeBezier(Point2D* cp, long numberOfPoints, Point2D* curve) +{ + double dt; long i; + dt = 1.0 / ( numberOfPoints - 1 ); + for( i = 0; i < numberOfPoints; i++) + { + curve[i] = pointOnCubicBezier( cp, i*dt ); + } +} + +int getBezierMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy) +{ + long k = 0; + double sx,sy; + long i = 0; + double minx, miny, maxx, maxy; + Point2D cp[4]; + + //传递参数 + for (i = 0; i <4;i++) + { + cp[i].x = x[i]; + cp[i].y = y[i]; + } + + //求控制点总长 + for (i = 0; i <3;i++) + { + sx = cp[i+1].x - cp[i].x; + sy = cp[i+1].y - cp[i].y ; + k += sqrt(sx*sx+sy*sy); //分割点数= 总长(精度为0.1mm) + } + if(k == 0) + { + return -1; + } + + if (k > 100) //对多100个点 + { + k = 100; + } + + Point2D curve[k]; + + computeBezier(cp, k, curve); //分割针步 + + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + //判断始末点 + for (i = 0; i <4;i =i+3) + { + if (minx > cp[i].x) + { + minx = cp[i].x; + } + if (maxx < cp[i].x) + { + maxx = cp[i].x; + } + if (miny > cp[i].y) + { + miny = cp[i].y; + } + if (maxy < cp[i].y) + { + maxy = cp[i].y; + } + } + + for (i=0;i curve[i].x) + { + minx = curve[i].x; + } + if (maxx < curve[i].x) + { + maxx = curve[i].x; + } + if (miny > curve[i].y) + { + miny = curve[i].y; + } + if (maxy < curve[i].y) + { + maxy = curve[i].y; + } + } + + //printf("\n BSR minx = %f, maxx = %f, miny = %f, maxy = %f \n",minx,maxx,miny,maxy); + + if (minx < *pminx) + { + *pminx = minx; + } + + if (miny < *pminy) + { + *pminy = miny; + } + + if (maxx > *pmaxx) + { + *pmaxx = maxx; + } + + if (maxy > *pmaxy) + { + *pmaxy = maxy; + } + + return 0; +} + +int calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, WORD datatype, u8 ctrl) +{ + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + s32 dx, dy; + double length; + double tmp; + int count; + int i; + double stepx, stepy; + double sx, sy; + int actx, acty; + double k; + + if(x0 == x1 && y0 == y1) + { + return 0; + } + + if(x0 > x1) + { + sx = -1.0; // x反向 + } + else + { + sx = 1.0; + } + + if(y0 > y1) + { + sy = -1.0; // y反向 + } + else + { + sy = 1.0; + } + + if(datatype == QUI_TYPE_STEP || datatype == QUI_TYPE_HSTEP) // 跨步或翻头跨步 + { + absItem.ctrl = DATA_OFFSET; + } + else + { + if(ctrl != 0) + { + absItem.ctrl = ctrl; + } + else + { + absItem.ctrl = DATA_SEWING; // 其他 + } + } + + // 开始分割针步 + length = sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)); + + tmp = length/step; /* 实际针步数 */ + count = floor(tmp); /* 最少整针步数 */ + + if (tmp - count > 0.01) + { + count += 1; + } + + if (count == 0 && length > 0) // 短直线 + { + count = 1; + } + + tmp = 0; + actx = x0; + acty = y0; + + if (x1 != x0 && y1 == y0) // 横直线 + { + absItem.ax = x0; + absItem.ay = y0; + absAry.append((char*)&absItem,sizeof(DsAbsItem));//2025.7.1 hhy + + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count)*sx+x0; // 实际针步 + + stepx = tmp - actx; + dx = (s32)(stepx+0.5*sx); + dy = 0; + actx += dx; + + absItem.ax = tmp; + absItem.ay = y0; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else if (x1 == x0 && y1 != y0) // 竖直线 + { + absItem.ax = x0; + absItem.ay = y0; + absAry.append((char*)&absItem,sizeof(DsAbsItem));//2025.7.1 hhy + + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count)*sy + y0; // 实际针步 + + stepy = tmp - acty; + + dx = 0; + dy = (s32)(stepy+0.5*sy); + acty += dy; + + absItem.ax = x0; + absItem.ay = tmp; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else if(x1 != x0 && y1 != y0) // 任意斜线 + { + absItem.ax = x0; + absItem.ay = y0; + absAry.append((char*)&absItem,sizeof(DsAbsItem));//2025.7.1 hhy + + k = (y1-y0)/(x1-x0); + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count); + + stepx = fabs(tmp*cos(atan(k)))*sx + x0; // 实际针步x + stepy = fabs(tmp*sin(atan(k)))*sy + y0; // 实际针步y + + dx = (s32)(stepx-actx+0.5*sx); + dy = (s32)(stepy-acty+0.5*sy); + + actx += dx; + acty += dy; + + absItem.ax = stepx; + absItem.ay = stepy; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else + { + printf("what's this?\n"); + } + + return count; +} + +int calcCurve(double threex[], double threey[], s16 step, QByteArray &absAry, u8 ctrl) +{ + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + BYTE dx, dy; + int count = 0; + int i; + s32 ar = 0; + + double distance, k; + double alph; + double increment; + double xc=0,yc=0,r=0; + int actx, acty; + int ddx, ddy; + + i = isThreePointOnALine(threex, threey); + if(i == 1) // 3点共线 + { + return calcLine(threex[0], threey[0], threex[2], threey[2], step, absAry, QUI_TYPE_LINE, ctrl); // 作为直线 + } + else if (i == 2) + { + return calcLine(threex[0], threey[0], threex[1], threey[1], step, absAry, QUI_TYPE_LINE, ctrl); // 作为直线 + } + + getArcCenter(threex, threey, &xc, &yc, &r); + + // printf("center=%.2f,%.2f,r=%.2f\n", xc, yc, r); + + // 计算弦长和圆心角 + distance = sqrt((threex[0]-threex[2])*(threex[0]-threex[2])+(threey[0]-threey[2])*(threey[0]-threey[2])); // 两点间距离就是弦长 + k = (r*r+r*r-distance*distance)/(r*r+r*r); + if (k < -1) + { + k = -1; + } + else if (k > 1) + { + k = 1; + } + + // printf("distance=%f, k=%f\n", distance, k); + + alph = acos(k); + + // 区分象限和方向 + k = (threex[0]-threex[1])*(threex[2]-threex[1]) + (threey[0]-threey[1])*(threey[2]-threey[1]); // 向量 01 和 向量 21 的夹角的余弦的符号-- > 0 小于90度. < 0 大于90度 = 0, 90 度 + if (k > 0) // 夹角小于90度, 说明弧是大于半圆 + { + alph = 2*PI-alph; + } + else // 夹角大于等于90度, 说明弧是小于等于半圆, 不需要处理 + { + } + + // printf("act alph=%f\n", alph); + + // 计算每个针步对应的弧心角大小 + if (fabs(2*r*r-step*step)/(2*r*r) > 1) + { + increment = alph; + } + else + { + increment = (acos((2*r*r-step*step)/(r*r+r*r))); + } + + // 计算分割针步数 + count = (int)(alph/increment+0.5); + if (count == 0) + { + count++; + } + + // printf("1.count=%d, increment=%f\n", count, increment); + + increment = alph/count; // 重新计算每个针步弧心角 + + increment *= arcDir(threex, threey); // 确定针步增加的角度和方向 + + // printf("2.count=%d, increment=%f\n", count, increment); + + double curx, cury, lastx, lasty; + double xrot, yrot; + + lastx = threex[0]; + lasty = threey[0]; + + i = 0; + + actx = (int)(lastx); + acty = (int)(lasty); + + do + { + if (i == count-1) + { + // 最后一个针步 + // printf("the last step\n"); + curx = threex[2]; + cury = threey[2]; + } + else + { + // 点 (lastx, lasty) 在圆上旋转 + // printf("before Rotatec point(%f, %f)\n", lastx, lasty); + + rotatec(lastx-xc, lasty-yc, &xrot, &yrot, increment); + curx = xrot + xc; + cury = yrot + yc; + } + + ddx = curx-actx; + ddy = cury-acty; + + dx = (s16)(curx-actx+(0.5*(ddx>=0?1:-1))); + dy = (s16)(cury-acty+(0.5*(ddy>=0?1:-1))); + + if(ctrl != 0) + { + absItem.ctrl = ctrl; + } + else + { + absItem.ctrl = DATA_SEWING; + } + absItem.ax = curx; + absItem.ay = cury; + + double tar = atan2(dy,dx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + absItem.ar = ar; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + + lastx = curx; + lasty = cury; + + actx += dx; + acty += dy; + i++; + + } while(i < count); + + return count; +} + +#define YUFENGE 20 //预分割步数 +#define YUFENGE_BEGIN (YUFENGE*7/10) //扫描起点 + +int calcBezier(double threex[], double threey[], s16 step, QByteArray &absAry) +{ + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + int dx, dy; + long k = 0; + double sx,sy; + long i , l; + Point2D cp[4]; + int count = 0; + double curx, cury, lastx, lasty; + int actx, acty; + int ddx, ddy; + s32 ar = 0; + + //传递参数 + for (i = 0; i <4;i++) + { + cp[i].x = threex[i]; + cp[i].y = threey[i]; + } + + //求控制点总长 + for (i = 0; i <3;i++) + { + sx = cp[i+1].x - cp[i].x; + sy = cp[i+1].y - cp[i].y ; + k += sqrt(sx*sx+sy*sy); //分割点数= 总长(精度为0.1mm) + } + + k = (long)((k / step)+1) * YUFENGE; //预分割针步数,设置针步数*YUFENGE. + Point2D curve[k]; + + double dt; + dt = 1.0 / ( k - 1 ); //分割分辨率 + + lastx = cp[0].x; + lasty = cp[0].y; + + for (i = YUFENGE_BEGIN ;i < k ; ) + { + curve[i] = pointOnCubicBezier(cp, i*dt); + sx = curve[i].x - lastx; + sy = curve[i].y - lasty; + l = sqrt(sx*sx+sy*sy); //拟合针步长度 + + if(i == k-1) + { + //最后一针 + actx = (int)(lastx); + acty = (int)(lasty); + curx = (int)(cp[3].x); + cury = (int)(cp[3].y); + + ddx = curx-actx; + ddy = cury-acty; + + dx = (int)(abs(ddx)+0.5); + dy = (int)(abs(ddy)+0.5); + + lastx = curx; + lasty = cury; + + absItem.ctrl = DATA_SEWING; + absItem.ax = curx; + absItem.ay = cury; + + double tar = atan2(dy,dx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + absItem.ar = ar; + + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + + count++; + break; + } + else if(l >= (step-1)) + { + actx = (int)(lastx); + acty = (int)(lasty); + curx = (int)(curve[i].x); + cury = (int)(curve[i].y); + + ddx = curx-actx; + ddy = cury-acty; + + dx = (int)(abs(ddx)+0.5); + dy = (int)(abs(ddy)+0.5); + + lastx = curx; + lasty = cury; + count++; + + if ((i + YUFENGE_BEGIN) >= k-1) + { + i = k-1; + } + else + { + i=i+YUFENGE_BEGIN; + } + + absItem.ctrl = DATA_SEWING; + absItem.ax = curx; + absItem.ay = cury; + + double tar = atan2(dy,dx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + absItem.ar = ar; + + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + else + { + i++; + } + } + + return count; +} + +void getSplineNew(QList &ptList, QList &splineList) +{ + //读取样条线拟合控制点 + QPointF pSuPoint; + int i = 0; + int iCountPoint = ptList.size(); + + //绘制二次累加弦长曲线 + QPointF pPoint[iCountPoint]; + double dfMinX, dfMinY; + + dfMinX = dfMinY= 0; + + while (i < iCountPoint) + { + pSuPoint = ptList.at(i); + + pPoint[i].setX(pSuPoint.x()); + pPoint[i].setY(pSuPoint.y()); + if (i == 0) + { + dfMinX = pPoint[i].x(); + dfMinY = pPoint[i].y(); + } + else + { + if (dfMinX > pPoint[i].x()) + dfMinX = pPoint[i].x(); + + if (dfMinY > pPoint[i].y()) + dfMinY = pPoint[i].y(); + } + i++; + } + + for (i = 0; i < iCountPoint; i++) + { + double x = pPoint[i].x() - dfMinX; + double y = pPoint[i].y() - dfMinY; + pPoint[i].setX(x); + pPoint[i].setY(y); + } + + getShap(iCountPoint, pPoint, splineList, dfMinX, dfMinY); +} + +void getShap(int nCtrlPntNum, QPointF *pPoint, QList &splineList, double dfMinX, double dfMinY) +{ + int i,j,k,stp,leg, m = nCtrlPntNum-1; + double t0,t1,r0,r1, *o, *p, *q; + QPointF *u, *v; + + o = new double [nCtrlPntNum + 1]; + p = new double [nCtrlPntNum + 1]; + q = new double [nCtrlPntNum + 1]; + u = new QPointF [nCtrlPntNum + 1]; + v = new QPointF [nCtrlPntNum + 1]; + + do // 计算弦长 + { + j = 0; + for (i = 1; i<= m; i++) + { + t0 = pPoint[i].x() - pPoint[i-1].x(); + t1 = pPoint[i].y() - pPoint[i-1].y(); + o[i] = sqrt(t0 * t0 + t1 * t1); + if (o[i] < 2) + { + j = i; + break; + } + } + + if (j > 0) + { + for (i = j; i <= m; i++) + { + pPoint[i].setX(pPoint[i+1].x()); + pPoint[i].setY(pPoint[i+1].y()); + } + m--; + } + } while (j!=0); + + t0 = o[1] + o[2]; + t1 = 2*o[1] * o[2]; // 边界条件 m[o] 和 m[N] 的构造 + + u[0].setX((t0 * t0 * pPoint[1].x() - o[2] * o[2] * pPoint[0].x() - o[1] * o[1] * pPoint[2].y()) / t1 - pPoint[0].x()); + u[0].setY((t0 * t0 * pPoint[1].y() - o[2] * o[2] * pPoint[0].y() - o[1] * o[1] * pPoint[2].y()) / t1 - pPoint[0].y()); + t0 = sqrt(u[0].x() * u[0].x() + u[0].y() * u[0].y()); + + u[0].setX(u[0].x() / t0); + u[0].setY(u[0].y() / t0); + t0 = o[m-1] + o[m]; + t1 = 2*o[m-1] * o[m]; + + r0 = (t0 * t0 * pPoint[m-1].x() - o[m] * o[m] * pPoint[m-2].x() - o[m-1] * o[m-1] * pPoint[m].x()) / t1; + r1 = (t0 * t0 * pPoint[m-1].y() - o[m] * o[m] * pPoint[m-2].y() - o[m-1] * o[m-1] * pPoint[m].y()) / t1; + u[m].setX(pPoint[m].x() - r0); + u[m].setY(pPoint[m].y() - r1); + t0 = sqrt(u[m].x() * u[m].x() + u[m].y() * u[m].y()); + u[m].setX(u[m].x() / t0); + u[m].setY(u[m].y() / t0); + + //计算 m 连续方程系数 C[i] + p[1] = o[2] / (o[1] + o[2]); + q[1] = 3; + t0 = p[1] * (pPoint[1].x() - pPoint[0].x()) / o[1]; + t1 = p[1] * (pPoint[1].y() - pPoint[0].y()) / o[1]; + v[1].setX(4 * (t0 + (1-p[1]) * (pPoint[2].x() - pPoint[1].x()) / o[1+1])); + v[1].setY(4 * (t1 + (1-p[1]) * (pPoint[2].y() - pPoint[1].y()) / o[1+1])); + + for (i=2; i<= (m-1); i++) + { + p[i] = o[i+1] / (o[i]+o[i+1]); + q[i] = 3 - p[i] * (1 - p[i-1]) / q[i-1]; + + t0 = p[i] * (pPoint[i].x() - pPoint[i-1].x()) / o[i]; + t1 = p[i] * (pPoint[i].y() - pPoint[i-1].y()) / o[i]; + + v[i].setX(4 * (t0 + (1 - p[i]) * (pPoint[i+1].x() - pPoint[i].x()) / o[i+1])); + v[i].setY(4 * (t1 + (1 - p[i]) * (pPoint[i+1].y() - pPoint[i].y()) / o[i+1])); + } + + v[1].setX(v[1].x() - p[1] * u[0].x()); + v[1].setY(v[1].y() - p[1] * u[0].y()); + v[m-1].setX(v[m-1].x() - (1 - p[m-1]) * u[m].x()); + v[m-1].setY(v[m-1].y() - (1 - p[m-1]) * u[m].y()); + + // 求解 m 连续方程, 获得 m[i] + u[1].setX(v[1].x() / q[1]); + u[1].setY(v[1].y() / q[1]); + + for (i = 2; i <= m-1; i++) + { + u[i].setX((v[i].x() - p[i] * u[i-1].x()) / q[i]); + u[i].setY((v[i].y() - p[i] * u[i-1].y()) / q[i]); + } + + for (i = m-2; i >= 1; i--) + { + u[i].setX(u[i].x() - u[i+1].x() * (1 - p[i]) / q[i]); + u[i].setY(u[i].y() - u[i+1].y() * (1 - p[i]) / q[i]); + } + + // 求得 M[j] j=0,1,...,N + v[0].setX(4 * (pPoint[1].x() - pPoint[0].x()) / (o[1] * o[1]) - (3 * u[0].x() + u[1].x()) / o[1]); + v[0].setY(4 * (pPoint[1].y() - pPoint[0].y()) / (o[1] * o[1]) - (3 * u[0].y() + u[1].y()) / o[1]); + q[0]=0; + + for (i=1; i<= m; i++) + { + q[i] = 0; + t0 = o[i] * o[i]; + v[i].setX(-4 * (pPoint[i].x() - pPoint[i-1].x()) / t0 + (3 * u[i].x() + u[i-1].x()) / o[i]); + v[i].setY(-4 * (pPoint[i].y() - pPoint[i-1].y()) / t0 + (3 * u[i].y() + u[i-1].y()) / o[i]); + for (j=1; j<= i; j++) + q[i] = q[i] + o[j]; + } + + // o[j] j=0,1,...,N 表示半节点 + o[0] = q[0]; + o[m+1] = q[m]; + + for (i = 1; i<= m; i++) + o[i] = (q[i-1] + q[i]) / 2; + + // 显示或绘之曲线 + QPointF suPoint; + suPoint.setX(pPoint[0].x() + dfMinX); + suPoint.setY(pPoint[0].y() + dfMinY); + splineList.append(suPoint); + // pDC->MoveTo(lx1,ly1); + + for (i = 0; i< m; i++) + { + leg = (int)(o[i+1] - o[i]); + stp = leg / 10; + + if (leg> 600) + stp = leg / 60; + + if (leg> 900) + stp = leg / 80; + + if (leg>1200) + stp = leg / 100; + + if (leg > 2400) + stp = leg / 120; + + if (leg>4800) + stp = leg / 140; + + if (stp) + k = leg/stp; + else + k = 0; + + for (j = 0; j<= k; j++) + { + r0 = o[i] + stp * j - q[i]; + suPoint.setX(pPoint[i].x() + r0 * (u[i].x() + v[i].x() / 2 * r0) + dfMinX); + suPoint.setY(pPoint[i].y() + r0 * (u[i].y() + v[i].y() / 2 * r0) + dfMinY); + splineList.append(suPoint); + //pDC->LineTo(lx1,ly1); + } + } + + suPoint.setX(pPoint[m].x() + dfMinX); + suPoint.setY(pPoint[m].y() + dfMinY); + splineList.append(suPoint); + //pDC->LineTo(lx1,ly1); + + delete o; + delete p; + delete q; + delete u; + delete v; +} + +void getCurvePointFillLine(QList &inList, double indRunLen, QList &outList, int iSumParm, BYTE biLenLimit) +{ + QPointF dPoint1, dPoint2, dPoint3; + double dTatol, dLen1, dLen2, dSpace; + long lSum, lCount; + + //计算总的线段长 + int iCountPoint = inList.size(); + if(iCountPoint <= 0) + { + return; + } + + getTotalDistanceFillLine(&inList, dTatol); + if(dTatol == 0) + return; + + if (biLenLimit == ADJUSTLINE_ADD_DUAN_LIMIT) + { + lSum = iSumParm; + if (lSum < 1) + lSum = 1; + dSpace = dTatol / lSum; + } + else if (iSumParm > 2) + { + lSum = iSumParm; + dSpace = dTatol / (double)lSum; + } + else + { + if (biLenLimit == OBJECT_STITCHLEN_NEW_BIG) + { + lSum = int(dTatol / indRunLen); + dSpace = dTatol / lSum; + + if(lSum == 0) + lSum = 1; + } + else if (biLenLimit == OBJECT_STITCHLEN_NEW_SAMALL) + { + lSum = doubleToLong(dTatol / indRunLen + 0.1667); + dSpace = dTatol / (double)lSum; + if(lSum == 0) + lSum = 1; + } + else if (biLenLimit == OBJECT_STITCHLEN_NEW_SAME) + { + lSum = int(dTatol / indRunLen); + dSpace = indRunLen; + if(lSum == 0) + lSum = 1; + } + else if (biLenLimit == LINEDUAN_STITCHLEN_LIMIT || + biLenLimit == LINEDUAN_STITCHLEN_LIMIT_END) + { + lSum = int(dTatol / indRunLen); + dSpace = indRunLen; + } + else if (biLenLimit == LINEDUAN_NUM_LIMIT) + { + lSum = int(dTatol / indRunLen); + dSpace = dTatol / (double)lSum; + } + else + { + if (biLenLimit) + { + lSum = int(dTatol / indRunLen); + if (lSum < 1) + lSum = doubleToLong(dTatol / indRunLen + 0.1667); + } + else + lSum = doubleToLong(dTatol / indRunLen + 0.1667); + + if(lSum == 0) + lSum = 1; + + dSpace = dTatol / (double)lSum; + } + } + + dPoint1 = inList[0]; + outList.append(dPoint1);//添加第一个点 + + pointToPoint(dPoint1, dPoint2); + dLen1 = dSpace; + dLen2 = 0; + int i = 0; + for(lCount = 0; lCount < lSum; lCount++) + { + while(i < inList.size()-1 && dLen2 < dLen1) + { + dLen1 -= dLen2; + pointToPoint(dPoint2, dPoint1); + i++; + dPoint2 = inList[i]; + distPointToPoint(dPoint1, dPoint2, dLen2); + } + if(dLen1 < dLen2) + { + getPointInSectFillLine(dPoint1, dPoint2, dLen1, dPoint3); + } + else + { + dPoint3.setX(dPoint2.x()); + dPoint3.setY(dPoint2.y()); + } + outList.append(dPoint3); + dLen2 -= dLen1; + dLen1 = dSpace; + pointToPoint(dPoint3, dPoint1); + } + + if (biLenLimit == LINEDUAN_STITCHLEN_LIMIT_END || + biLenLimit == OBJECT_STITCHLEN_NEW_SAME) + { + if (fabs((lSum * indRunLen) - dTatol) > ZERO) + { + outList.append(inList.last()); + } + } +} + +int getTotalDistanceFillLine(QList *pPointList, double &dTotal) +{ + QPointF dPoint, dNext; + double d; + dTotal = 0; + int i = 0; + long lSum = (long)pPointList->count(); + if(lSum > 1) + { + while(i < pPointList->size()) + { + dPoint = pPointList->at(i); + i++; + if(i < pPointList->size()) + { + dNext = pPointList->at(i); + distPointToPoint(dPoint, dNext, d); + dTotal += d; + } + else + { + break; + } + } + } + return ERROR_NOTHING; +} + +void pointToPoint(const QPointF &inPoint, QPointF &outPoint) +{ + outPoint.setX(inPoint.x()); + outPoint.setY(inPoint.y()); +} + +long doubleToLong(double indValue) +{ + return (long)round(indValue); +} + +double round(double indValue) +{ + return floor(indValue + 0.5); +} + +void distPointToPoint(const QPointF &p1, const QPointF &p2, double &outd) +{ + outd = disPointToPoint(p1.x(), p1.y(), p2.x(), p2.y()); +} + +bool getPointInSectFillLine(const QPointF &p1, const QPointF &p2, const double &d, QPointF &outp) +{ + bool bRes; + QPointF dpoint[3]; + + dpoint[0].setX(p1.x()); + dpoint[0].setY(p1.y()); + dpoint[1].setX(p2.x()); + dpoint[1].setY(p2.y()); + dpoint[2].setX(outp.x()); + dpoint[2].setY(outp.y()); + + bRes = getPointAtSect(dpoint[0], dpoint[1], d, dpoint[2]); + outp.setX(dpoint[2].x()); + outp.setY(dpoint[2].y()); + + return bRes; +} + +bool getPointAtSect(const QPointF &p1, const QPointF &p2, const double &d, QPointF &outp) +{ + double s = disPointToPoint(p1.x(), p1.y(), p2.x(), p2.y()); + if(fabs(s) < ZERO) + { + if(d < ZERO) + { + outp.setX(p1.x()); + outp.setY(p1.y()); + } + return false; + } + outp.setX((p2.x() - p1.x()) * d / s + p1.x()); + outp.setY((p2.y() - p1.y()) * d / s + p1.y()); + + return true; +} + +double disPointToPoint(double x1, double y1, double x2, double y2) +{ + return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); +} + +void getBezierPointList(double threex[], double threey[], s16 step, QList &outList) +{ + long k = 0; + double sx,sy; + Point2D cp[4]; + + //传递参数 + for (s16 i = 0; i < 4; i++) + { + cp[i].x = threex[i]; + cp[i].y = threey[i]; + } + + //求控制点总长 + for (s16 i = 0; i < 3; i++) + { + sx = cp[i+1].x - cp[i].x; + sy = cp[i+1].y - cp[i].y ; + k += sqrt(sx*sx+sy*sy); //分割点数= 总长(精度为0.1mm) + } + + k = (long)((k / step)+1) * YUFENGE; //分割针步数 + Point2D curve; + + double dt; + dt = 1.0 / ( k - 1 ); //分割分辨率 + + QPointF p; + for (int i = 0; i < k; i++) + { + curve = pointOnCubicBezier(cp, i*dt); + p.setX(curve.x); + p.setY(curve.y); + outList.append(p); + } +} + +int getSplineMinMax(QList &ptList, double *pminx, double *pmaxx, double *pminy, double *pmaxy) +{ + QList splineListXY;//拟合后的点 + splineListXY.clear(); + + double minx, miny, maxx, maxy; + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + //读取样条线拟合控制点 + QPointF pSuPoint; + int i = 0; + int iCountPoint = ptList.size(); + + //绘制二次累加弦长曲线 + QPointF pPoint[iCountPoint]; + double dfMinX, dfMinY; + + dfMinX = dfMinY= 0; + + while (i < iCountPoint) + { + pSuPoint = ptList.at(i); + + pPoint[i].setX(pSuPoint.x()); + pPoint[i].setY(pSuPoint.y()); + if (i == 0) + { + dfMinX = pPoint[i].x(); + dfMinY = pPoint[i].y(); + } + else + { + if (dfMinX > pPoint[i].x()) + dfMinX = pPoint[i].x(); + + if (dfMinY > pPoint[i].y()) + dfMinY = pPoint[i].y(); + } + i++; + } + + for (i = 0; i < iCountPoint; i++) + { + double x = pPoint[i].x() - dfMinX; + double y = pPoint[i].y() - dfMinY; + pPoint[i].setX(x); + pPoint[i].setY(y); + } + + getShap(iCountPoint, pPoint, splineListXY, dfMinX, dfMinY); + + for (i=0;i splineListXY[i].x()) + { + minx = splineListXY[i].x(); + } + if (maxx < splineListXY[i].x()) + { + maxx = splineListXY[i].x(); + } + if (miny > splineListXY[i].y()) + { + miny = splineListXY[i].y(); + } + if (maxy < splineListXY[i].y()) + { + maxy = splineListXY[i].y(); + } + } + + if (minx < *pminx) + { + *pminx = minx; + } + + if (miny < *pminy) + { + *pminy = miny; + } + + if (maxx > *pmaxx) + { + *pmaxx = maxx; + } + + if (maxy > *pmaxy) + { + *pmaxy = maxy; + } + + return 0; +} diff --git a/datafile/dataoperat.h b/datafile/dataoperat.h new file mode 100644 index 0000000..343dea1 --- /dev/null +++ b/datafile/dataoperat.h @@ -0,0 +1,83 @@ +#ifndef DATAOPERAT_H +#define DATAOPERAT_H + +#include "machine/comm/datadef.h" +#include +#include +#include +#include +#include +#include + +#define QUI_TYPE_LINE 1 //直线 +#define QUI_TYPE_ARC 2 //三点圆弧 +#define QUI_TYPE_STEP 4 //跨步 +#define QUI_TYPE_HSTEP 5 //翻头跨步 +#define QUI_TYPE_BES 6 //贝塞尔曲线 +#define QUI_TYPE_SPLINE 7 //样条曲线 + +#define ERROR_NOTHING 0 //成功 +#define ZERO 1e-6 + +#define LINEDUAN_NUM_LIMIT 5 // 计算分段数固定:不进行特殊计算 +#define LINEDUAN_STITCHLEN_LIMIT 6 // 针迹步长固定 +#define LINEDUAN_STITCHLEN_LIMIT_END 7 // 针迹步长固定(最后线段) + +#define OBJECT_STITCHLEN_NEW_BIG 8 // 固定针迹长度(大等分) +#define OBJECT_STITCHLEN_NEW_SAME 9 // 固定针迹长度(等距分) +#define OBJECT_STITCHLEN_NEW_SAMALL 10 // 固定针迹长度(小等分) +#define ADJUSTLINE_ADD_DUAN_LIMIT 11 // 自动单针指定分段添加 + +typedef struct +{ + double x; + double y; +} Point2D; + +typedef struct +{ + double x; + double y; + int ctrl; +} QuiPoint; + +int isThreePointOnALine(const double threex[],const double threey[]); +int getArcCenter(const double x[], const double y[], double * pxc, double * pyc, double * pr); +int getArcMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy); +void rotatec(double xin, double yin, double * px, double * py, double angle); +int arcDir(const double x[], const double y[]); + +Point2D pointOnCubicBezier(Point2D* cp, double t); +void computeBezier(Point2D* cp, long numberOfPoints, Point2D* curve); +int getBezierMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy); +int getSplineMinMax(QList &ptList, double * pminx, double * pmaxx, double * pminy, double * pmaxy); + +int calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, WORD datatype, u8 ctrl = 0); +int calcCurve(double threex[], double threey[], s16 step, QByteArray &absAry, u8 ctrl = 0); +int calcBezier(double threex[], double threey[], s16 step, QByteArray &absAry); +void getBezierPointList(double threex[], double threey[], s16 step, QList &outList); + +//样条拟合 +void getSplineNew(QList &ptList, QList &splineList); +void getShap(int nCtrlPntNum, QPointF *pPoint, QList &splineList, double dfMinX, double dfMinY); +//线段拟合 +void getCurvePointFillLine(QList &inList, double indRunLen, + QList &outList, int iSumParm, BYTE biLenLimit); +int getTotalDistanceFillLine(QList *pPointList, double &dTotal); +void pointToPoint(const QPointF &inPoint, QPointF &outPoint); +long doubleToLong(double indValue);//浮点数转整形 +double round(double indValue);//四舍五入 +void distPointToPoint(const QPointF &p1, const QPointF &p2, double &outd); +bool getPointInSectFillLine(const QPointF &p1, const QPointF &p2, const double &d, QPointF &outp); + +//距p1点距离为d的点 +// d > s : out_p在p2延长线上 +// s >= d >= 0 : out_p在p1、p2线段上 +// d < 0 : out_p在p1延长线上 +bool getPointAtSect(const QPointF &p1, const QPointF &p2, const double &d, QPointF &outp); + +// 两点间距离 +double disPointToPoint(double x1, double y1, double x2, double y2); + + +#endif // DATAOPERAT_H diff --git a/datafile/dsrcryption.cpp b/datafile/dsrcryption.cpp new file mode 100644 index 0000000..d746d19 --- /dev/null +++ b/datafile/dsrcryption.cpp @@ -0,0 +1,394 @@ +#include "dsrcryption.h" +#include +#include + +DsrCryption::DsrCryption() +{ + m_initflag = 0; + m_cryword = 0; + memset(m_factors, 0, BYTES_OF_CRY_FACTORS); +} + +// 初始化加密控制, 生成加密字和加密因子 +int DsrCryption::InitDsrCryptionCtrl(int version, unsigned int cryword, const unsigned char * factors) +{ + int rslt = 0; + + m_initflag = 0; + m_cryword = 0; + memset(m_factors, 0, BYTES_OF_CRY_FACTORS); + + if (version >= 0) + { + rslt = CreateCryWord(version); + } + else + { + m_cryword = cryword; + } + + if (rslt == 0) + { + rslt = CreateCryFactors(factors); + } + + if (rslt == 0) + { + m_initflag++; + } + + return rslt; +} + +// 获取加密字 +unsigned int DsrCryption::GetDsrCryptionWord() +{ + return m_cryword; +} + +// 加密数据 +int DsrCryption::EnCryption(unsigned char * pData, int size) +{ + if (pData == NULL || size <= 0) + { + return -1; + } + + unsigned char thisfactors[BYTES_OF_CRY_FACTORS]; + unsigned char tempbuff[BYTES_OF_CRY_FACTORS]; + + memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS); // 拷贝临时的加密因子,做计算用 + + int i, j; + for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS) + { + // 拷贝数据到临时buff + int mv = 0; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + if (i+j < size) + { + tempbuff[j] = pData[i+j]; // 拷贝数据 + } + else + { + tempbuff[j] = 0; + } + + mv += thisfactors[j]; // 累加因子,作为移动因子 + } + + // 移动数据 + if (i + BYTES_OF_CRY_FACTORS < size) + { + // 生成移动索引 + unsigned char mvidx[BYTES_OF_CRY_FACTORS]; + int idx, setdidx = BYTES_OF_CRY_FACTORS-1; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + idx = (mv >> j) & 0x1f; + for (int k = 0; k < j; k++) + { + if (mvidx[k] == idx) + { + idx = setdidx; + do + { + int kk; + for (kk = 0; kk < j; kk++) + { + if (mvidx[kk] == idx) + { + break; + } + } + if (kk < j) + { + idx--; + } + else + { + setdidx = idx-1; + break; + } + } while(1); + break; + } + } + mvidx[j] = idx; + } + + // 移动数据 + unsigned char tempdat[BYTES_OF_CRY_FACTORS]; + memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS); + + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + tempbuff[j] = tempdat[mvidx[j]]; + } + } + + // 数据加密 + for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++) + { + tempbuff[j] ^= thisfactors[j]; // 异或加密 + pData[i+j] = tempbuff[j]; // 保存 + } + + // 下次的变幻因子 + int temp = 0; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + temp += thisfactors[j]; + temp *= 3; + temp += 1; + temp /= 2; + thisfactors[j] = temp; + } + } + + return 0; +} + +// 解密数据 +int DsrCryption::DeCryption(unsigned char * pData, int size) +{ + if (pData == NULL || size <= 0) + { + return -1; + } + + if (pData == NULL || size <= 0) + { + return -1; + } + + unsigned char thisfactors[BYTES_OF_CRY_FACTORS]; + unsigned char tempbuff[BYTES_OF_CRY_FACTORS]; + + memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS); + + int i, j; + for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS) + { + // 拷贝数据到临时buff + int mv = 0; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + if (i+j < size) + { + tempbuff[j] = pData[i+j]; // 拷贝数据 + } + else + { + tempbuff[j] = 0; + } + + mv += thisfactors[j]; // 累加因子,作为移动因子 + } + + // 数据解密 + for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++) + { + tempbuff[j] ^= thisfactors[j]; + } + + // 数据移动回去 + if (i + BYTES_OF_CRY_FACTORS < size) + { + // 生成移动索引 + unsigned char mvidx[BYTES_OF_CRY_FACTORS]; + int idx, setdidx = BYTES_OF_CRY_FACTORS-1; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + idx = (mv >> j) & 0x1f; + for (int k = 0; k < j; k++) + { + if (mvidx[k] == idx) + { + idx = setdidx; + do + { + int kk; + for (kk = 0; kk < j; kk++) + { + if (mvidx[kk] == idx) + { + break; + } + } + if (kk < j) + { + idx--; + } + else + { + setdidx = idx-1; + break; + } + } while(1); + break; + } + } + mvidx[j] = idx; + } + + // 移动数据 + unsigned char tempdat[BYTES_OF_CRY_FACTORS]; + memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS); + + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + tempbuff[mvidx[j]] = tempdat[j]; + } + } + + // 保存解密数据 + for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++) + { + pData[i+j] = tempbuff[j]; // 保存 + } + + // 下次的变幻因子 + int temp = 0; + for (j = 0; j < BYTES_OF_CRY_FACTORS; j++) + { + temp += thisfactors[j]; + temp *= 3; + temp += 1; + temp /= 2; + thisfactors[j] = temp; + } + } + + return 0; +} + +int DsrCryption::goaDeCryption(unsigned char *pFileData, int nDncryption, int nFileSize) +{ + if (pFileData == NULL || nDncryption == 0 || nFileSize <= 0) + { + return -1; + } + + unsigned char n, biOffset, biTurnOn; + biOffset = (nDncryption >> 8) & 0xFF; + biTurnOn = (nDncryption >> 16) & 0xFF; + + unsigned char* pDataOffset = NULL; //备份移动块数据 + pDataOffset = new unsigned char[biOffset]; + int nLen = nFileSize - biOffset; + + //取反 + for (n = 0; n < biTurnOn; n++) + { + pFileData[n] = ~pFileData[n]; + } + + for (n = 0; n < biOffset; n++) + {//读取移动块数据 + pDataOffset[n] = pFileData[nLen + n]; + } + + for (int k = 0; k < nLen; k++) + {//将数据块右移 biOffset 位 + pFileData[nFileSize - 1 - k] = pFileData[nLen - 1 - k]; + } + + for (n = 0; n < biOffset; n++) + {//将右块数据设置到左边 + pFileData[n] = pDataOffset[n]; + } + + return 0; +} + +int DsrCryption::goaEncryption(unsigned char *pFileData, int nEncryption, int nFileSize) +{ + if (pFileData == NULL || nEncryption == 0 || nFileSize <= 0) return -1; + + unsigned char biOffset = (nEncryption >> 8) & 0xFF; + unsigned char biTurnOn = (nEncryption >> 16) & 0xFF; + + if (biOffset >= nFileSize) return -1; + + unsigned char* pDataOffset = new unsigned char[biOffset]; + int nLen = nFileSize - biOffset; + + // 1. 备份开头 biOffset 字节(它们即将被移到末尾) + for (int n = 0; n < biOffset; n++) { + pDataOffset[n] = pFileData[n]; + } + + // 2. 左移:把中间数据整体左移 biOffset 位 + for (int k = 0; k < nLen; k++) { + pFileData[k] = pFileData[k + biOffset]; + } + + // 3. 把备份放到末尾 + for (int n = 0; n < biOffset; n++) { + pFileData[nLen + n] = pDataOffset[n]; + } + + // 4. 最后取反前 biTurnOn 字节 + for (int n = 0; n < biTurnOn && n < nFileSize; n++) { + pFileData[n] = ~pFileData[n]; + } + + delete[] pDataOffset; + return 0; +} + +// 生成加密字 +int DsrCryption::CreateCryWord(int version) +{ + if (version < 0 || version > 250) + { + return -1; + } + + int rdw; + if (version == 0) + { + rdw = 0; + } + else + { + QTime time= QTime::currentTime(); + qsrand(time.msec()+time.second()*1000); + rdw = qrand(); // 产生随机数 + } + + m_cryword = rdw & 0xffffff; + m_cryword *= 251; + m_cryword += version; + + return 0; +} + +// 生成加密因子 +int DsrCryption::CreateCryFactors(const unsigned char * factors) +{ + if (factors == NULL) + { + return -1; + } + memcpy(m_factors, factors, BYTES_OF_CRY_FACTORS); + + int * pDat = (int*)m_factors; + + // 变幻加密因子,兼容非加密情况 + for (int i = 0; i < BYTES_OF_CRY_FACTORS; i+=sizeof(int)) + { + *pDat *= m_cryword; + pDat++; + } + return 0; +} + + + + + + + diff --git a/datafile/dsrcryption.h b/datafile/dsrcryption.h new file mode 100644 index 0000000..696ed13 --- /dev/null +++ b/datafile/dsrcryption.h @@ -0,0 +1,35 @@ +#ifndef DSRCRYPTION_H +#define DSRCRYPTION_H + +#define CRY_VERSION1 0x01 +#define CRY_VERSION2 0x02 + +#define CUR_CRY_VERSION 0x01 // 当前的加密版本(取值范围为 0 -- 250),方便通过版本使用不同的加密方法。 +#define BYTES_OF_CRY_FACTORS 32 // 加密因子字节数 + + +class DsrCryption +{ +public: + DsrCryption(); + +public: + int InitDsrCryptionCtrl(int version, unsigned int cryword, const unsigned char * factors); // 初始化加密控制, 自动生成生成加密字和加密因子 + unsigned int GetDsrCryptionWord(); // 获取加密字 + + int EnCryption(unsigned char * pData, int size); // 加密数据,使用当前的加密字和加密因子 + int DeCryption(unsigned char * pData, int size); // 解密数据,使用当前的加密字和加密因子 + int goaDeCryption(unsigned char * pFileData, int nDncryption, int nFileSize); // 解密数据,再登高,与富怡加密方法不同 + int goaEncryption(unsigned char *pFileData, int nEncryption, int nFileSize); //加密 + +private: + int CreateCryWord(int version); // 生成加密字 + int CreateCryFactors(const unsigned char * factors); // 生成加密因子 + +private: + int m_initflag; + unsigned int m_cryword; + unsigned char m_factors[BYTES_OF_CRY_FACTORS]; +}; + +#endif // DSRCRYPTION_H diff --git a/datafile/dxf/dxfhelper.cpp b/datafile/dxf/dxfhelper.cpp new file mode 100644 index 0000000..b2000fc --- /dev/null +++ b/datafile/dxf/dxfhelper.cpp @@ -0,0 +1,520 @@ +#include "dxfhelper.h" +#include "dxfreader.h" + +#include +#include + +DxfHelper::DxfHelper() +{ + +} + +double norm(double x, double y) +{ + return sqrt(x * x + y * y); +} + +QList DxfHelper::expandPolygon(QList polygon, float expand) +{ + QList new_polygon; + int len = polygon.length(); + if(len<3||qFuzzyIsNull(expand)) return polygon; + + bool repeatFlag = false; + if(polygon.first()==polygon.back()) { + repeatFlag = true; + polygon.removeLast(); + len = polygon.length(); + } + + int convertNum = 0; + for (int i = 0; i < len; i++) + { + QVector3D p = polygon[i]; + QVector3D p1 = polygon[i == 0 ? len - 1 : i - 1]; + QVector3D p2 = polygon[i == len - 1 ? 0 : i + 1]; + float v1x = p1.x() - p.x(); + float v1y = p1.y() - p.y(); + float n1 = norm(v1x, v1y); + float vv1x = v1x / n1; + float vv1y = v1y / n1; + float v2x = p2.x() - p.x(); + float v2y = p2.y() - p.y(); + float n2 = norm(v2x, v2y); + float vv2x = v2x / n2; + float vv2y = v2y / n2; + float vectorLen = -expand / sqrt((1 - (vv1x * vv2x + vv1y * vv2y)) / 2.0f); + float judge = v1x * v2y - v2x * v1y; + if (judge < 0) vectorLen *= -1; + if (judge < 0) convertNum++; + float vx = vv1x + vv2x; + float vy = vv1y + vv2y; + vectorLen = vectorLen / norm(vx, vy); + vx *= vectorLen; + vy *= vectorLen; + new_polygon.append(QVector3D(vx + p.x(), vy + p.y(), 0)); + } + if(convertNum==len) { + new_polygon.clear(); + for (int i = 0; i < len; i++) + { + QVector3D p = polygon[i]; + QVector3D p1 = polygon[i == 0 ? len - 1 : i - 1]; + QVector3D p2 = polygon[i == len - 1 ? 0 : i + 1]; + float v1x = p1.x() - p.x(); + float v1y = p1.y() - p.y(); + float n1 = norm(v1x, v1y); + float vv1x = v1x / n1; + float vv1y = v1y / n1; + float v2x = p2.x() - p.x(); + float v2y = p2.y() - p.y(); + float n2 = norm(v2x, v2y); + float vv2x = v2x / n2; + float vv2y = v2y / n2; + float vectorLen = -expand / sqrt((1 - (vv1x * vv2x + vv1y * vv2y)) / 2.0f); + float vx = vv1x + vv2x; + float vy = vv1y + vv2y; + vectorLen = vectorLen / norm(vx, vy); + vx *= vectorLen; + vy *= vectorLen; + new_polygon.append(QVector3D(vx + p.x(), vy + p.y(), 0)); + } + } + + if(repeatFlag) new_polygon.append(new_polygon.first()); + + return new_polygon; +} + +bool DxfHelper::generateDxf(const QString &fileName) +{ +// currentPos = QPointF(QRandomGenerator::global()->bounded(9999.99), QRandomGenerator::global()->bounded(9999.99)); + currentPos = QPointF(9999.99, 9999.99); + vertexIndex = 0; + controlIndex = 0; + dxfPaths.clear(); + + DxfReader dxfReader(fileName); + for(auto d: dxfReader.dxfText) { + //qDebug() << "text data:" << d.text.c_str() << d.angle << d.style.c_str() << d.height; + } + + for(auto d: dxfReader.dxfLinetypes) { + //qDebug() << "linetypes data:" << d.name.c_str() << d.flags << d.pattern << d.description.c_str() << d.patternLength << d.numberOfDashes; + } + + QVector linepath; + for(auto d: dxfReader.dxfLines) { + //qDebug() << "line data:" << d.x1 << d.y1 << d.z1 << "," << d.x2 << d.y2 << d.z2; + if(currentPos!=QPointF(d.x1, d.y1)) { + if(!linepath.isEmpty()) { + QList linelist; + foreach(auto point, linepath) linelist.append(QVector3D(point)); + linepath.clear(); + linelist = expandPolygon(linelist, expandOffset); + foreach(QVector3D point, linelist) { + double x = point.x(); + double y = point.y(); + linepath.append(QPointF(x, y)); + currentPos = QPointF(x, y); + } + dxfPaths.append(linepath); + linepath.clear(); + } + linepath.append(QPointF(d.x1, d.y1)); + linepath.append(QPointF(d.x2, d.y2)); + currentPos = QPointF(d.x2, d.y2); + } else { + linepath.append(QPointF(d.x2, d.y2)); + currentPos = QPointF(d.x2, d.y2); + } + } + if(!linepath.isEmpty()) { + QList linelist; + foreach(auto point, linepath) linelist.append(QVector3D(point)); + linepath.clear(); + linelist = expandPolygon(linelist, expandOffset); + foreach(QVector3D point, linelist) { + double x = point.x(); + double y = point.y(); + linepath.append(QPointF(x, y)); + currentPos = QPointF(x, y); + } + dxfPaths.append(linepath); + linepath.clear(); + } + + + for(auto d: dxfReader.dxfArcs) { + //qDebug() << "arcs data:" << d.cx << d.cy << d.cz << d.angle1 << d.angle2 << d.radius; + + + double cx = d.cx; + double cy = d.cy; +// double cz = d.cz; + double angle1 = d.angle1; + double angle2 = d.angle2; + double radius = d.radius; + + radius = radius + expandOffset; + + + QPainterPath path; + double startXPos = cx + cos(abs(angle1)*M_PI/180)*radius; + double startYPos = cy + sin(abs(angle1)*M_PI/180)*radius; + + path.moveTo(startXPos, startYPos); + + double angleStart ,anglePassed; + angleStart = angle1; + if(angleStart>=180) angleStart = angleStart-360; + anglePassed = angleStart-angle2; + if(angleStart<180) angleStart = -angleStart; + if(anglePassed<-360) anglePassed = anglePassed+360; + + QRectF rect(cx-radius, cy-radius, 2*radius, 2*radius); + path.arcTo(rect, angleStart, anglePassed); + + QVector arcpath; + for(double i = 0; i <= 1; i += 0.003) { // TODO: 步长随图片大小调整 + QPointF point = path.pointAtPercent(i); + double x = point.x(); + double y = point.y(); + arcpath.append(point); + currentPos=QPointF(x, y); + } + dxfPaths.append(arcpath); +// dxfPathList.append(path); + } + + for(auto d: dxfReader.dxfCircles) { + //qDebug() << "circle data:" << d.cx << d.cy << d.cz << d.radius; + + + double cx = d.cx; + double cy = d.cy; +// double cz = d.cz; + double radius = d.radius; + + radius = radius + expandOffset; + + + QPainterPath path; + path.moveTo(cx+radius, cy); + path.arcTo(cx-radius, cy-radius, 2*radius, 2*radius, 0, 360); + + QVector circlepath; + for(double i = 0; i <= 1; i += 0.003) { // TODO: 步长随图片大小调整 + QPointF point = path.pointAtPercent(i); + double x = point.x(); + double y = point.y(); + circlepath.append(point); + currentPos=QPointF(x, y); + } + dxfPaths.append(circlepath); +// dxfPathList.append(path); + } + + for(auto d: dxfReader.dxfEllipses) { // 起点角度要×ratio + //qDebug() << "ellipses data:" << d.cx << d.cy << d.cz << d.mx << d.my << d.mz << d.ratio << d.angle1 << d.angle2; + + double cx = d.cx; + double cy = d.cy; +// double cz = d.cz; + double mx = d.mx; + double my = d.my; +// double mz = d.mz; + double ratio = d.ratio; + double angle1 = d.angle1; + double angle2 = d.angle2; + + + double rab = sqrt((cx- mx)*(cx - mx) +(cy - my)*(cy - my)); + double resy = (expandOffset*(my-cy))/rab + my; + double resx = (expandOffset*(mx-cx))/rab + mx; + + mx = resx; + my = resy; + + + QPainterPath path; + double angle_1 = angle1; + double angle_2 = angle2; + while(angle_1>=3.14&&angle_2>=6.28) { + angle_1 -= M_PI; + angle_2 -= M_PI; + } + angle_1 = angle_1*180/M_PI; + angle_2 = angle_2*180/M_PI; + + double angleStart ,anglePassed; + angleStart = angle_1; + if(angleStart>=180) angleStart = angleStart-360; + anglePassed = angleStart-angle_2; + if(angleStart<180) angleStart = -angleStart; + if(anglePassed<-360) anglePassed = anglePassed+360; + + if(abs(anglePassed)<1) anglePassed = 360; + + double c_x = cx; + double c_y = cy; + double dl = sqrt(mx*mx+my*my); + double ds = dl*ratio; + + double rx; + double ry; + if(qFuzzyIsNull(mx)) { + rx = ds; ry = dl; + angleStart += 90; + } else { + rx = dl; ry = ds; + } + + double angle=angleStart; + if(angle<0) angle=-angle; + else if(angle>=0) angle = 360-angle; + //if(!qFuzzyCompare(abs(anglePassed),360)) angle *= ratio; + if(!qFuzzyCompare(float(anglePassed),(float)360)) angle *= ratio; + double a=qDegreesToRadians(angle); + double R=rx*ry/sqrt(pow(rx*sin(a),2)+pow(ry*cos(a),2)); //计算对应角度的半径 + double startXPos=c_x+R*cos(a); + double startYPos=c_y+R*sin(a); + path.moveTo(startXPos, startYPos); + + //qDebug() << c_x << c_y << rx << ry << angleStart << anglePassed << angle; + path.arcTo(c_x-rx, c_y-ry, 2*rx, 2*ry, angleStart, anglePassed); + + QVector ellipsepath; + for(double i = 0; i <= 1; i += 0.003) { // TODO: 步长随图片大小调整 + QPointF point = path.pointAtPercent(i); + double x = point.x(); + double y = point.y(); + ellipsepath.append(point); + currentPos=QPointF(x, y); + } + dxfPaths.append(ellipsepath); +// dxfPathList.append(path); + } + + for(auto d: dxfReader.dxfPolylines) { + //qDebug() << "polylines data:" << d.m << d.n << d.flags << d.number << d.elevation; + + QList pointlist; + QVector path; + for(unsigned int i = 0; i < d.number; i++) { + double x = dxfReader.dxfVertexs.at(vertexIndex).x; + double y = dxfReader.dxfVertexs.at(vertexIndex).y; + double z = dxfReader.dxfVertexs.at(vertexIndex).z; + pointlist.append(QVector3D(x, y, z)); + vertexIndex++; + } + + pointlist = expandPolygon(pointlist, expandOffset); + foreach(QVector3D point, pointlist) { + double x = point.x(); + double y = point.y(); + path.append(QPointF(x, y)); + currentPos = QPointF(x, y); + } + + if(d.flags) { + double x = pointlist.first().x(); + double y = pointlist.first().y(); + path.append(QPointF(x, y)); + currentPos = QPointF(x, y); + } + dxfPaths.append(path); + } + +// for(auto d: dxfReader.dxfVertexs) { +// qDebug() << "vertexs data:" << d.x << d.y << d.z << d.bulge; +// } + + for(auto d: dxfReader.dxfPoints) { + //qDebug() << "points data:" << d.x << d.y << d.z; + QVector path; + path.append(QPointF(d.x, d.y)); + dxfPaths.append(path); + currentPos = QPointF(d.x, d.y); + } + + for(auto d: dxfReader.dxfSplines) { + //qDebug() << "splines data:" << d.nFit << d.flags << d.degree << d.nKnots << d.nControl << d.tangentEndX << d.tangentEndY << d.tangentEndZ << d.tangentStartX << d.tangentStartY << d.tangentStartZ; + std::vector pointList; + for(unsigned int i = 0; i < d.nControl; i++) { + int x = dxfReader.dxfControlPoints.at(controlIndex).x; + int y = dxfReader.dxfControlPoints.at(controlIndex).y; + pointList.push_back(QVector2D(x, y)); + currentPos = QPointF(x, y); + controlIndex++; + } + + QList templist; + foreach(auto point, pointList) templist.append(point); + templist = expandPolygon(templist, expandOffset); + + QVector inputList; + foreach(auto point, templist) inputList.append(point.toVector2D()); + inputList.push_front(inputList.first()); + inputList.push_back(inputList.back()); +// std::vector finalList(inputList.begin(), inputList.end()); + +// SplineHelper splineHelper(finalList, TypeCubicBSpline); +// auto splinePath = splineHelper.getSplinePath(); + +// dxfPaths.append(splinePath); + } + +// for(auto d: dxfReader.dxfControlPoints) { +// qDebug() << "control points data:" << d.w << d.x << d.y << d.z; +// } + +// for(auto d: dxfReader.dxfXLines) { +// qDebug() << "XLines data:" << d.bx << d.by << d.bz << d.dx << d.dy << d.dz; +// } + +// for(auto d: dxfReader.dxfRays) { +// qDebug() << "rays data:" << d.bx << d.by << d.bz << d.dx << d.dy << d.dz; +// } + +// for(auto d: dxfReader.dxfFitPoints) { +// qDebug() << "fit points data:" << d.x << d.y << d.z; +// } + +// for(auto d: dxfReader.dxfHatchs) { +// qDebug() << "hatchs data:" << d.angle << d.scale << d.solid << d.originX << d.originY << d.pattern.c_str() << d.numLoops; +// } + +// for(auto d: dxfReader.dxfHatchLoops) { +// qDebug() << "hatchLoops data:" << d.numEdges; +// } + +// for(auto d: dxfReader.dxfHatchEdges) { +// qDebug() << "hatchEdges data:" << d.cx << d.cy << d.mx << d.my << d.x1 << d.y1 << d.x2 << d.y2 << d.ccw << d.nFit << d.ratio << d.angle1 << d.angle2 << d.degree << d.nKnots << d.radius << d.defined << d.weights << d.nControl << d.periodic << d.rational << d.vertices << d.fitPoints << d.endTangentX << d.endTangentY << d.endTangentY << d.controlPoints << d.startTangentX << d.startTangentY; +// } + + return true; +} + +void DxfHelper::matchDXFSize() +{ + double minx = __DBL_MAX__; + double maxx = __DBL_MIN__; + double miny = __DBL_MAX__; + double maxy = __DBL_MIN__; + foreach (QVector path, dxfPaths) { + for(int i = 0; i < path.length(); i++) { + QPointF point = path.at(i); + double x = point.x(); + double y = point.y(); + if(xmaxx) maxx = x; + if(ymaxy) maxy = y; + } + } + int width = maxx - minx; + int height = maxy - miny; + imageSize = QSize(width, height); + dxfBorderList.clear(); + dxfBorderList.append(minx); + dxfBorderList.append(miny); + dxfBorderList.append(maxx); + dxfBorderList.append(maxy); +} + +QImage DxfHelper::generateDXFImage() +{ + matchDXFSize(); + double minx = dxfBorderList.at(0); + double miny = dxfBorderList.at(1); + int penwidth = imageSize.width()/400; + int border = penwidth; + QImage image((imageSize.width()+2*border), (imageSize.height()+2*border), QImage::Format_ARGB32); + image.fill(Qt::white); + QPainter p(&image); + p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); // 抗锯齿和使用平滑转换算法 + QPen pen; + if(penwidth<1) penwidth = 1; + pen.setWidth(penwidth); + pen.setColor(Qt::black); + p.setPen(pen); + QPainterPath painterpath; + foreach (QVector path, dxfPaths) { + for(int i = 0; i < path.length(); i++) { + double x = path.at(i).x()-minx; + double y = path.at(i).y()-miny; + y = imageSize.height()-y; + x += border; + y += border; + QPointF point(x, y); + if(i == 0) painterpath.moveTo(point); + else painterpath.lineTo(point); + } +// dxfPathList.append(painterpath); + } + //qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]\t"<< "dxf path length:" < DxfHelper::getDxfBorderList() const +{ + return dxfBorderList; +} + +QSize DxfHelper::getImageSize() const +{ + return imageSize; +} + +QList DxfHelper::getDxfPathList() const +{ + return dxfPathList; +} + +QVector > DxfHelper::getDxfPaths() const +{ + return dxfPaths; +} + +QList DxfHelper::getDxfLineList() const +{ + return dxfLineList; +} + +QList DxfHelper::getDxfRectList() const +{ + return dxfRectList; +} + +QList DxfHelper::getDxfArcList() const +{ + return dxfArcList; +} + +QList DxfHelper::getDxfCircleList() const +{ + return dxfCircleList; +} + +QList DxfHelper::getDxfEllipseList() const +{ + return dxfEllipseList; +} + +QList DxfHelper::getDxfPolylineList() const +{ + return dxfPolylineList; +} + +QList DxfHelper::getDxfSplineList() const +{ + return dxfSplineList; +} + +void DxfHelper::setExpandOffset(double value) +{ + expandOffset = value; +} diff --git a/datafile/dxf/dxfhelper.h b/datafile/dxf/dxfhelper.h new file mode 100644 index 0000000..14e160a --- /dev/null +++ b/datafile/dxf/dxfhelper.h @@ -0,0 +1,110 @@ +#ifndef DXFHELPER_H +#define DXFHELPER_H + +#include +//#include +#include +#include +#include +#include +#include +//#include + +struct DXFLine { + double x1; + double y1; + double z1; + double x2; + double y2; + double z2; +}; + +struct DXFRect { + QList list; +}; + + +struct DXFArc { + double cx; + double cy; + double cz; + double angle1; + double angle2; + double radius; +}; + +struct DXFCircle { + double cx; + double cy; + double cz; + double radius; +}; + +struct DXFEllipse { + double cx; + double cy; + double cz; + double mx; + double my; + double mz; + double angle1; + double angle2; + double ratio; +}; + +struct DXFPolyline { + double flags; + double number; + QList list; +}; + +struct DXFSpline { + double nControl; + QList controlPoints; +}; + + +class DxfHelper +{ +public: + DxfHelper(); + QList expandPolygon(QList polygon, float expand); + bool generateDxf(const QString &fileName); + QVector> getDxfPaths() const; + + QList getDxfLineList() const; + QList getDxfRectList() const; + QList getDxfArcList() const; + QList getDxfCircleList() const; + QList getDxfEllipseList() const; + QList getDxfPolylineList() const; + QList getDxfSplineList() const; + + void setExpandOffset(double value); + + void matchDXFSize(); + QImage generateDXFImage(); + QList getDxfPathList() const; + QSize getImageSize() const; + QList getDxfBorderList() const; +private: + QPointF currentPos; + unsigned int vertexIndex = 0; + unsigned int controlIndex = 0; + QVector> dxfPaths; + QList dxfPathList; + + double expandOffset = 0; + + QList dxfLineList; + QList dxfRectList; + QList dxfArcList; + QList dxfCircleList; + QList dxfEllipseList; + QList dxfPolylineList; + QList dxfSplineList; + QList dxfBorderList; + QSize imageSize; +}; + +#endif // DXFHELPER_H diff --git a/datafile/dxf/dxflib/dl_attributes.h b/datafile/dxf/dxflib/dl_attributes.h new file mode 100644 index 0000000..00f9ddc --- /dev/null +++ b/datafile/dxf/dxflib/dl_attributes.h @@ -0,0 +1,237 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_ATTRIBUTES_H +#define DL_ATTRIBUTES_H + +#include "dl_global.h" + +#include +#include + +#include "dl_codes.h" + +/** + * Storing and passing around attributes. Attributes + * are the layer name, color, width and line type. + * + * @author Andrew Mustun + */ +class DXFLIB_EXPORT DL_Attributes { + +public: + + /** + * Default constructor. + */ + DL_Attributes() : + layer(""), + color(0), + color24(-1), + width(0), + linetype("BYLAYER"), + linetypeScale(1.0), + handle(-1), + inPaperSpace(false) { + } + + /** + * Constructor for DXF attributes. + * + * @param layer Layer name for this entity or NULL for no layer + * (every entity should be on a named layer!). + * @param color Color number (0..256). 0 = BYBLOCK, 256 = BYLAYER. + * @param width Line thickness. Defaults to zero. -1 = BYLAYER, + * -2 = BYBLOCK, -3 = default width + * @param linetype Line type name or "BYLAYER" or "BYBLOCK". Defaults + * to "BYLAYER" + */ + DL_Attributes(const std::string& layer, + int color, int width, + const std::string& linetype, + double linetypeScale) : + layer(layer), + color(color), + color24(-1), + width(width), + linetype(linetype), + linetypeScale(linetypeScale), + handle(-1), + inPaperSpace(false) { + + } + + /** + * Constructor for DXF attributes. + * + * @param layer Layer name for this entity or NULL for no layer + * (every entity should be on a named layer!). + * @param color Color number (0..256). 0 = BYBLOCK, 256 = BYLAYER. + * @param color24 24 bit color (0x00RRGGBB, see DXF reference). + * @param width Line thickness. Defaults to zero. -1 = BYLAYER, + * -2 = BYBLOCK, -3 = default width + * @param linetype Line type name or "BYLAYER" or "BYBLOCK". Defaults + * to "BYLAYER" + */ + DL_Attributes(const std::string& layer, + int color, int color24, int width, + const std::string& linetype, + int handle=-1) : + layer(layer), + color(color), + color24(color24), + width(width), + linetype(linetype), + linetypeScale(1.0), + handle(handle), + inPaperSpace(false) { + } + + /** + * Sets the layer. If the given pointer points to NULL, the + * new layer name will be an empty but valid string. + */ + void setLayer(const std::string& layer) { + this->layer = layer; + } + + /** + * @return Layer name. + */ + std::string getLayer() const { + return layer; + } + + /** + * Sets the color. + * + * @see DL_Codes, dxfColors + */ + void setColor(int color) { + this->color = color; + } + + /** + * Sets the 24bit color. + * + * @see DL_Codes, dxfColors + */ + void setColor24(int color) { + this->color24 = color; + } + + /** + * @return Color. + * + * @see DL_Codes, dxfColors + */ + int getColor() const { + return color; + } + + /** + * @return 24 bit color or -1 if no 24bit color is defined. + * + * @see DL_Codes, dxfColors + */ + int getColor24() const { + return color24; + } + + /** + * Sets the width. + */ + void setWidth(int width) { + this->width = width; + } + + /** + * @return Width. + */ + int getWidth() const { + return width; + } + + /** + * Sets the line type. This can be any string and is not + * checked to be a valid line type. + */ + void setLinetype(const std::string& linetype) { + this->linetype = linetype; + } + + /** + * Sets the entity specific line type scale. + */ + void setLinetypeScale(double linetypeScale) { + this->linetypeScale = linetypeScale; + } + + double getLinetypeScale() const { + return linetypeScale; + } + + /** + * @return Line type. + */ + std::string getLinetype() const { + if (linetype.length()==0) { + return "BYLAYER"; + } else { + return linetype; + } + } + + void setHandle(int h) { + handle = h; + } + + int getHandle() const { + return handle; + } + + void setInPaperSpace(bool on) { + inPaperSpace = on; + } + + bool isInPaperSpace() const { + return inPaperSpace; + } + +private: + std::string layer; + int color; + int color24; + int width; + std::string linetype; + double linetypeScale; + int handle; + + // DXF code 67 (true: entity in paper space, false: entity in model space (default): + bool inPaperSpace; +}; + +#endif + +// EOF diff --git a/datafile/dxf/dxflib/dl_codes.h b/datafile/dxf/dxflib/dl_codes.h new file mode 100644 index 0000000..99ae5b6 --- /dev/null +++ b/datafile/dxf/dxflib/dl_codes.h @@ -0,0 +1,546 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** Copyright (C) 2001 Robert J. Campbell Jr. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/** + * Defines common DXF codes and constants. + */ + +#ifndef DXF_CODES_H +#define DXF_CODES_H + +#include "dl_global.h" + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +//#if defined(__OS2__)||defined(__EMX__) +//#define strcasecmp(s,t) stricmp(s,t) +//#endif + +//#if defined(_WIN32) +//#define strcasecmp(s,t) _stricmp(s,t) +//#endif + + +#ifdef _WIN32 +#undef M_PI +#define M_PI 3.14159265358979323846 +//#pragma warning(disable : 4800) +#endif + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +#define DL_DXF_MAXLINE 1024 +#define DL_DXF_MAXGROUPCODE 1100 + +// used to mark invalid vectors: +//#define DL_DXF_MAXDOUBLE 1.0E+10 + +/** + * Codes for colors and DXF versions. + */ +class DXFLIB_EXPORT DL_Codes { +public: + /** + * Standard DXF colors. + */ + enum color { + black = 250, + green = 3, + red = 1, + brown = 15, + yellow = 2, + cyan = 4, + magenta = 6, + gray = 8, + blue = 5, + l_blue = 163, + l_green = 121, + l_cyan = 131, + l_red = 23, + l_magenta = 221, + l_gray = 252, + white = 7, + bylayer = 256, + byblock = 0 + }; + + /** + * Version numbers for the DXF Format. + */ + enum version { + AC1009_MIN, // R12, minimalistic + AC1009, // R12 + AC1012, + AC1014, + AC1015 // R2000 + }; +}; + + +// Extended color palette: +// The first entry is only for direct indexing starting with [1] +// Color 1 is red (1,0,0) +const double dxfColors[][3] = { + {0,0,0}, // unused + {1,0,0}, // 1 + {1,1,0}, + {0,1,0}, + {0,1,1}, + {0,0,1}, + {1,0,1}, + {1,1,1}, // black or white + {0.5,0.5,0.5}, + {0.75,0.75,0.75}, + {1,0,0}, // 10 + {1,0.5,0.5}, + {0.65,0,0}, + {0.65,0.325,0.325}, + {0.5,0,0}, + {0.5,0.25,0.25}, + {0.3,0,0}, + {0.3,0.15,0.15}, + {0.15,0,0}, + {0.15,0.075,0.075}, + {1,0.25,0}, // 20 + {1,0.625,0.5}, + {0.65,0.1625,0}, + {0.65,0.4063,0.325}, + {0.5,0.125,0}, + {0.5,0.3125,0.25}, + {0.3,0.075,0}, + {0.3,0.1875,0.15}, + {0.15,0.0375,0}, + {0.15,0.0938,0.075}, + {1,0.5,0}, // 30 + {1,0.75,0.5}, + {0.65,0.325,0}, + {0.65,0.4875,0.325}, + {0.5,0.25,0}, + {0.5,0.375,0.25}, + {0.3,0.15,0}, + {0.3,0.225,0.15}, + {0.15,0.075,0}, + {0.15,0.1125,0.075}, + {1,0.75,0}, // 40 + {1,0.875,0.5}, + {0.65,0.4875,0}, + {0.65,0.5688,0.325}, + {0.5,0.375,0}, + {0.5,0.4375,0.25}, + {0.3,0.225,0}, + {0.3,0.2625,0.15}, + {0.15,0.1125,0}, + {0.15,0.1313,0.075}, + {1,1,0}, // 50 + {1,1,0.5}, + {0.65,0.65,0}, + {0.65,0.65,0.325}, + {0.5,0.5,0}, + {0.5,0.5,0.25}, + {0.3,0.3,0}, + {0.3,0.3,0.15}, + {0.15,0.15,0}, + {0.15,0.15,0.075}, + {0.75,1,0}, // 60 + {0.875,1,0.5}, + {0.4875,0.65,0}, + {0.5688,0.65,0.325}, + {0.375,0.5,0}, + {0.4375,0.5,0.25}, + {0.225,0.3,0}, + {0.2625,0.3,0.15}, + {0.1125,0.15,0}, + {0.1313,0.15,0.075}, + {0.5,1,0}, // 70 + {0.75,1,0.5}, + {0.325,0.65,0}, + {0.4875,0.65,0.325}, + {0.25,0.5,0}, + {0.375,0.5,0.25}, + {0.15,0.3,0}, + {0.225,0.3,0.15}, + {0.075,0.15,0}, + {0.1125,0.15,0.075}, + {0.25,1,0}, // 80 + {0.625,1,0.5}, + {0.1625,0.65,0}, + {0.4063,0.65,0.325}, + {0.125,0.5,0}, + {0.3125,0.5,0.25}, + {0.075,0.3,0}, + {0.1875,0.3,0.15}, + {0.0375,0.15,0}, + {0.0938,0.15,0.075}, + {0,1,0}, // 90 + {0.5,1,0.5}, + {0,0.65,0}, + {0.325,0.65,0.325}, + {0,0.5,0}, + {0.25,0.5,0.25}, + {0,0.3,0}, + {0.15,0.3,0.15}, + {0,0.15,0}, + {0.075,0.15,0.075}, + {0,1,0.25}, // 100 + {0.5,1,0.625}, + {0,0.65,0.1625}, + {0.325,0.65,0.4063}, + {0,0.5,0.125}, + {0.25,0.5,0.3125}, + {0,0.3,0.075}, + {0.15,0.3,0.1875}, + {0,0.15,0.0375}, + {0.075,0.15,0.0938}, + {0,1,0.5}, // 110 + {0.5,1,0.75}, + {0,0.65,0.325}, + {0.325,0.65,0.4875}, + {0,0.5,0.25}, + {0.25,0.5,0.375}, + {0,0.3,0.15}, + {0.15,0.3,0.225}, + {0,0.15,0.075}, + {0.075,0.15,0.1125}, + {0,1,0.75}, // 120 + {0.5,1,0.875}, + {0,0.65,0.4875}, + {0.325,0.65,0.5688}, + {0,0.5,0.375}, + {0.25,0.5,0.4375}, + {0,0.3,0.225}, + {0.15,0.3,0.2625}, + {0,0.15,0.1125}, + {0.075,0.15,0.1313}, + {0,1,1}, // 130 + {0.5,1,1}, + {0,0.65,0.65}, + {0.325,0.65,0.65}, + {0,0.5,0.5}, + {0.25,0.5,0.5}, + {0,0.3,0.3}, + {0.15,0.3,0.3}, + {0,0.15,0.15}, + {0.075,0.15,0.15}, + {0,0.75,1}, // 140 + {0.5,0.875,1}, + {0,0.4875,0.65}, + {0.325,0.5688,0.65}, + {0,0.375,0.5}, + {0.25,0.4375,0.5}, + {0,0.225,0.3}, + {0.15,0.2625,0.3}, + {0,0.1125,0.15}, + {0.075,0.1313,0.15}, + {0,0.5,1}, // 150 + {0.5,0.75,1}, + {0,0.325,0.65}, + {0.325,0.4875,0.65}, + {0,0.25,0.5}, + {0.25,0.375,0.5}, + {0,0.15,0.3}, + {0.15,0.225,0.3}, + {0,0.075,0.15}, + {0.075,0.1125,0.15}, + {0,0.25,1}, // 160 + {0.5,0.625,1}, + {0,0.1625,0.65}, + {0.325,0.4063,0.65}, + {0,0.125,0.5}, + {0.25,0.3125,0.5}, + {0,0.075,0.3}, + {0.15,0.1875,0.3}, + {0,0.0375,0.15}, + {0.075,0.0938,0.15}, + {0,0,1}, // 170 + {0.5,0.5,1}, + {0,0,0.65}, + {0.325,0.325,0.65}, + {0,0,0.5}, + {0.25,0.25,0.5}, + {0,0,0.3}, + {0.15,0.15,0.3}, + {0,0,0.15}, + {0.075,0.075,0.15}, + {0.25,0,1}, // 180 + {0.625,0.5,1}, + {0.1625,0,0.65}, + {0.4063,0.325,0.65}, + {0.125,0,0.5}, + {0.3125,0.25,0.5}, + {0.075,0,0.3}, + {0.1875,0.15,0.3}, + {0.0375,0,0.15}, + {0.0938,0.075,0.15}, + {0.5,0,1}, // 190 + {0.75,0.5,1}, + {0.325,0,0.65}, + {0.4875,0.325,0.65}, + {0.25,0,0.5}, + {0.375,0.25,0.5}, + {0.15,0,0.3}, + {0.225,0.15,0.3}, + {0.075,0,0.15}, + {0.1125,0.075,0.15}, + {0.75,0,1}, // 200 + {0.875,0.5,1}, + {0.4875,0,0.65}, + {0.5688,0.325,0.65}, + {0.375,0,0.5}, + {0.4375,0.25,0.5}, + {0.225,0,0.3}, + {0.2625,0.15,0.3}, + {0.1125,0,0.15}, + {0.1313,0.075,0.15}, + {1,0,1}, // 210 + {1,0.5,1}, + {0.65,0,0.65}, + {0.65,0.325,0.65}, + {0.5,0,0.5}, + {0.5,0.25,0.5}, + {0.3,0,0.3}, + {0.3,0.15,0.3}, + {0.15,0,0.15}, + {0.15,0.075,0.15}, + {1,0,0.75}, // 220 + {1,0.5,0.875}, + {0.65,0,0.4875}, + {0.65,0.325,0.5688}, + {0.5,0,0.375}, + {0.5,0.25,0.4375}, + {0.3,0,0.225}, + {0.3,0.15,0.2625}, + {0.15,0,0.1125}, + {0.15,0.075,0.1313}, + {1,0,0.5}, // 230 + {1,0.5,0.75}, + {0.65,0,0.325}, + {0.65,0.325,0.4875}, + {0.5,0,0.25}, + {0.5,0.25,0.375}, + {0.3,0,0.15}, + {0.3,0.15,0.225}, + {0.15,0,0.075}, + {0.15,0.075,0.1125}, + {1,0,0.25}, // 240 + {1,0.5,0.625}, + {0.65,0,0.1625}, + {0.65,0.325,0.4063}, + {0.5,0,0.125}, + {0.5,0.25,0.3125}, + {0.3,0,0.075}, + {0.3,0.15,0.1875}, + {0.15,0,0.0375}, + {0.15,0.075,0.0938}, + {0.33,0.33,0.33}, // 250 + {0.464,0.464,0.464}, + {0.598,0.598,0.598}, + {0.732,0.732,0.732}, + {0.866,0.866,0.866}, + {1,1,1} // 255 + } + ; + + +// AutoCAD VERSION aliases +#define DL_VERSION_R12 DL_Codes::AC1009 +#define DL_VERSION_LT2 DL_Codes::AC1009 +#define DL_VERSION_R13 DL_Codes::AC1012 // not supported yet +#define DL_VERSION_LT95 DL_Codes::AC1012 // not supported yet +#define DL_VERSION_R14 DL_Codes::AC1014 // not supported yet +#define DL_VERSION_LT97 DL_Codes::AC1014 // not supported yet +#define DL_VERSION_LT98 DL_Codes::AC1014 // not supported yet +#define DL_VERSION_2000 DL_Codes::AC1015 +#define DL_VERSION_2002 DL_Codes::AC1015 + + +// DXF Group Codes: + +// Strings +#define DL_STRGRP_START 0 +#define DL_STRGRP_END 9 + +// Coordinates +#define DL_CRDGRP_START 10 +#define DL_CRDGRP_END 19 + +// Real values +#define DL_RLGRP_START 38 +#define DL_RLGRP_END 59 + +// Short integer values +#define DL_SHOGRP_START 60 +#define DL_SHOGRP_END 79 + +// New in Release 13, +#define DL_SUBCLASS 100 + +// More coordinates +#define DL_CRD2GRP_START 210 +#define DL_CRD2GRP_END 239 + +// Extended data strings +#define DL_ESTRGRP_START 1000 +#define DL_ESTRGRP_END 1009 + +// Extended data reals +#define DL_ERLGRP_START 1010 +#define DL_ERLGRP_END 1059 + + +#define DL_Y8_COORD_CODE 28 +#define DL_Z0_COORD_CODE 30 +#define DL_Z8_COORD_CODE 38 + +#define DL_POINT_COORD_CODE 10 +#define DL_INSERT_COORD_CODE 10 + +#define DL_CRD2GRP_START 210 +#define DL_CRD2GRP_END 239 + +#define DL_THICKNESS 39 +#define DL_FIRST_REAL_CODE THICKNESS +#define DL_LAST_REAL_CODE 59 +#define DL_FIRST_INT_CODE 60 +#define DL_ATTFLAGS_CODE 70 +#define DL_PLINE_FLAGS_CODE 70 +#define DL_LAYER_FLAGS_CODE 70 +#define DL_FLD_LEN_CODE 73 // Inside ATTRIB resbuf +#define DL_LAST_INT_CODE 79 +#define DL_X_EXTRU_CODE 210 +#define DL_Y_EXTRU_CODE 220 +#define DL_Z_EXTRU_CODE 230 +#define DL_COMMENT_CODE 999 + +// Start and endpoints of a line +#define DL_LINE_START_CODE 10 // Followed by x coord +#define DL_LINE_END_CODE 11 // Followed by x coord + +// Some codes used by blocks +#define DL_BLOCK_FLAGS_CODE 70 // An int containing flags +#define DL_BLOCK_BASE_CODE 10 // Origin of block definition +#define DL_XREF_DEPENDENT 16 // If a block contains an XREF +#define DL_XREF_RESOLVED 32 // If a XREF resolved ok +#define DL_REFERENCED 64 // If a block is ref'd in DWG + +#define DL_XSCALE_CODE 41 +#define DL_YSCALE_CODE 42 +#define DL_ANGLE_CODE 50 +#define DL_INS_POINT_CODE 10 // Followed by x of ins pnt +#define DL_NAME2_CODE 3 // Second appearance of name + +// Some codes used by circle entities +#define DL_CENTER_CODE 10 // Followed by x of center +#define DL_RADIUS_CODE 40 // Followd by radius of circle + +#define DL_COND_OP_CODE -4 // Conditional op,ads_ssget + +// When using ads_buildlist you MUST use RTDXF0 instead of these +#define DL_ENTITY_TYPE_CODE 0 // Then there is LINE, 3DFACE.. +#define DL_SES_CODE 0 // Start End String Code +#define DL_FILE_SEP_CODE 0 // File separator +#define DL_SOT_CODE 0 // Start Of Table +#define DL_TEXTVAL_CODE 1 +#define DL_NAME_CODE 2 +#define DL_BLOCK_NAME_CODE 2 +#define DL_SECTION_NAME_CODE 2 +#define DL_ENT_HAND_CODE 5 // What follows is hexa string +#define DL_TXT_STYLE_CODE 7 // Inside attributes +#define DL_LAYER_NAME_CODE 8 // What follows is layer name +#define DL_FIRST_XCOORD_CODE 10 // Group code x of 1st coord +#define DL_FIRST_YCOORD_CODE 20 // Group code y of 1st coord +#define DL_FIRST_ZCOORD_CODE 30 // Group code z of 1st coord +#define DL_L_START_CODE 10 +#define DL_L_END_CODE 11 +#define DL_TXTHI_CODE 40 +#define DL_SCALE_X_CODE 41 +#define DL_SCALE_Y_CODE 42 +#define DL_SCALE_Z_CODE 43 +#define DL_BULGE_CODE 42 // Used in PLINE verts for arcs +#define DL_ROTATION_CODE 50 +#define DL_COLOUR_CODE 62 // What follows is a color int +#define DL_LTYPE_CODE 6 // What follows is a linetype + + +// Attribute flags +#define DL_ATTS_FOLLOW_CODE 66 +#define DL_ATT_TAG_CODE 2 +#define DL_ATT_VAL_CODE 1 +#define DL_ATT_FLAGS_CODE 70 // 4 1 bit flags as follows... +#define DL_ATT_INVIS_FLAG 1 +#define DL_ATT_CONST_FLAG 2 +#define DL_ATT_VERIFY_FLAG 4 // Prompt and verify +#define DL_ATT_PRESET_FLAG 8 // No prompt and no verify + +// PLINE defines +// Flags +#define DL_OPEN_PLINE 0x00 +#define DL_CLOSED_PLINE 0x01 +#define DL_POLYLINE3D 0x80 +#define DL_PFACE_MESH 0x40 +#define DL_PGON_MESH 0x10 +// Vertices follow entity, required in POLYLINES +#define DL_VERTS_FOLLOW_CODE 66 // Value should always be 1 +#define DL_VERTEX_COORD_CODE 10 + + +// LAYER flags +#define DL_FROZEN 1 +#define DL_FROZEN_BY_DEF 2 +#define DL_LOCKED 4 +#define DL_OBJECT_USED 64 // Object is ref'd in the dwg + +#define DL_BLOCK_EN_CODE -2 // Block entity definition +#define DL_E_NAME -1 // Entity name + +// Extended data codes +#define DL_EXTD_SENTINEL (-3) +#define DL_EXTD_STR 1000 +#define DL_EXTD_APP_NAME 1001 +#define DL_EXTD_CTL_STR 1002 +#define DL_EXTD_LYR_STR 1003 +#define DL_EXTD_CHUNK 1004 +#define DL_EXTD_HANDLE 1005 +#define DL_EXTD_POINT 1010 +#define DL_EXTD_POS 1011 +#define DL_EXTD_DISP 1012 +#define DL_EXTD_DIR 1013 +#define DL_EXTD_FLOAT 1040 +#define DL_EXTD_DIST 1041 +#define DL_EXTD_SCALE 1042 +#define DL_EXTD_INT16 1070 +#define DL_EXTD_INT32 1071 + +// UCS codes for use in ads_trans +#define DL_WCS_TRANS_CODE 0 +#define DL_UCS_TRANS_CODE 1 +#define DL_DCS_TRANS_CODE 2 +#define DL_PCS_TRANS_CODE 3 + +#endif + diff --git a/datafile/dxf/dxflib/dl_creationadapter.h b/datafile/dxf/dxflib/dl_creationadapter.h new file mode 100644 index 0000000..0d12ead --- /dev/null +++ b/datafile/dxf/dxflib/dl_creationadapter.h @@ -0,0 +1,138 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_CREATIONADAPTER_H +#define DL_CREATIONADAPTER_H + +#include "dl_global.h" + +#include "dl_creationinterface.h" + +/** + * An abstract adapter class for receiving DXF events when a DXF file is being read. + * The methods in this class are empty. This class exists as convenience for creating + * listener objects. + * + * @author Andrew Mustun + */ +class DXFLIB_EXPORT DL_CreationAdapter : public DL_CreationInterface { +public: + DL_CreationAdapter() {} + virtual ~DL_CreationAdapter() {} + virtual void processCodeValuePair(unsigned int, const std::string&) {} + virtual void endSection() {} + virtual void addLayer(const DL_LayerData&) {} + virtual void addLinetype(const DL_LinetypeData&) {} + virtual void addLinetypeDash(double) {} + virtual void addBlock(const DL_BlockData&) {} + virtual void endBlock() {} + virtual void addTextStyle(const DL_StyleData&) {} + virtual void addPoint(const DL_PointData&) {} + virtual void addLine(const DL_LineData&) {} + virtual void addXLine(const DL_XLineData&) {} + virtual void addRay(const DL_RayData&) {} + + virtual void addArc(const DL_ArcData&) {} + virtual void addCircle(const DL_CircleData&) {} + virtual void addEllipse(const DL_EllipseData&) {} + + virtual void addPolyline(const DL_PolylineData&) {} + virtual void addVertex(const DL_VertexData&) {} + + virtual void addSpline(const DL_SplineData&) {} + virtual void addControlPoint(const DL_ControlPointData&) {} + virtual void addFitPoint(const DL_FitPointData&) {} + virtual void addKnot(const DL_KnotData&) {} + + virtual void addInsert(const DL_InsertData&) {} + + virtual void addMText(const DL_MTextData&) {} + virtual void addMTextChunk(const std::string&) {} + virtual void addText(const DL_TextData&) {} + virtual void addArcAlignedText(const DL_ArcAlignedTextData&) {} + virtual void addAttribute(const DL_AttributeData&) {} + + virtual void addDimAlign(const DL_DimensionData&, + const DL_DimAlignedData&) {} + virtual void addDimLinear(const DL_DimensionData&, + const DL_DimLinearData&) {} + virtual void addDimRadial(const DL_DimensionData&, + const DL_DimRadialData&) {} + virtual void addDimDiametric(const DL_DimensionData&, + const DL_DimDiametricData&) {} + virtual void addDimAngular(const DL_DimensionData&, + const DL_DimAngularData&) {} + virtual void addDimAngular3P(const DL_DimensionData&, + const DL_DimAngular3PData&) {} + virtual void addDimOrdinate(const DL_DimensionData&, + const DL_DimOrdinateData&) {} + virtual void addLeader(const DL_LeaderData&) {} + virtual void addLeaderVertex(const DL_LeaderVertexData&) {} + + virtual void addHatch(const DL_HatchData&) {} + + virtual void addTrace(const DL_TraceData&) {} + virtual void add3dFace(const DL_3dFaceData&) {} + virtual void addSolid(const DL_SolidData&) {} + + virtual void addImage(const DL_ImageData&) {} + virtual void linkImage(const DL_ImageDefData&) {} + virtual void addHatchLoop(const DL_HatchLoopData&) {} + virtual void addHatchEdge(const DL_HatchEdgeData&) {} + + virtual void addXRecord(const std::string&) {} + virtual void addXRecordString(int, const std::string&) {} + virtual void addXRecordReal(int, double) {} + virtual void addXRecordInt(int, int) {} + virtual void addXRecordBool(int, bool) {} + + virtual void addXDataApp(const std::string&) {} + virtual void addXDataString(int, const std::string&) {} + virtual void addXDataReal(int, double) {} + virtual void addXDataInt(int, int) {} + + virtual void addDictionary(const DL_DictionaryData&) {} + virtual void addDictionaryEntry(const DL_DictionaryEntryData&) {} + + virtual void endEntity() {} + + virtual void addComment(const std::string&) {} + + virtual void setVariableVector(const std::string&, double, double, double, int) {} + virtual void setVariableString(const std::string&, const std::string&, int) {} + virtual void setVariableInt(const std::string&, int, int) {} + virtual void setVariableDouble(const std::string&, double, int) {} +#ifdef DL_COMPAT + virtual void setVariableVector(const char*, double, double, double, int) {} + virtual void setVariableString(const char*, const char*, int) {} + virtual void setVariableInt(const char*, int, int) {} + virtual void setVariableDouble(const char*, double, int) {} + virtual void processCodeValuePair(unsigned int, char*) {} + virtual void addComment(const char*) {} + virtual void addMTextChunk(const char*) {} +#endif + virtual void endSequence() {} +}; + +#endif diff --git a/datafile/dxf/dxflib/dl_creationinterface.h b/datafile/dxf/dxflib/dl_creationinterface.h new file mode 100644 index 0000000..81bde52 --- /dev/null +++ b/datafile/dxf/dxflib/dl_creationinterface.h @@ -0,0 +1,369 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_CREATIONINTERFACE_H +#define DL_CREATIONINTERFACE_H + +#include "dl_global.h" + +#include + +#include "dl_attributes.h" +#include "dl_codes.h" +#include "dl_entities.h" +#include "dl_extrusion.h" + +/** + * Abstract class (interface) for the creation of new entities. + * Inherit your class which takes care of the entities in the + * processed DXF file from this interface. + * + * Double arrays passed to your implementation contain 3 double + * values for x, y, z coordinates unless stated differently. + * + * @author Andrew Mustun + */ +class DXFLIB_EXPORT DL_CreationInterface { +public: + DL_CreationInterface() { + extrusion = new DL_Extrusion; + } + virtual ~DL_CreationInterface() { + delete extrusion; + } + + /** + * Called for every code / value tuple of the DXF file. The complete DXF file + * contents can be handled by the implemetation of this function. + */ + virtual void processCodeValuePair(unsigned int groupCode, const std::string& groupValue) = 0; + + /** + * Called when a section (entity, table entry, etc.) is finished. + */ + virtual void endSection() = 0; + + /** + * Called for every layer. + */ + virtual void addLayer(const DL_LayerData& data) = 0; + + /** + * Called for every linetype. + */ + virtual void addLinetype(const DL_LinetypeData& data) = 0; + + /** + * Called for every dash in linetype pattern + */ + virtual void addLinetypeDash(double length) = 0; + + /** + * Called for every block. Note: all entities added after this + * command go into this block until endBlock() is called. + * + * @see endBlock() + */ + virtual void addBlock(const DL_BlockData& data) = 0; + + /** Called to end the current block */ + virtual void endBlock() = 0; + + /** Called for every text style */ + virtual void addTextStyle(const DL_StyleData& data) = 0; + + /** Called for every point */ + virtual void addPoint(const DL_PointData& data) = 0; + + /** Called for every line */ + virtual void addLine(const DL_LineData& data) = 0; + + /** Called for every xline */ + virtual void addXLine(const DL_XLineData& data) = 0; + + /** Called for every ray */ + virtual void addRay(const DL_RayData& data) = 0; + + /** Called for every arc */ + virtual void addArc(const DL_ArcData& data) = 0; + + /** Called for every circle */ + virtual void addCircle(const DL_CircleData& data) = 0; + + /** Called for every ellipse */ + virtual void addEllipse(const DL_EllipseData& data) = 0; + + /** Called for every polyline start */ + virtual void addPolyline(const DL_PolylineData& data) = 0; + + /** Called for every polyline vertex */ + virtual void addVertex(const DL_VertexData& data) = 0; + + /** Called for every spline */ + virtual void addSpline(const DL_SplineData& data) = 0; + + /** Called for every spline control point */ + virtual void addControlPoint(const DL_ControlPointData& data) = 0; + + /** Called for every spline fit point */ + virtual void addFitPoint(const DL_FitPointData& data) = 0; + + /** Called for every spline knot value */ + virtual void addKnot(const DL_KnotData& data) = 0; + + /** Called for every insert. */ + virtual void addInsert(const DL_InsertData& data) = 0; + + /** Called for every trace start */ + virtual void addTrace(const DL_TraceData& data) = 0; + + /** Called for every 3dface start */ + virtual void add3dFace(const DL_3dFaceData& data) = 0; + + /** Called for every solid start */ + virtual void addSolid(const DL_SolidData& data) = 0; + + + /** Called for every multi Text entity. */ + virtual void addMText(const DL_MTextData& data) = 0; + + /** + * Called for additional text chunks for MTEXT entities. + * The chunks come at 250 character in size each. Note that + * those chunks come before the actual MTEXT entity. + */ + virtual void addMTextChunk(const std::string& text) = 0; + + /** Called for every text entity. */ + virtual void addText(const DL_TextData& data) = 0; + + /** Called for every arc aligned text entity. */ + virtual void addArcAlignedText(const DL_ArcAlignedTextData& data) = 0; + + /** Called for every block Attribute entity. */ + virtual void addAttribute(const DL_AttributeData& data) = 0; + + /** + * Called for every aligned dimension entity. + */ + virtual void addDimAlign(const DL_DimensionData& data, + const DL_DimAlignedData& edata) = 0; + /** + * Called for every linear or rotated dimension entity. + */ + virtual void addDimLinear(const DL_DimensionData& data, + const DL_DimLinearData& edata) = 0; + + /** + * Called for every radial dimension entity. + */ + virtual void addDimRadial(const DL_DimensionData& data, + const DL_DimRadialData& edata) = 0; + + /** + * Called for every diametric dimension entity. + */ + virtual void addDimDiametric(const DL_DimensionData& data, + const DL_DimDiametricData& edata) = 0; + + /** + * Called for every angular dimension (2 lines version) entity. + */ + virtual void addDimAngular(const DL_DimensionData& data, + const DL_DimAngularData& edata) = 0; + + /** + * Called for every angular dimension (3 points version) entity. + */ + virtual void addDimAngular3P(const DL_DimensionData& data, + const DL_DimAngular3PData& edata) = 0; + + /** + * Called for every ordinate dimension entity. + */ + virtual void addDimOrdinate(const DL_DimensionData& data, + const DL_DimOrdinateData& edata) = 0; + + /** + * Called for every leader start. + */ + virtual void addLeader(const DL_LeaderData& data) = 0; + + /** + * Called for every leader vertex + */ + virtual void addLeaderVertex(const DL_LeaderVertexData& data) = 0; + + /** + * Called for every hatch entity. + */ + virtual void addHatch(const DL_HatchData& data) = 0; + + /** + * Called for every image entity. + */ + virtual void addImage(const DL_ImageData& data) = 0; + + /** + * Called for every image definition. + */ + virtual void linkImage(const DL_ImageDefData& data) = 0; + + /** + * Called for every hatch loop. + */ + virtual void addHatchLoop(const DL_HatchLoopData& data) = 0; + + /** + * Called for every hatch edge entity. + */ + virtual void addHatchEdge(const DL_HatchEdgeData& data) = 0; + + /** + * Called for every XRecord with the given handle. + */ + virtual void addXRecord(const std::string& handle) = 0; + + /** + * Called for XRecords of type string. + */ + virtual void addXRecordString(int code, const std::string& value) = 0; + + /** + * Called for XRecords of type double. + */ + virtual void addXRecordReal(int code, double value) = 0; + + /** + * Called for XRecords of type int. + */ + virtual void addXRecordInt(int code, int value) = 0; + + /** + * Called for XRecords of type bool. + */ + virtual void addXRecordBool(int code, bool value) = 0; + + /** + * Called for every beginning of an XData section of the given application. + */ + virtual void addXDataApp(const std::string& appId) = 0; + + /** + * Called for XData tuples. + */ + virtual void addXDataString(int code, const std::string& value) = 0; + + /** + * Called for XData tuples. + */ + virtual void addXDataReal(int code, double value) = 0; + + /** + * Called for XData tuples. + */ + virtual void addXDataInt(int code, int value) = 0; + + /** + * Called for dictionary objects. + */ + virtual void addDictionary(const DL_DictionaryData& data) = 0; + + /** + * Called for dictionary entries. + */ + virtual void addDictionaryEntry(const DL_DictionaryEntryData& data) = 0; + + /** + * Called after an entity has been completed. + */ + virtual void endEntity() = 0; + + /** + * Called for every comment in the DXF file (code 999). + */ + virtual void addComment(const std::string& comment) = 0; + + /** + * Called for every vector variable in the DXF file (e.g. "$EXTMIN"). + */ + virtual void setVariableVector(const std::string& key, double v1, double v2, double v3, int code) = 0; + + /** + * Called for every string variable in the DXF file (e.g. "$ACADVER"). + */ + virtual void setVariableString(const std::string& key, const std::string& value, int code) = 0; + + /** + * Called for every int variable in the DXF file (e.g. "$ACADMAINTVER"). + */ + virtual void setVariableInt(const std::string& key, int value, int code) = 0; + + /** + * Called for every double variable in the DXF file (e.g. "$DIMEXO"). + */ + virtual void setVariableDouble(const std::string& key, double value, int code) = 0; + +#ifdef DL_COMPAT + virtual void setVariableVector(const char* key, double v1, double v2, double v3, int code) = 0; + virtual void setVariableString(const char* key, const char* value, int code) = 0; + virtual void setVariableInt(const char* key, int value, int code) = 0; + virtual void setVariableDouble(const char* key, double value, int code) = 0; + virtual void processCodeValuePair(unsigned int groupCode, char* groupValue) = 0; + virtual void addComment(const char* comment) = 0; + virtual void addMTextChunk(const char* text) = 0; +#endif + + /** + * Called when a SEQEND occurs (when a POLYLINE or ATTRIB is done) + */ + virtual void endSequence() = 0; + + /** Sets the current attributes for entities. */ + void setAttributes(const DL_Attributes& attrib) { + attributes = attrib; + } + + /** @return the current attributes used for new entities. */ + DL_Attributes getAttributes() { + return attributes; + } + + /** Sets the current attributes for entities. */ + void setExtrusion(double dx, double dy, double dz, double elevation) { + extrusion->setDirection(dx, dy, dz); + extrusion->setElevation(elevation); + } + + /** @return the current attributes used for new entities. */ + DL_Extrusion* getExtrusion() { + return extrusion; + } + +protected: + DL_Attributes attributes; + DL_Extrusion *extrusion; +}; + +#endif diff --git a/datafile/dxf/dxflib/dl_dxf.cpp b/datafile/dxf/dxflib/dl_dxf.cpp new file mode 100644 index 0000000..4e74bce --- /dev/null +++ b/datafile/dxf/dxflib/dl_dxf.cpp @@ -0,0 +1,5332 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "dl_dxf.h" + +#include +#include +#include +#include +#include + +#include "dl_attributes.h" +#include "dl_codes.h" +#include "dl_creationadapter.h" +#include "dl_writer_ascii.h" + +#include "iostream" + +/** + * Default constructor. + */ +DL_Dxf::DL_Dxf() { + version = DL_VERSION_2000; + + vertices = NULL; + maxVertices = 0; + vertexIndex = 0; + + knots = NULL; + maxKnots = 0; + knotIndex = 0; + + weights = NULL; + weightIndex = 0; + + controlPoints = NULL; + maxControlPoints = 0; + controlPointIndex = 0; + + fitPoints = NULL; + maxFitPoints = 0; + fitPointIndex = 0; + + leaderVertices = NULL; + maxLeaderVertices = 0; + leaderVertexIndex = 0; +} + + + +/** + * Destructor. + */ +DL_Dxf::~DL_Dxf() { + if (vertices!=NULL) { + delete[] vertices; + } + if (knots!=NULL) { + delete[] knots; + } + if (controlPoints!=NULL) { + delete[] controlPoints; + } + if (fitPoints!=NULL) { + delete[] fitPoints; + } + if (weights!=NULL) { + delete[] weights; + } + if (leaderVertices!=NULL) { + delete[] leaderVertices; + } +} + + + +/** + * @brief Reads the given file and calls the appropriate functions in + * the given creation interface for every entity found in the file. + * + * @param file Input + * Path and name of file to read + * @param creationInterface + * Pointer to the class which takes care of the entities in the file. + * + * @retval true If \p file could be opened. + * @retval false If \p file could not be opened. + */ +bool DL_Dxf::in(const std::string& file, DL_CreationInterface* creationInterface) { + FILE *fp; + firstCall = true; + currentObjectType = DL_UNKNOWN; + + fp = fopen(file.c_str(), "rt"); + if (fp) { + std::locale oldLocale = std::locale::global(std::locale("C")); // use dot in numbers + while (readDxfGroups(fp, creationInterface)) {} + std::locale::global(oldLocale); + fclose(fp); + return true; + } + + return false; +} + + + +/** + * Reads a DXF file from an existing stream. + * + * @param stream The string stream. + * @param creationInterface + * Pointer to the class which takes care of the entities in the file. + * + * @retval true If \p file could be opened. + * @retval false If \p file could not be opened. + */ +bool DL_Dxf::in(std::stringstream& stream, + DL_CreationInterface* creationInterface) { + + if (stream.good()) { + firstCall=true; + currentObjectType = DL_UNKNOWN; + while (readDxfGroups(stream, creationInterface)) {} + return true; + } + return false; +} + + + +/** + * @brief Reads a group couplet from a DXF file. Calls another function + * to process it. + * + * A group couplet consists of two lines that represent a single + * piece of data. An integer constant on the first line indicates + * the type of data. The value is on the next line.\n + * + * This function reads a couplet, determines the type of data, and + * passes the value to the the appropriate handler function of + * \p creationInterface.\n + * + * \p fp is advanced so that the next call to \p readDXFGroups() reads + * the next couplet in the file. + * + * @param fp Handle of input file + * @param creationInterface Handle of class which processes entities + * in the file + * + * @retval true If EOF not reached. + * @retval false If EOF reached. + */ +bool DL_Dxf::readDxfGroups(FILE *fp, DL_CreationInterface* creationInterface) { + + static int line = 1; + + // Read one group of the DXF file and strip the lines: + if (DL_Dxf::getStrippedLine(groupCodeTmp, DL_DXF_MAXLINE, fp) && + DL_Dxf::getStrippedLine(groupValue, DL_DXF_MAXLINE, fp, false) ) { + + groupCode = (unsigned int)toInt(groupCodeTmp); + + creationInterface->processCodeValuePair(groupCode, groupValue); + line+=2; + processDXFGroup(creationInterface, groupCode, groupValue); + } + + return !feof(fp); +} + + + +/** + * Same as above but for stringstreams. + */ +bool DL_Dxf::readDxfGroups(std::stringstream& stream, + DL_CreationInterface* creationInterface) { + + static int line = 1; + + // Read one group of the DXF file and chop the lines: + if (DL_Dxf::getStrippedLine(groupCodeTmp, DL_DXF_MAXLINE, stream) && + DL_Dxf::getStrippedLine(groupValue, DL_DXF_MAXLINE, stream, false) ) { + + groupCode = (unsigned int)toInt(groupCodeTmp); + + line+=2; + processDXFGroup(creationInterface, groupCode, groupValue); + } + return !stream.eof(); +} + + + +/** + * @brief Reads line from file & strips whitespace at start and newline + * at end. + * + * @param s Output\n + * Pointer to character array that chopped line will be returned in. + * @param size Size of \p s. (Including space for NULL.) + * @param fp Input\n + * Handle of input file. + * + * @retval true if line could be read + * @retval false if \p fp is already at end of file + * + * @todo Change function to use safer FreeBSD strl* functions + * @todo Is it a problem if line is blank (i.e., newline only)? + * Then, when function returns, (s==NULL). + */ +bool DL_Dxf::getStrippedLine(std::string& s, unsigned int size, FILE *fp, bool stripSpace) { + if (!feof(fp)) { + // The whole line in the file. Includes space for NULL. + char* wholeLine = new char[size]; + // Only the useful part of the line + char* line; + + line = fgets(wholeLine, size, fp); + + if (line!=NULL && line[0] != '\0') { // Evaluates to fgets() retval + // line == wholeLine at this point. + // Both guaranteed to be NULL terminated. + + // Strip leading whitespace and trailing CR/LF. + stripWhiteSpace(&line, stripSpace); + + s = line; + assert(size > s.length()); + } + + delete[] wholeLine; // Done with wholeLine + + return true; + } else { + s = ""; + return false; + } +} + + + +/** + * Same as above but for stringstreams. + */ +bool DL_Dxf::getStrippedLine(std::string &s, unsigned int size, + std::stringstream& stream, bool stripSpace) { + + if (!stream.eof()) { + // Only the useful part of the line + char* line = new char[size+1]; + char* oriLine = line; + stream.getline(line, size); + stripWhiteSpace(&line, stripSpace); + s = line; + assert(size > s.length()); + delete[] oriLine; + return true; + } else { + s[0] = '\0'; + return false; + } +} + + + +/** + * @brief Strips leading whitespace and trailing Carriage Return (CR) + * and Line Feed (LF) from NULL terminated string. + * + * @param s Input and output. + * NULL terminates string. + * + * @retval true if \p s is non-NULL + * @retval false if \p s is NULL + */ +bool DL_Dxf::stripWhiteSpace(char** s, bool stripSpace) { + // last non-NULL char: + int lastChar = strlen(*s) - 1; + + // Is last character CR or LF? + while ( (lastChar >= 0) && + (((*s)[lastChar] == 10) || ((*s)[lastChar] == 13) || + (stripSpace && ((*s)[lastChar] == ' ' || ((*s)[lastChar] == '\t')))) ) { + (*s)[lastChar] = '\0'; + lastChar--; + } + + // Skip whitespace, excluding \n, at beginning of line + if (stripSpace) { + while ((*s)[0]==' ' || (*s)[0]=='\t') { + ++(*s); + } + } + + return ((*s) ? true : false); +} + + + +/** + * Processes a group (pair of group code and value). + * + * @param creationInterface Handle to class that creates entities and + * other CAD data from DXF group codes + * + * @param groupCode Constant indicating the data type of the group. + * @param groupValue The data value. + * + * @retval true if done processing current entity and new entity begun + * @retval false if not done processing current entity +*/ +bool DL_Dxf::processDXFGroup(DL_CreationInterface* creationInterface, + int groupCode, const std::string& groupValue) { + + //printf("%d\n", groupCode); + //printf("%s\n", groupValue.c_str()); + + // Init values on first call + if (firstCall) { + settingValue[0] = '\0'; + firstCall=false; + } + + // Indicates comment or dxflib version: + if (groupCode==999) { + if (!groupValue.empty()) { + if (groupValue.substr(0, 6)=="dxflib") { + libVersion = getLibVersion(groupValue.substr(7)); + } + + addComment(creationInterface, groupValue); + } + } + + // Indicates start of new entity or variable: + else if (groupCode==0 || groupCode==9) { + // If new entity is encountered, the last one is complete. + // Prepare default attributes for next entity: + std::string layer = getStringValue(8, "0"); + + int width; + // Compatibility with qcad1: + if (hasValue(39) && !hasValue(370)) { + width = getIntValue(39, -1); + } + // since autocad 2002: + else if (hasValue(370)) { + width = getIntValue(370, -1); + } + // default to BYLAYER: + else { + width = -1; + } + + int color; + color = getIntValue(62, 256); + int color24; + color24 = getIntValue(420, -1); + int handle; + handle = getInt16Value(5, -1); + + std::string linetype = getStringValue(6, "BYLAYER"); + + attrib = DL_Attributes(layer, // layer + color, // color + color24, // 24 bit color + width, // width + linetype, // linetype + handle); // handle + attrib.setInPaperSpace((bool)getIntValue(67, 0)); + attrib.setLinetypeScale(getRealValue(48, 1.0)); + creationInterface->setAttributes(attrib); + + int elevationGroupCode=30; + if (currentObjectType==DL_ENTITY_LWPOLYLINE ) { + // see lwpolyline group codes reference + elevationGroupCode=38; + } + else { + // see polyline group codes reference + elevationGroupCode=30; + } + + creationInterface->setExtrusion(getRealValue(210, 0.0), + getRealValue(220, 0.0), + getRealValue(230, 1.0), + getRealValue(elevationGroupCode, 0.0)); + + // Add the previously parsed entity via creationInterface + switch (currentObjectType) { + case DL_SETTING: + addSetting(creationInterface); + break; + + case DL_LAYER: + addLayer(creationInterface); + break; + + case DL_LINETYPE: + addLinetype(creationInterface); + break; + + case DL_BLOCK: + addBlock(creationInterface); + break; + + case DL_ENDBLK: + endBlock(creationInterface); + break; + + case DL_STYLE: + addTextStyle(creationInterface); + break; + + case DL_ENTITY_POINT: + addPoint(creationInterface); + break; + + case DL_ENTITY_LINE: + addLine(creationInterface); + break; + + case DL_ENTITY_XLINE: + addXLine(creationInterface); + break; + + case DL_ENTITY_RAY: + addRay(creationInterface); + break; + + case DL_ENTITY_POLYLINE: + case DL_ENTITY_LWPOLYLINE: + addPolyline(creationInterface); + break; + + case DL_ENTITY_VERTEX: + addVertex(creationInterface); + break; + + case DL_ENTITY_SPLINE: + addSpline(creationInterface); + break; + + case DL_ENTITY_ARC: + addArc(creationInterface); + break; + + case DL_ENTITY_CIRCLE: + addCircle(creationInterface); + break; + + case DL_ENTITY_ELLIPSE: + addEllipse(creationInterface); + break; + + case DL_ENTITY_INSERT: + addInsert(creationInterface); + break; + + case DL_ENTITY_MTEXT: + addMText(creationInterface); + break; + + case DL_ENTITY_TEXT: + addText(creationInterface); + break; + + case DL_ENTITY_ARCALIGNEDTEXT: + addArcAlignedText(creationInterface); + break; + + case DL_ENTITY_ATTRIB: + addAttribute(creationInterface); + break; + + case DL_ENTITY_DIMENSION: { + int type = (getIntValue(70, 0)&0x07); + + switch (type) { + case 0: + addDimLinear(creationInterface); + break; + + case 1: + addDimAligned(creationInterface); + break; + + case 2: + addDimAngular(creationInterface); + break; + + case 3: + addDimDiametric(creationInterface); + break; + + case 4: + addDimRadial(creationInterface); + break; + + case 5: + addDimAngular3P(creationInterface); + break; + + case 6: + addDimOrdinate(creationInterface); + break; + + default: + break; + } + } + break; + + case DL_ENTITY_LEADER: + addLeader(creationInterface); + break; + + case DL_ENTITY_HATCH: + //addHatch(creationInterface); + handleHatchData(creationInterface); + break; + + case DL_ENTITY_IMAGE: + addImage(creationInterface); + break; + + case DL_ENTITY_IMAGEDEF: + addImageDef(creationInterface); + break; + + case DL_ENTITY_TRACE: + addTrace(creationInterface); + break; + + case DL_ENTITY_3DFACE: + add3dFace(creationInterface); + break; + + case DL_ENTITY_SOLID: + addSolid(creationInterface); + break; + + case DL_ENTITY_SEQEND: + endSequence(creationInterface); + break; + + default: + break; + } + + creationInterface->endSection(); + + // reset all values (they are not persistent and only this + // way we can set defaults for omitted values) +// for (int i=0; iaddComment(comment); +} + +void DL_Dxf::addDictionary(DL_CreationInterface* creationInterface) { + creationInterface->addDictionary(DL_DictionaryData(getStringValue(5, ""))); +} + +void DL_Dxf::addDictionaryEntry(DL_CreationInterface* creationInterface) { + creationInterface->addDictionaryEntry(DL_DictionaryEntryData(getStringValue(3, ""), getStringValue(350, ""))); +} + + + +/** + * Adds a variable from the DXF file. + */ +void DL_Dxf::addSetting(DL_CreationInterface* creationInterface) { + int c = -1; + std::map::iterator it = values.begin(); + if (it!=values.end()) { + c = it->first; + } +// for (int i=0; i<=380; ++i) { +// if (values[i][0]!='\0') { +// c = i; +// break; +// } +// } + + // string + if (c>=0 && c<=9) { + creationInterface->setVariableString(settingKey, values[c], c); + #ifdef DL_COMPAT + // backwards compatibility: + creationInterface->setVariableString(settingKey.c_str(), values[c].c_str(), c); + #endif + } + // vector + else if (c>=10 && c<=39) { + if (c==10) { + creationInterface->setVariableVector( + settingKey, + getRealValue(c, 0.0), + getRealValue(c+10, 0.0), + getRealValue(c+20, 0.0), + c); + } + } + // double + else if (c>=40 && c<=59) { + creationInterface->setVariableDouble(settingKey, getRealValue(c, 0.0), c); + } + // int + else if (c>=60 && c<=99) { + creationInterface->setVariableInt(settingKey, getIntValue(c, 0), c); + } + // misc + else if (c>=0) { + creationInterface->setVariableString(settingKey, getStringValue(c, ""), c); + } +} + + + +/** + * Adds a layer that was read from the file via the creation interface. + */ +void DL_Dxf::addLayer(DL_CreationInterface* creationInterface) { + // correct some invalid attributes for layers: + attrib = creationInterface->getAttributes(); + if (attrib.getColor()==256 || attrib.getColor()==0) { + attrib.setColor(7); + } + if (attrib.getWidth()<0) { + attrib.setWidth(1); + } + + std::string linetype = attrib.getLinetype(); + std::transform(linetype.begin(), linetype.end(), linetype.begin(), ::toupper); + if (linetype=="BYLAYER" || linetype=="BYBLOCK") { + attrib.setLinetype("CONTINUOUS"); + } + + // add layer + std::string name = getStringValue(2, ""); + if (name.length()==0) { + return; + } + + creationInterface->addLayer(DL_LayerData(name, getIntValue(70, 0))); +} + +/** + * Adds a linetype that was read from the file via the creation interface. + */ +void DL_Dxf::addLinetype(DL_CreationInterface* creationInterface) { + std::string name = getStringValue(2, ""); + if (name.length()==0) { + return; + } + int numDashes = getIntValue(73, 0); + //double dashes[numDashes]; + + DL_LinetypeData d( + // name: + name, + // description: + getStringValue(3, ""), + // flags + getIntValue(70, 0), + // number of dashes: + numDashes, + // pattern length: + getRealValue(40, 0.0) + // pattern: + //dashes + ); + + if (name != "By Layer" && name != "By Block" && name != "BYLAYER" && name != "BYBLOCK") { + creationInterface->addLinetype(d); + } +} + +/** + * Handles all dashes in linetype pattern. + */ +bool DL_Dxf::handleLinetypeData(DL_CreationInterface* creationInterface) { + if (groupCode == 49) { + creationInterface->addLinetypeDash(toReal(groupValue)); + return true; + } + + return false; +} + + +/** + * Adds a block that was read from the file via the creation interface. + */ +void DL_Dxf::addBlock(DL_CreationInterface* creationInterface) { + std::string name = getStringValue(2, ""); + if (name.length()==0) { + return; + } + + DL_BlockData d( + // Name: + name, + // flags: + getIntValue(70, 0), + // base point: + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0)); + + creationInterface->addBlock(d); +} + + + +/** + * Ends a block that was read from the file via the creation interface. + */ +void DL_Dxf::endBlock(DL_CreationInterface* creationInterface) { + creationInterface->endBlock(); +} + + + +void DL_Dxf::addTextStyle(DL_CreationInterface* creationInterface) { + std::string name = getStringValue(2, ""); + if (name.length()==0) { + return; + } + + DL_StyleData d( + // name: + name, + // flags + getIntValue(70, 0), + // fixed text heigth: + getRealValue(40, 0.0), + // width factor: + getRealValue(41, 0.0), + // oblique angle: + getRealValue(50, 0.0), + // text generation flags: + getIntValue(71, 0), + // last height used: + getRealValue(42, 0.0), + // primart font file: + getStringValue(3, ""), + // big font file: + getStringValue(4, "") + ); + creationInterface->addTextStyle(d); +} + + +/** + * Adds a point entity that was read from the file via the creation interface. + */ +void DL_Dxf::addPoint(DL_CreationInterface* creationInterface) { + DL_PointData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0)); + creationInterface->addPoint(d); +} + + + +/** + * Adds a line entity that was read from the file via the creation interface. + */ +void DL_Dxf::addLine(DL_CreationInterface* creationInterface) { + DL_LineData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0)); + + creationInterface->addLine(d); +} + +/** + * Adds an xline entity that was read from the file via the creation interface. + */ +void DL_Dxf::addXLine(DL_CreationInterface* creationInterface) { + DL_XLineData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0)); + + creationInterface->addXLine(d); +} + +/** + * Adds a ray entity that was read from the file via the creation interface. + */ +void DL_Dxf::addRay(DL_CreationInterface* creationInterface) { + DL_RayData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0)); + + creationInterface->addRay(d); +} + + + +/** + * Adds a polyline entity that was read from the file via the creation interface. + */ +void DL_Dxf::addPolyline(DL_CreationInterface* creationInterface) { + DL_PolylineData pd(maxVertices, getIntValue(71, 0), getIntValue(72, 0), getIntValue(70, 0), getRealValue(38, 0)); + creationInterface->addPolyline(pd); + + maxVertices = std::min(maxVertices, vertexIndex+1); + + if (currentObjectType==DL_ENTITY_LWPOLYLINE) { + for (int i=0; iaddVertex(d); + } + creationInterface->endEntity(); + } +} + + + +/** + * Adds a polyline vertex entity that was read from the file + * via the creation interface. + */ +void DL_Dxf::addVertex(DL_CreationInterface* creationInterface) { + + // vertex defines a face of the mesh if its vertex flags group has the + // 128 bit set but not the 64 bit. 10, 20, 30 are irrelevant and set to + // 0 in this case + if ((getIntValue(70, 0)&128) && !(getIntValue(70, 0)&64)) { + return; + } + + DL_VertexData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(42, 0.0)); + + creationInterface->addVertex(d); +} + + +/** + * Adds a spline entity that was read from the file via the creation interface. + */ +void DL_Dxf::addSpline(DL_CreationInterface* creationInterface) { + DL_SplineData sd(getIntValue(71, 3), + maxKnots, + maxControlPoints, + maxFitPoints, + getIntValue(70, 4)); + + sd.tangentStartX = getRealValue(12, 0.0); + sd.tangentStartY = getRealValue(22, 0.0); + sd.tangentStartZ = getRealValue(32, 0.0); + sd.tangentEndX = getRealValue(13, 0.0); + sd.tangentEndY = getRealValue(23, 0.0); + sd.tangentEndZ = getRealValue(33, 0.0); + + creationInterface->addSpline(sd); + + int i; + for (i=0; iaddControlPoint(d); + } + for (i=0; iaddFitPoint(d); + } + for (i=0; iaddKnot(k); + } + creationInterface->endEntity(); +} + + + +/** + * Adds an arc entity that was read from the file via the creation interface. + */ +void DL_Dxf::addArc(DL_CreationInterface* creationInterface) { + DL_ArcData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(40, 0.0), + getRealValue(50, 0.0), + getRealValue(51, 0.0)); + + creationInterface->addArc(d); +} + + + +/** + * Adds a circle entity that was read from the file via the creation interface. + */ +void DL_Dxf::addCircle(DL_CreationInterface* creationInterface) { + DL_CircleData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(40, 0.0)); + + creationInterface->addCircle(d); +} + + + +/** + * Adds an ellipse entity that was read from the file via the creation interface. + */ +void DL_Dxf::addEllipse(DL_CreationInterface* creationInterface) { + DL_EllipseData d(getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0), + getRealValue(40, 1.0), + getRealValue(41, 0.0), + getRealValue(42, 2*M_PI)); + + creationInterface->addEllipse(d); +} + + + +/** + * Adds an insert entity that was read from the file via the creation interface. + */ +void DL_Dxf::addInsert(DL_CreationInterface* creationInterface) { + //printf("addInsert\n"); + //printf("code 50: %s\n", values[50]); + //printf("code 50 length: %d\n", strlen(values[50])); + //printf("code 50:\n"); + //getRealValue(50, 0.0); + + std::string name = getStringValue(2, ""); + if (name.length()==0) { + return; + } + + DL_InsertData d(name, + // insertion point + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + // scale: + getRealValue(41, 1.0), + getRealValue(42, 1.0), + getRealValue(43, 1.0), + // angle (deg): + getRealValue(50, 0.0), + // cols / rows: + getIntValue(70, 1), + getIntValue(71, 1), + // spacing: + getRealValue(44, 0.0), + getRealValue(45, 0.0)); + + creationInterface->addInsert(d); +} + + + +/** + * Adds a trace entity (4 edge closed polyline) that was read from the file via the creation interface. + * + * @author AHM + */ +void DL_Dxf::addTrace(DL_CreationInterface* creationInterface) { + DL_TraceData td; + + for (int k = 0; k < 4; k++) { + td.x[k] = getRealValue(10 + k, 0.0); + td.y[k] = getRealValue(20 + k, 0.0); + td.z[k] = getRealValue(30 + k, 0.0); + } + creationInterface->addTrace(td); +} + + + +/** + * Adds a 3dface entity that was read from the file via the creation interface. + */ +void DL_Dxf::add3dFace(DL_CreationInterface* creationInterface) { + DL_3dFaceData td; + + for (int k = 0; k < 4; k++) { + td.x[k] = getRealValue(10 + k, 0.0); + td.y[k] = getRealValue(20 + k, 0.0); + td.z[k] = getRealValue(30 + k, 0.0); + } + creationInterface->add3dFace(td); +} + + + +/** + * Adds a solid entity (filled trace) that was read from the file via the creation interface. + * + * @author AHM + */ +void DL_Dxf::addSolid(DL_CreationInterface* creationInterface) { + DL_SolidData sd; + + for (int k = 0; k < 4; k++) { + sd.x[k] = getRealValue(10 + k, 0.0); + sd.y[k] = getRealValue(20 + k, 0.0); + sd.z[k] = getRealValue(30 + k, 0.0); + } + creationInterface->addSolid(sd); +} + + +/** + * Adds an MText entity that was read from the file via the creation interface. + */ +void DL_Dxf::addMText(DL_CreationInterface* creationInterface) { + double angle = 0.0; + + if (hasValue(50)) { + if (libVersion<=0x02000200) { + // wrong but compatible with dxflib <=2.0.2.0 (angle stored in rad): + angle = getRealValue(50, 0.0); + } else { + angle = (getRealValue(50, 0.0)*2*M_PI)/360.0; + } + } else if (hasValue(11) && hasValue(21)) { + double x = getRealValue(11, 0.0); + double y = getRealValue(21, 0.0); + + if (fabs(x)<1.0e-6) { + if (y>0.0) { + angle = M_PI/2.0; + } else { + angle = M_PI/2.0*3.0; + } + } else { + angle = atan(y/x); + } + } + + DL_MTextData d( + // insertion point + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + // X direction vector + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0), + // height + getRealValue(40, 2.5), + // width + getRealValue(41, 0.0), + // attachment point + getIntValue(71, 1), + // drawing direction + getIntValue(72, 1), + // line spacing style + getIntValue(73, 1), + // line spacing factor + getRealValue(44, 1.0), + // text + getStringValue(1, ""), + // style + getStringValue(7, ""), + // angle + angle); + creationInterface->addMText(d); +} + +/** + * Handles all XRecord data. + */ +bool DL_Dxf::handleXRecordData(DL_CreationInterface* creationInterface) { + if (groupCode==105) { + return false; + } + + if (groupCode==5) { + creationInterface->addXRecord(groupValue); + return true; + } + + if (groupCode==280) { + xRecordValues = true; + return true; + } + + if (!xRecordValues) { + return false; + } + + // string: + if (groupCode<=9 || + groupCode==100 || groupCode==102 || groupCode==105 || + (groupCode>=300 && groupCode<=369) || + (groupCode>=1000 && groupCode<=1009)) { + + creationInterface->addXRecordString(groupCode, groupValue); + return true; + } + + // int: + else if ((groupCode>=60 && groupCode<=99) || (groupCode>=160 && groupCode<=179) || (groupCode>=270 && groupCode<=289)) { + creationInterface->addXRecordInt(groupCode, toInt(groupValue)); + return true; + } + + // bool: + else if (groupCode>=290 && groupCode<=299) { + creationInterface->addXRecordBool(groupCode, toBool(groupValue)); + return true; + } + + // double: + else if ((groupCode>=10 && groupCode<=59) || (groupCode>=110 && groupCode<=149) || (groupCode>=210 && groupCode<=239)) { + creationInterface->addXRecordReal(groupCode, toReal(groupValue)); + return true; + } + + return false; +} + +/** + * Handles all dictionary data. + */ +bool DL_Dxf::handleDictionaryData(DL_CreationInterface* creationInterface) { + if (groupCode==3) { + return true; + } + + if (groupCode==5) { + creationInterface->addDictionary(DL_DictionaryData(groupValue)); + return true; + } + + if (groupCode==350) { + creationInterface->addDictionaryEntry(DL_DictionaryEntryData(getStringValue(3, ""), groupValue)); + return true; + } + return false; +} + + + +/** + * Handles XData for all object types. + */ +bool DL_Dxf::handleXData(DL_CreationInterface* creationInterface) { + if (groupCode==1001) { + creationInterface->addXDataApp(groupValue); + return true; + } + else if (groupCode>=1000 && groupCode<=1009) { + creationInterface->addXDataString(groupCode, groupValue); + return true; + } + else if (groupCode>=1010 && groupCode<=1059) { + creationInterface->addXDataReal(groupCode, toReal(groupValue)); + return true; + } + else if (groupCode>=1060 && groupCode<=1070) { + creationInterface->addXDataInt(groupCode, toInt(groupValue)); + return true; + } + else if (groupCode==1071) { + creationInterface->addXDataInt(groupCode, toInt(groupValue)); + return true; + } + + return false; +} + +/** + * Handles additional MText data. + */ +bool DL_Dxf::handleMTextData(DL_CreationInterface* creationInterface) { + // Special handling of text chunks for MTEXT entities: + if (groupCode==3) { + creationInterface->addMTextChunk(groupValue); + return true; + } + + return false; +} + +/** + * Handles additional polyline data. + */ +bool DL_Dxf::handleLWPolylineData(DL_CreationInterface* /*creationInterface*/) { + // Allocate LWPolyline vertices (group code 90): + if (groupCode==90) { + maxVertices = toInt(groupValue); + if (maxVertices>0) { + if (vertices!=NULL) { + delete[] vertices; + } + vertices = new double[4*maxVertices]; + for (int i=0; i=0 && vertexIndex0) { + if (knots!=NULL) { + delete[] knots; + } + knots = new double[maxKnots]; + for (int i=0; i0) { + if (controlPoints!=NULL) { + delete[] controlPoints; + } + if (weights!=NULL) { + delete[] weights; + } + controlPoints = new double[3*maxControlPoints]; + weights = new double[maxControlPoints]; + for (int i=0; i0) { + if (fitPoints!=NULL) { + delete[] fitPoints; + } + fitPoints = new double[3*maxFitPoints]; + for (int i=0; i=0 && controlPointIndex=0 && fitPointIndex=0 && weightIndex0) { + if (leaderVertices!=NULL) { + delete[] leaderVertices; + } + leaderVertices = new double[3*maxLeaderVertices]; + for (int i=0; i=0 && + leaderVertexIndexaddText(d); +} + + +/** + * Adds an arc aligned text entity that was read from the file via the creation interface. + */ +void DL_Dxf::addArcAlignedText(DL_CreationInterface* creationInterface) { + DL_ArcAlignedTextData d; + d.text = getStringValue(1, ""); + d.font = getStringValue(2, ""); + d.style = getStringValue(7, ""); + d.cx = getRealValue(10, 0.0); + d.cy = getRealValue(20, 0.0); + d.cz = getRealValue(30, 0.0); + d.radius = getRealValue(40, 0.0); + d.xScaleFactor = getRealValue(41, 0.0); + d.height = getRealValue(42, 0.0); + d.spacing = getRealValue(43, 0.0); + d.offset = getRealValue(44, 0.0); + d.rightOffset = getRealValue(45, 0.0); + d.leftOffset = getRealValue(46, 0.0); + d.startAngle = getRealValue(50, 0.0); + d.endAngle = getRealValue(51, 0.0); + d.reversedCharacterOrder = getIntValue(70, 0); + d.direction = getIntValue(71, 0); + d.alignment = getIntValue(72, 0); + d.side = getIntValue(73, 0); + d.bold = getIntValue(74, 0); + d.italic = getIntValue(75, 0); + d.underline = getIntValue(76, 0); + d.characerSet = getIntValue(77, 0); + d.pitch = getIntValue(78, 0); + d.shxFont = getIntValue(79, 0); + d.wizard = getIntValue(280, 0); + d.arcHandle = getIntValue(330, 0); + + creationInterface->addArcAlignedText(d); +} + + + +/** + * Adds an attrib entity that was read from the file via the creation interface. + * @todo add attrib instead of normal text + */ +void DL_Dxf::addAttribute(DL_CreationInterface* creationInterface) { + DL_AttributeData d( + // insertion point + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + // alignment point + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0), + // height + getRealValue(40, 2.5), + // x scale + getRealValue(41, 1.0), + // generation flags + getIntValue(71, 0), + // h just + getIntValue(72, 0), + // v just + getIntValue(74, 0), + // tag + getStringValue(2, ""), + // text + getStringValue(1, ""), + // style + getStringValue(7, ""), + // angle + (getRealValue(50, 0.0)*2*M_PI)/360.0); + + creationInterface->addAttribute(d); +} + + + +/** + * @return dimension data from current values. + */ +DL_DimensionData DL_Dxf::getDimData() { + // generic dimension data: + return DL_DimensionData( + // def point + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + // text middle point + getRealValue(11, 0.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0), + // type + getIntValue(70, 0), + // attachment point + getIntValue(71, 5), + // line sp. style + getIntValue(72, 1), + // line sp. factor + getRealValue(41, 1.0), + // text + getStringValue(1, ""), + // style + getStringValue(3, ""), + // angle + getRealValue(53, 0.0)); +} + + + +/** + * Adds a linear dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimLinear(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // horizontal / vertical / rotated dimension: + DL_DimLinearData dl( + // definition point 1 + getRealValue(13, 0.0), + getRealValue(23, 0.0), + getRealValue(33, 0.0), + // definition point 2 + getRealValue(14, 0.0), + getRealValue(24, 0.0), + getRealValue(34, 0.0), + // angle + getRealValue(50, 0.0), + // oblique + getRealValue(52, 0.0)); + creationInterface->addDimLinear(d, dl); +} + + + +/** + * Adds an aligned dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimAligned(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // aligned dimension: + DL_DimAlignedData da( + // extension point 1 + getRealValue(13, 0.0), + getRealValue(23, 0.0), + getRealValue(33, 0.0), + // extension point 2 + getRealValue(14, 0.0), + getRealValue(24, 0.0), + getRealValue(34, 0.0)); + creationInterface->addDimAlign(d, da); +} + + + +/** + * Adds a radial dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimRadial(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + DL_DimRadialData dr( + // definition point + getRealValue(15, 0.0), + getRealValue(25, 0.0), + getRealValue(35, 0.0), + // leader length: + getRealValue(40, 0.0)); + creationInterface->addDimRadial(d, dr); +} + + + +/** + * Adds a diametric dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimDiametric(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // diametric dimension: + DL_DimDiametricData dr( + // definition point + getRealValue(15, 0.0), + getRealValue(25, 0.0), + getRealValue(35, 0.0), + // leader length: + getRealValue(40, 0.0)); + creationInterface->addDimDiametric(d, dr); +} + + + +/** + * Adds an angular dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimAngular(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // angular dimension: + DL_DimAngularData da( + // definition point 1 + getRealValue(13, 0.0), + getRealValue(23, 0.0), + getRealValue(33, 0.0), + // definition point 2 + getRealValue(14, 0.0), + getRealValue(24, 0.0), + getRealValue(34, 0.0), + // definition point 3 + getRealValue(15, 0.0), + getRealValue(25, 0.0), + getRealValue(35, 0.0), + // definition point 4 + getRealValue(16, 0.0), + getRealValue(26, 0.0), + getRealValue(36, 0.0)); + creationInterface->addDimAngular(d, da); +} + + +/** + * Adds an angular dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimAngular3P(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // angular dimension (3P): + DL_DimAngular3PData da( + // definition point 1 + getRealValue(13, 0.0), + getRealValue(23, 0.0), + getRealValue(33, 0.0), + // definition point 2 + getRealValue(14, 0.0), + getRealValue(24, 0.0), + getRealValue(34, 0.0), + // definition point 3 + getRealValue(15, 0.0), + getRealValue(25, 0.0), + getRealValue(35, 0.0)); + creationInterface->addDimAngular3P(d, da); +} + + + +/** + * Adds an ordinate dimension entity that was read from the file via the creation interface. + */ +void DL_Dxf::addDimOrdinate(DL_CreationInterface* creationInterface) { + DL_DimensionData d = getDimData(); + + // ordinate dimension: + DL_DimOrdinateData dl( + // definition point 1 + getRealValue(13, 0.0), + getRealValue(23, 0.0), + getRealValue(33, 0.0), + // definition point 2 + getRealValue(14, 0.0), + getRealValue(24, 0.0), + getRealValue(34, 0.0), + (getIntValue(70, 0)&64)==64 // true: X-type, false: Y-type + ); + creationInterface->addDimOrdinate(d, dl); +} + + + +/** + * Adds a leader entity that was read from the file via the creation interface. + */ +void DL_Dxf::addLeader(DL_CreationInterface* creationInterface) { + // leader (arrow) + DL_LeaderData le( + // arrow head flag + getIntValue(71, 1), + // leader path type + getIntValue(72, 0), + // Leader creation flag + getIntValue(73, 3), + // Hookline direction flag + getIntValue(74, 1), + // Hookline flag + getIntValue(75, 0), + // Text annotation height + getRealValue(40, 1.0), + // Text annotation width + getRealValue(41, 1.0), + // Number of vertices in leader + getIntValue(76, 0) + ); + creationInterface->addLeader(le); + + for (int i=0; iaddLeaderVertex(d); + } + creationInterface->endEntity(); +} + +/** + * Adds a hatch entity that was read from the file via the creation interface. + */ +void DL_Dxf::addHatch(DL_CreationInterface* creationInterface) { + DL_HatchData hd(getIntValue(91, 1), + getIntValue(70, 0), + getRealValue(41, 1.0), + getRealValue(52, 0.0), + getStringValue(2, "")); + + creationInterface->addHatch(hd); + + for (unsigned int i=0; iaddHatchLoop(DL_HatchLoopData(hatchEdges[i].size())); + for (unsigned int k=0; kaddHatchEdge(DL_HatchEdgeData(hatchEdges[i][k])); + } + } + + creationInterface->endEntity(); +} + +void DL_Dxf::addHatchLoop() { + addHatchEdge(); + hatchEdges.push_back(std::vector()); +} + +void DL_Dxf::addHatchEdge() { + if (hatchEdge.defined) { + if (hatchEdges.size()>0) { + hatchEdges.back().push_back(hatchEdge); + } + hatchEdge = DL_HatchEdgeData(); + } +} + +/** + * Handles all hatch data. + */ +bool DL_Dxf::handleHatchData(DL_CreationInterface* creationInterface) { + // New polyline loop, group code 92 + // or new loop with individual edges, group code 93 + if (groupCode==92 || groupCode==93) { + if (firstHatchLoop) { + hatchEdges.clear(); + firstHatchLoop = false; + } + if (groupCode==92 && (toInt(groupValue)&2)==2) { + addHatchLoop(); + } + if (groupCode==93) { + addHatchLoop(); + } + return true; + } + + // New hatch edge or new section / entity: add last hatch edge: + if (groupCode==72 || groupCode==0 || groupCode==78 || groupCode==98) { + // polyline boundaries use code 72 for bulge flag: + if (groupCode!=72 || (getIntValue(92, 0)&2)==0) { + addHatchEdge(); + } + + if (groupCode==0 /*|| groupCode==78*/) { + addHatch(creationInterface); + } + else { + hatchEdge.type = toInt(groupValue); + } + return true; + } + + // polyline boundary: + if ((getIntValue(92, 0)&2)==2) { + switch (groupCode) { + case 10: + hatchEdge.type = 0; + hatchEdge.vertices.push_back(std::vector()); + hatchEdge.vertices.back().push_back(toReal(groupValue)); + return true; + case 20: + if (!hatchEdge.vertices.empty()) { + hatchEdge.vertices.back().push_back(toReal(groupValue)); + hatchEdge.defined = true; + } + return true; + case 42: + if (!hatchEdge.vertices.empty()) { + hatchEdge.vertices.back().push_back(toReal(groupValue)); + hatchEdge.defined = true; + } + return true; + } + } + else { + // Line edge: + if (hatchEdge.type==1) { + switch (groupCode) { + case 10: + hatchEdge.x1 = toReal(groupValue); + return true; + case 20: + hatchEdge.y1 = toReal(groupValue); + return true; + case 11: + hatchEdge.x2 = toReal(groupValue); + return true; + case 21: + hatchEdge.y2 = toReal(groupValue); + hatchEdge.defined = true; + return true; + } + } + + // Arc edge: + if (hatchEdge.type==2) { + switch(groupCode) { + case 10: + hatchEdge.cx = toReal(groupValue); + return true; + case 20: + hatchEdge.cy = toReal(groupValue); + return true; + case 40: + hatchEdge.radius = toReal(groupValue); + return true; + case 50: + hatchEdge.angle1 = toReal(groupValue)/360.0*2*M_PI; + return true; + case 51: + hatchEdge.angle2 = toReal(groupValue)/360.0*2*M_PI; + return true; + case 73: + hatchEdge.ccw = (bool)toInt(groupValue); + hatchEdge.defined = true; + return true; + } + } + + // Ellipse arc edge: + if (hatchEdge.type==3) { + switch (groupCode) { + case 10: + hatchEdge.cx = toReal(groupValue); + return true; + case 20: + hatchEdge.cy = toReal(groupValue); + return true; + case 11: + hatchEdge.mx = toReal(groupValue); + return true; + case 21: + hatchEdge.my = toReal(groupValue); + return true; + case 40: + hatchEdge.ratio = toReal(groupValue); + return true; + case 50: + hatchEdge.angle1 = toReal(groupValue)/360.0*2*M_PI; + return true; + case 51: + hatchEdge.angle2 = toReal(groupValue)/360.0*2*M_PI; + return true; + case 73: + hatchEdge.ccw = (bool)toInt(groupValue); + hatchEdge.defined = true; + return true; + } + } + + // Spline edge: + if (hatchEdge.type==4) { + switch (groupCode) { + case 94: + hatchEdge.degree = toInt(groupValue); + return true; + case 73: + hatchEdge.rational = toBool(groupValue); + return true; + case 74: + hatchEdge.periodic = toBool(groupValue); + return true; + case 95: + hatchEdge.nKnots = toInt(groupValue); + return true; + case 96: + hatchEdge.nControl = toInt(groupValue); + return true; + case 97: + hatchEdge.nFit = toInt(groupValue); + return true; + case 40: + if (hatchEdge.knots.size() < hatchEdge.nKnots) { + hatchEdge.knots.push_back(toReal(groupValue)); + } + return true; + case 10: + if (hatchEdge.controlPoints.size() < hatchEdge.nControl) { + std::vector v; + v.push_back(toReal(groupValue)); + hatchEdge.controlPoints.push_back(v); + } + return true; + case 20: + if (!hatchEdge.controlPoints.empty() && hatchEdge.controlPoints.back().size()==1) { + hatchEdge.controlPoints.back().push_back(toReal(groupValue)); + } + hatchEdge.defined = true; + return true; + case 42: + if (hatchEdge.weights.size() < hatchEdge.nControl) { + hatchEdge.weights.push_back(toReal(groupValue)); + } + return true; + case 11: + if (hatchEdge.fitPoints.size() < hatchEdge.nFit) { + std::vector v; + v.push_back(toReal(groupValue)); + hatchEdge.fitPoints.push_back(v); + } + return true; + case 21: + if (!hatchEdge.fitPoints.empty() && hatchEdge.fitPoints.back().size()==1) { + hatchEdge.fitPoints.back().push_back(toReal(groupValue)); + } + hatchEdge.defined = true; + return true; + case 12: + hatchEdge.startTangentX = toReal(groupValue); + return true; + case 22: + hatchEdge.startTangentY = toReal(groupValue); + return true; + case 13: + hatchEdge.endTangentX = toReal(groupValue); + return true; + case 23: + hatchEdge.endTangentY = toReal(groupValue); + return true; + } + } + } + + return false; +} + + +/** + * Adds an image entity that was read from the file via the creation interface. + */ +void DL_Dxf::addImage(DL_CreationInterface* creationInterface) { + DL_ImageData id(// pass ref insead of name we don't have yet + getStringValue(340, ""), + // ins point: + getRealValue(10, 0.0), + getRealValue(20, 0.0), + getRealValue(30, 0.0), + // u vector: + getRealValue(11, 1.0), + getRealValue(21, 0.0), + getRealValue(31, 0.0), + // v vector: + getRealValue(12, 0.0), + getRealValue(22, 1.0), + getRealValue(32, 0.0), + // image size (pixel): + getIntValue(13, 1), + getIntValue(23, 1), + // brightness, contrast, fade + getIntValue(281, 50), + getIntValue(282, 50), + getIntValue(283, 0)); + + creationInterface->addImage(id); + creationInterface->endEntity(); + currentObjectType = DL_UNKNOWN; +} + + + +/** + * Adds an image definition that was read from the file via the creation interface. + */ +void DL_Dxf::addImageDef(DL_CreationInterface* creationInterface) { + DL_ImageDefData id(// handle + getStringValue(5, ""), + getStringValue(1, "")); + + creationInterface->linkImage(id); + creationInterface->endEntity(); + currentObjectType = DL_UNKNOWN; +} + + + +/** + * Ends some special entities like hatches or old style polylines. + */ +void DL_Dxf::endEntity(DL_CreationInterface* creationInterface) { + creationInterface->endEntity(); +} + + +/** + * Ends a sequence and notifies the creation interface. + */ +void DL_Dxf::endSequence(DL_CreationInterface* creationInterface) { + creationInterface->endSequence(); +} + + +/** + * Converts the given string into an int. + * ok is set to false if there was an error. + */ +//int DL_Dxf::stringToInt(const char* s, bool* ok) { +// if (ok!=NULL) { +// // check string: +// *ok = true; +// int i=0; +// bool dot = false; +// do { +// if (s[i]=='\0') { +// break; +// } else if (s[i]=='.') { +// if (dot==true) { +// //std::cerr << "two dots\n"; +// *ok = false; +// } else { +// dot = true; +// } +// } else if (s[i]<'0' || s[i]>'9') { +// //std::cerr << "NaN: '" << s[i] << "'\n"; +// *ok = false; +// } +// i++; +// } while(s[i]!='\0' && *ok==true); +// } + +// return atoi(s); +//} + + +/** + * @brief Opens the given file for writing and returns a pointer + * to the dxf writer. This pointer needs to be passed on to other + * writing functions. + * + * @param file Full path of the file to open. + * + * @return Pointer to an ascii dxf writer object. + */ +DL_WriterA* DL_Dxf::out(const char* file, DL_Codes::version version) { + char* f = new char[strlen(file)+1]; + strcpy(f, file); + this->version = version; + + DL_WriterA* dw = new DL_WriterA(f, version); + if (dw->openFailed()) { + delete dw; + delete[] f; + return NULL; + } else { + delete[] f; + return dw; + } +} + + + +/** + * @brief Writes a DXF header to the file currently opened + * by the given DXF writer object. + */ +void DL_Dxf::writeHeader(DL_WriterA& dw) { + dw.comment("dxflib " DL_VERSION); + dw.sectionHeader(); + + dw.dxfString(9, "$ACADVER"); + switch (version) { + case DL_Codes::AC1009: + dw.dxfString(1, "AC1009"); + break; + case DL_Codes::AC1012: + dw.dxfString(1, "AC1012"); + break; + case DL_Codes::AC1014: + dw.dxfString(1, "AC1014"); + break; + case DL_Codes::AC1015: + dw.dxfString(1, "AC1015"); + break; + case DL_Codes::AC1009_MIN: + // minimalistic DXF version is unidentified in file: + break; + } + + // Newer version require that (otherwise a*cad crashes..) + if (version==DL_VERSION_2000) { + dw.dxfString(9, "$HANDSEED"); + dw.dxfHex(5, 0xFFFF); + } + + // commented out: more variables can be added after that by caller: + //dw.sectionEnd(); +} + + + + +/** + * Writes a point entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writePoint(DL_WriterA& dw, + const DL_PointData& data, + const DL_Attributes& attrib) { + dw.entity("POINT"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbPoint"); + } + dw.coord(DL_POINT_COORD_CODE, data.x, data.y, data.z); +} + + + +/** + * Writes a line entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeLine(DL_WriterA& dw, + const DL_LineData& data, + const DL_Attributes& attrib) { + dw.entity("LINE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbLine"); + } + dw.coord(DL_LINE_START_CODE, data.x1, data.y1, data.z1); + dw.coord(DL_LINE_END_CODE, data.x2, data.y2, data.z2); +} + + + +/** + * Writes an x line entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeXLine(DL_WriterA& dw, + const DL_XLineData& data, + const DL_Attributes& attrib) { + dw.entity("XLINE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbLine"); + } + dw.coord(DL_LINE_START_CODE, data.bx, data.by, data.bz); + dw.coord(DL_LINE_END_CODE, data.dx, data.dy, data.dz); +} + + + +/** + * Writes a ray entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeRay(DL_WriterA& dw, + const DL_RayData& data, + const DL_Attributes& attrib) { + dw.entity("RAY"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbLine"); + } + dw.coord(DL_LINE_START_CODE, data.bx, data.by, data.bz); + dw.coord(DL_LINE_END_CODE, data.dx, data.dy, data.dz); +} + + + +/** + * Writes a polyline entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + * @see writeVertex + */ +void DL_Dxf::writePolyline(DL_WriterA& dw, + const DL_PolylineData& data, + const DL_Attributes& attrib) { + if (version==DL_VERSION_2000) { + dw.entity("LWPOLYLINE"); + dw.dxfString(100, "AcDbEntity"); + dw.entityAttributes(attrib); + dw.dxfString(100, "AcDbPolyline"); + dw.dxfInt(90, (int)data.number); + dw.dxfInt(70, data.flags); + } else { + dw.entity("POLYLINE"); + dw.entityAttributes(attrib); + polylineLayer = attrib.getLayer(); + dw.dxfInt(66, 1); + dw.dxfInt(70, data.flags); + dw.coord(DL_VERTEX_COORD_CODE, 0.0, 0.0, 0.0); + } +} + + + +/** + * Writes a single vertex of a polyline to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeVertex(DL_WriterA& dw, + const DL_VertexData& data) { + + + if (version==DL_VERSION_2000) { + dw.dxfReal(10, data.x); + dw.dxfReal(20, data.y); + dw.dxfReal(30, data.z); + if (fabs(data.bulge)>1.0e-10) { + dw.dxfReal(42, data.bulge); + } + } else { + dw.entity("VERTEX"); + //dw.entityAttributes(attrib); + dw.dxfString(8, polylineLayer); + dw.coord(DL_VERTEX_COORD_CODE, data.x, data.y, data.z); + if (fabs(data.bulge)>1.0e-10) { + dw.dxfReal(42, data.bulge); + } + } +} + + + +/** + * Writes the polyline end. Only needed for DXF R12. + */ +void DL_Dxf::writePolylineEnd(DL_WriterA& dw) { + if (version==DL_VERSION_2000) { + } else { + dw.entity("SEQEND"); + } +} + + +/** + * Writes a spline entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + * @see writeControlPoint + */ +void DL_Dxf::writeSpline(DL_WriterA& dw, + const DL_SplineData& data, + const DL_Attributes& attrib) { + + dw.entity("SPLINE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSpline"); + } + dw.dxfInt(70, data.flags); + dw.dxfInt(71, data.degree); + dw.dxfInt(72, data.nKnots); // number of knots + dw.dxfInt(73, data.nControl); // number of control points + dw.dxfInt(74, data.nFit); // number of fit points +} + + + +/** + * Writes a single control point of a spline to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeControlPoint(DL_WriterA& dw, + const DL_ControlPointData& data) { + + dw.dxfReal(10, data.x); + dw.dxfReal(20, data.y); + dw.dxfReal(30, data.z); +} + + + +/** + * Writes a single fit point of a spline to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeFitPoint(DL_WriterA& dw, + const DL_FitPointData& data) { + + dw.dxfReal(11, data.x); + dw.dxfReal(21, data.y); + dw.dxfReal(31, data.z); +} + + + +/** + * Writes a single knot of a spline to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeKnot(DL_WriterA& dw, + const DL_KnotData& data) { + + dw.dxfReal(40, data.k); +} + + + +/** + * Writes a circle entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeCircle(DL_WriterA& dw, + const DL_CircleData& data, + const DL_Attributes& attrib) { + dw.entity("CIRCLE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbCircle"); + } + dw.coord(10, data.cx, data.cy, data.cz); + dw.dxfReal(40, data.radius); +} + + + +/** + * Writes an arc entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeArc(DL_WriterA& dw, + const DL_ArcData& data, + const DL_Attributes& attrib) { + dw.entity("ARC"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbCircle"); + } + dw.coord(10, data.cx, data.cy, data.cz); + dw.dxfReal(40, data.radius); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbArc"); + } + dw.dxfReal(50, data.angle1); + dw.dxfReal(51, data.angle2); +} + + + +/** + * Writes an ellipse entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeEllipse(DL_WriterA& dw, + const DL_EllipseData& data, + const DL_Attributes& attrib) { + + if (version>DL_VERSION_R12) { + dw.entity("ELLIPSE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEllipse"); + } + dw.coord(10, data.cx, data.cy, data.cz); + dw.coord(11, data.mx, data.my, data.mz); + dw.dxfReal(40, data.ratio); + dw.dxfReal(41, data.angle1); + dw.dxfReal(42, data.angle2); + } +} + + + +/** + * Writes a solid entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeSolid(DL_WriterA& dw, + const DL_SolidData& data, + const DL_Attributes& attrib) { + dw.entity("SOLID"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbTrace"); + } + dw.coord(10, data.x[0], data.y[0], data.z[0]); + dw.coord(11, data.x[1], data.y[1], data.z[1]); + dw.coord(12, data.x[2], data.y[2], data.z[2]); + dw.coord(13, data.x[3], data.y[3], data.z[3]); + dw.dxfReal(39, data.thickness); +} + +/** + * Writes a trace entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeTrace(DL_WriterA& dw, + const DL_TraceData& data, + const DL_Attributes& attrib) { + dw.entity("TRACE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbTrace"); + } + dw.coord(10, data.x[0], data.y[0], data.z[0]); + dw.coord(11, data.x[1], data.y[1], data.z[1]); + dw.coord(12, data.x[2], data.y[2], data.z[2]); + dw.coord(13, data.x[3], data.y[3], data.z[3]); + dw.dxfReal(39, data.thickness); +} + + + +/** + * Writes a 3d face entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::write3dFace(DL_WriterA& dw, + const DL_3dFaceData& data, + const DL_Attributes& attrib) { + dw.entity("3DFACE"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbFace"); + } + dw.coord(10, data.x[0], data.y[0], data.z[0]); + dw.coord(11, data.x[1], data.y[1], data.z[1]); + dw.coord(12, data.x[2], data.y[2], data.z[2]); + dw.coord(13, data.x[3], data.y[3], data.z[3]); +} + + + +/** + * Writes an insert to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeInsert(DL_WriterA& dw, + const DL_InsertData& data, + const DL_Attributes& attrib) { + + if (data.name.empty()) { + std::cerr << "DL_Dxf::writeInsert: " + << "Block name must not be empty\n"; + return; + } + + dw.entity("INSERT"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + if (data.cols!=1 || data.rows!=1) { + dw.dxfString(100, "AcDbMInsertBlock"); + } + else { + dw.dxfString(100, "AcDbBlockReference"); + } + } + dw.dxfString(2, data.name); + dw.dxfReal(10, data.ipx); + dw.dxfReal(20, data.ipy); + dw.dxfReal(30, data.ipz); + if (data.sx!=1.0 || data.sy!=1.0) { + dw.dxfReal(41, data.sx); + dw.dxfReal(42, data.sy); + dw.dxfReal(43, 1.0); + } + if (data.angle!=0.0) { + dw.dxfReal(50, data.angle); + } + if (data.cols!=1 || data.rows!=1) { + dw.dxfInt(70, data.cols); + dw.dxfInt(71, data.rows); + } + if (data.colSp!=0.0 || data.rowSp!=0.0) { + dw.dxfReal(44, data.colSp); + dw.dxfReal(45, data.rowSp); + } +} + + + +/** + * Writes a multi text entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeMText(DL_WriterA& dw, + const DL_MTextData& data, + const DL_Attributes& attrib) { + + dw.entity("MTEXT"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbMText"); + } + dw.dxfReal(10, data.ipx); + dw.dxfReal(20, data.ipy); + dw.dxfReal(30, data.ipz); + dw.dxfReal(40, data.height); + dw.dxfReal(41, data.width); + + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.drawingDirection); + + // Creare text chunks of 250 characters each: + int length = data.text.length(); + char chunk[251]; + int i; + for (i=250; iDL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbAlignedDimension"); + } + + dw.dxfReal(13, edata.epx1); + dw.dxfReal(23, edata.epy1); + dw.dxfReal(33, 0.0); + + dw.dxfReal(14, edata.epx2); + dw.dxfReal(24, edata.epy2); + dw.dxfReal(34, 0.0); + + writeDimStyleOverrides(dw, data); +} + + + +/** + * Writes a linear dimension entity to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific linear dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimLinear(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimLinearData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + dw.dxfInt(70, data.type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbAlignedDimension"); + } + + dw.dxfReal(13, edata.dpx1); + dw.dxfReal(23, edata.dpy1); + dw.dxfReal(33, 0.0); + + dw.dxfReal(14, edata.dpx2); + dw.dxfReal(24, edata.dpy2); + dw.dxfReal(34, 0.0); + + dw.dxfReal(50, edata.angle/(2.0*M_PI)*360.0); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbRotatedDimension"); + } + + writeDimStyleOverrides(dw, data); +} + + + +/** + * Writes a radial dimension entity to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific radial dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimRadial(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimRadialData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + dw.dxfInt(70, data.type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbRadialDimension"); + } + + dw.dxfReal(15, edata.dpx); + dw.dxfReal(25, edata.dpy); + dw.dxfReal(35, 0.0); + + dw.dxfReal(40, edata.leader); + + writeDimStyleOverrides(dw, data); +} + + + +/** + * Writes a diametric dimension entity to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific diametric dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimDiametric(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimDiametricData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + dw.dxfInt(70, data.type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDiametricDimension"); + } + + dw.dxfReal(15, edata.dpx); + dw.dxfReal(25, edata.dpy); + dw.dxfReal(35, 0.0); + + dw.dxfReal(40, edata.leader); + + writeDimStyleOverrides(dw, data); +} + + + +/** + * Writes an angular dimension entity to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific angular dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimAngular(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimAngularData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + dw.dxfInt(70, data.type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDb2LineAngularDimension"); + } + + dw.dxfReal(13, edata.dpx1); + dw.dxfReal(23, edata.dpy1); + dw.dxfReal(33, 0.0); + + dw.dxfReal(14, edata.dpx2); + dw.dxfReal(24, edata.dpy2); + dw.dxfReal(34, 0.0); + + dw.dxfReal(15, edata.dpx3); + dw.dxfReal(25, edata.dpy3); + dw.dxfReal(35, 0.0); + + dw.dxfReal(16, edata.dpx4); + dw.dxfReal(26, edata.dpy4); + dw.dxfReal(36, 0.0); +} + + + +/** + * Writes an angular dimension entity (3 points version) to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific angular dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimAngular3P(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimAngular3PData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + dw.dxfInt(70, data.type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfReal(42, data.angle); + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDb3PointAngularDimension"); + } + + dw.dxfReal(13, edata.dpx1); + dw.dxfReal(23, edata.dpy1); + dw.dxfReal(33, 0.0); + + dw.dxfReal(14, edata.dpx2); + dw.dxfReal(24, edata.dpy2); + dw.dxfReal(34, 0.0); + + dw.dxfReal(15, edata.dpx3); + dw.dxfReal(25, edata.dpy3); + dw.dxfReal(35, 0.0); +} + + + + +/** + * Writes an ordinate dimension entity to the file. + * + * @param dw DXF writer + * @param data Generic dimension data for from the file + * @param data Specific ordinate dimension data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeDimOrdinate(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimOrdinateData& edata, + const DL_Attributes& attrib) { + + dw.entity("DIMENSION"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimension"); + } + + dw.dxfReal(10, data.dpx); + dw.dxfReal(20, data.dpy); + dw.dxfReal(30, data.dpz); + + dw.dxfReal(11, data.mpx); + dw.dxfReal(21, data.mpy); + dw.dxfReal(31, 0.0); + + int type = data.type; + if (edata.xtype) { + type|=0x40; + } + + dw.dxfInt(70, type); + if (version>DL_VERSION_R12) { + dw.dxfInt(71, data.attachmentPoint); + dw.dxfInt(72, data.lineSpacingStyle); // opt + dw.dxfReal(41, data.lineSpacingFactor); // opt + } + + dw.dxfString(1, data.text); // opt + //dw.dxfString(3, data.style); + dw.dxfString(3, "Standard"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbOrdinateDimension"); + } + + dw.dxfReal(13, edata.dpx1); + dw.dxfReal(23, edata.dpy1); + dw.dxfReal(33, 0.0); + + dw.dxfReal(14, edata.dpx2); + dw.dxfReal(24, edata.dpy2); + dw.dxfReal(34, 0.0); +} + + + +/** + * Writes a leader entity to the file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + * @see writeVertex + */ +void DL_Dxf::writeLeader(DL_WriterA& dw, + const DL_LeaderData& data, + const DL_Attributes& attrib) { + if (version>DL_VERSION_R12) { + dw.entity("LEADER"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbLeader"); + } + dw.dxfString(3, "Standard"); + dw.dxfInt(71, data.arrowHeadFlag); + dw.dxfInt(72, data.leaderPathType); + dw.dxfInt(73, data.leaderCreationFlag); + dw.dxfInt(74, data.hooklineDirectionFlag); + dw.dxfInt(75, data.hooklineFlag); + dw.dxfReal(40, data.textAnnotationHeight); + dw.dxfReal(41, data.textAnnotationWidth); + dw.dxfInt(76, data.number); + } +} + + + +/** + * Writes a single vertex of a leader to the file. + * + * @param dw DXF writer + * @param data Entity data + */ +void DL_Dxf::writeLeaderVertex(DL_WriterA& dw, + const DL_LeaderVertexData& data) { + if (version>DL_VERSION_R12) { + dw.dxfReal(10, data.x); + dw.dxfReal(20, data.y); + } +} + + + +/** + * Writes the beginning of a hatch entity to the file. + * This must be followed by one or more writeHatchLoop() + * calls and a writeHatch2() call. + * + * @param dw DXF writer + * @param data Entity data. + * @param attrib Attributes + */ +void DL_Dxf::writeHatch1(DL_WriterA& dw, + const DL_HatchData& data, + const DL_Attributes& attrib) { + + dw.entity("HATCH"); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbHatch"); + } + dw.dxfReal(10, 0.0); // elevation + dw.dxfReal(20, 0.0); + dw.dxfReal(30, 0.0); + dw.dxfReal(210, 0.0); // extrusion dir. + dw.dxfReal(220, 0.0); + dw.dxfReal(230, 1.0); + if (data.solid==false) { + dw.dxfString(2, data.pattern); + } else { + dw.dxfString(2, "SOLID"); + } + dw.dxfInt(70, (int)data.solid); + dw.dxfInt(71, 0); // non-associative + dw.dxfInt(91, data.numLoops); +} + + + +/** + * Writes the end of a hatch entity to the file. + * + * @param dw DXF writer + * @param data Entity data. + * @param attrib Attributes + */ +void DL_Dxf::writeHatch2(DL_WriterA& dw, + const DL_HatchData& data, + const DL_Attributes& /*attrib*/) { + + dw.dxfInt(75, 0); // odd parity + dw.dxfInt(76, 1); // pattern type + if (data.solid==false) { + dw.dxfReal(52, data.angle); + dw.dxfReal(41, data.scale); + dw.dxfInt(77, 0); // not double + //dw.dxfInt(78, 0); + dw.dxfInt(78, 1); + dw.dxfReal(53, 45.0); + dw.dxfReal(43, 0.0); + dw.dxfReal(44, 0.0); + dw.dxfReal(45, -0.0883883476483184); + dw.dxfReal(46, 0.0883883476483185); + dw.dxfInt(79, 0); + } + dw.dxfInt(98, 0); + + if (version==DL_VERSION_2000) { + dw.dxfString(1001, "ACAD"); + dw.dxfReal(1010, data.originX); + dw.dxfReal(1020, data.originY); + dw.dxfInt(1030, 0.0); + } +} + + + +/** + * Writes the beginning of a hatch loop to the file. This + * must happen after writing the beginning of a hatch entity. + * + * @param dw DXF writer + * @param data Entity data. + * @param attrib Attributes + */ +void DL_Dxf::writeHatchLoop1(DL_WriterA& dw, + const DL_HatchLoopData& data) { + + dw.dxfInt(92, 1); + dw.dxfInt(93, data.numEdges); + //dw.dxfInt(97, 0); +} + + + +/** + * Writes the end of a hatch loop to the file. + * + * @param dw DXF writer + * @param data Entity data. + * @param attrib Attributes + */ +void DL_Dxf::writeHatchLoop2(DL_WriterA& dw, + const DL_HatchLoopData& /*data*/) { + + dw.dxfInt(97, 0); +} + + +/** + * Writes the beginning of a hatch entity to the file. + * + * @param dw DXF writer + * @param data Entity data. + * @param attrib Attributes + */ +void DL_Dxf::writeHatchEdge(DL_WriterA& dw, + const DL_HatchEdgeData& data) { + + if (data.type<1 || data.type>4) { + printf("WARNING: unsupported hatch edge type: %d", data.type); + } + + dw.dxfInt(72, data.type); + + switch (data.type) { + // line: + case 1: + dw.dxfReal(10, data.x1); + dw.dxfReal(20, data.y1); + dw.dxfReal(11, data.x2); + dw.dxfReal(21, data.y2); + break; + + // arc: + case 2: + dw.dxfReal(10, data.cx); + dw.dxfReal(20, data.cy); + dw.dxfReal(40, data.radius); + dw.dxfReal(50, data.angle1/(2*M_PI)*360.0); + dw.dxfReal(51, data.angle2/(2*M_PI)*360.0); + dw.dxfInt(73, (int)(data.ccw)); + break; + + // ellipse arc: + case 3: + dw.dxfReal(10, data.cx); + dw.dxfReal(20, data.cy); + dw.dxfReal(11, data.mx); + dw.dxfReal(21, data.my); + dw.dxfReal(40, data.ratio); + dw.dxfReal(50, data.angle1/(2*M_PI)*360.0); + dw.dxfReal(51, data.angle2/(2*M_PI)*360.0); + dw.dxfInt(73, (int)(data.ccw)); + break; + + // spline: + case 4: + dw.dxfInt(94, data.degree); + dw.dxfBool(73, data.rational); + dw.dxfBool(74, data.periodic); + dw.dxfInt(95, data.nKnots); + dw.dxfInt(96, data.nControl); + for (unsigned int i=0; i0) { + dw.dxfInt(97, data.nFit); + for (unsigned int i=0; i1.0e-4 || fabs(data.startTangentY)>1.0e-4) { + dw.dxfReal(12, data.startTangentX); + dw.dxfReal(22, data.startTangentY); + } + if (fabs(data.endTangentX)>1.0e-4 || fabs(data.endTangentY)>1.0e-4) { + dw.dxfReal(13, data.endTangentX); + dw.dxfReal(23, data.endTangentY); + } + break; + + default: + break; + } +} + + + +/** + * Writes an image entity. + * + * @return IMAGEDEF handle. Needed for the IMAGEDEF counterpart. + */ +int DL_Dxf::writeImage(DL_WriterA& dw, + const DL_ImageData& data, + const DL_Attributes& attrib) { + + /*if (data.file.empty()) { + std::cerr << "DL_Dxf::writeImage: " + << "Image file must not be empty\n"; + return; +}*/ + + dw.entity("IMAGE"); + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbEntity"); + } + dw.entityAttributes(attrib); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbRasterImage"); + dw.dxfInt(90, 0); + } + // insertion point + dw.dxfReal(10, data.ipx); + dw.dxfReal(20, data.ipy); + dw.dxfReal(30, data.ipz); + + // vector along bottom side (1 pixel long) + dw.dxfReal(11, data.ux); + dw.dxfReal(21, data.uy); + dw.dxfReal(31, data.uz); + + // vector along left side (1 pixel long) + dw.dxfReal(12, data.vx); + dw.dxfReal(22, data.vy); + dw.dxfReal(32, data.vz); + + // image size in pixel + dw.dxfReal(13, data.width); + dw.dxfReal(23, data.height); + + // handle of IMAGEDEF object + int handle = dw.incHandle(); + dw.dxfHex(340, handle); + + // flags + dw.dxfInt(70, 15); + + // clipping: + dw.dxfInt(280, 0); + + // brightness, contrast, fade + dw.dxfInt(281, data.brightness); + dw.dxfInt(282, data.contrast); + dw.dxfInt(283, data.fade); + + return handle; +} + + + +/** + * Writes an image definiition entity. + */ +void DL_Dxf::writeImageDef(DL_WriterA& dw, + int handle, + const DL_ImageData& data) { + + /*if (data.file.empty()) { + std::cerr << "DL_Dxf::writeImage: " + << "Image file must not be empty\n"; + return; +}*/ + + dw.dxfString(0, "IMAGEDEF"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, handle); + } + + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbRasterImageDef"); + dw.dxfInt(90, 0); + } + // file name: + dw.dxfString(1, data.ref); + + // image size in pixel + dw.dxfReal(10, data.width); + dw.dxfReal(20, data.height); + + dw.dxfReal(11, 1.0); + dw.dxfReal(21, 1.0); + + // loaded: + dw.dxfInt(280, 1); + // units: + dw.dxfInt(281, 0); +} + + +/** + * Writes a layer to the file. Layers are stored in the + * tables section of a DXF file. + * + * @param dw DXF writer + * @param data Entity data from the file + * @param attrib Attributes + */ +void DL_Dxf::writeLayer(DL_WriterA& dw, + const DL_LayerData& data, + const DL_Attributes& attrib) { + + if (data.name.empty()) { + std::cerr << "DL_Dxf::writeLayer: " + << "Layer name must not be empty\n"; + return; + } + + int color = attrib.getColor(); + if (color>=256) { + std::cerr << "Layer color cannot be " << color << ". Changed to 7.\n"; + color = 7; + } + if (data.off) { + // negative color value means layer is off: + color = -color; + } + + if (data.name == "0") { + dw.tableLayerEntry(0x10); + } else { + dw.tableLayerEntry(); + } + + dw.dxfString(2, data.name); + dw.dxfInt(70, data.flags); + dw.dxfInt(62, color); + if (version>=DL_VERSION_2000 && attrib.getColor24()!=-1) { + dw.dxfInt(420, attrib.getColor24()); + } + + dw.dxfString(6, (attrib.getLinetype().length()==0 ? + std::string("CONTINUOUS") : attrib.getLinetype())); + + if (version>=DL_VERSION_2000) { + // layer defpoints cannot be plotted + std::string lstr = data.name; + std::transform(lstr.begin(), lstr.end(), lstr.begin(), tolower); + if (lstr=="defpoints") { + dw.dxfInt(290, 0); + } + } + if (version>=DL_VERSION_2000 && attrib.getWidth()!=-1) { + dw.dxfInt(370, attrib.getWidth()); + } + if (version>=DL_VERSION_2000) { + dw.dxfHex(390, 0xF); + } +} + + + +/** + * Writes a line type to the file. Line types are stored in the + * tables section of a DXF file. + */ +void DL_Dxf::writeLinetype(DL_WriterA& dw, + const DL_LinetypeData& data) { + + std::string nameUpper = data.name; + std::transform(nameUpper.begin(), nameUpper.end(), nameUpper.begin(), ::toupper); + + if (data.name.empty()) { + std::cerr << "DL_Dxf::writeLinetype: " + << "Line type name must not be empty\n"; + return; + } + + // ignore BYLAYER, BYBLOCK for R12 + if (version=DL_VERSION_R13) { + dw.dxfInt(74, 0); + } + } + } +} + + + +/** + * Writes the APPID section to the DXF file. + * + * @param name Application name + */ +void DL_Dxf::writeAppid(DL_WriterA& dw, const std::string& name) { + if (name.empty()) { + std::cerr << "DL_Dxf::writeAppid: " + << "Application name must not be empty\n"; + return; + } + + std::string n = name; + std::transform(n.begin(), n.end(), n.begin(), ::toupper); + + if (n=="ACAD") { + dw.tableAppidEntry(0x12); + } else { + dw.tableAppidEntry(); + } + dw.dxfString(2, name); + dw.dxfInt(70, 0); +} + + + +/** + * Writes a block's definition (no entities) to the DXF file. + */ +void DL_Dxf::writeBlock(DL_WriterA& dw, const DL_BlockData& data) { + if (data.name.empty()) { + std::cerr << "DL_Dxf::writeBlock: " + << "Block name must not be empty\n"; + return; + } + + std::string n = data.name; + std::transform(n.begin(), n.end(), n.begin(), ::toupper); + + if (n=="*PAPER_SPACE") { + dw.sectionBlockEntry(0x1C); + } else if (n=="*MODEL_SPACE") { + dw.sectionBlockEntry(0x20); + } else if (n=="*PAPER_SPACE0") { + dw.sectionBlockEntry(0x24); + } else { + dw.sectionBlockEntry(); + } + dw.dxfString(2, data.name); + dw.dxfInt(70, 0); + dw.coord(10, data.bpx, data.bpy, data.bpz); + dw.dxfString(3, data.name); + dw.dxfString(1, ""); +} + + + +/** + * Writes a block end. + * + * @param name Block name + */ +void DL_Dxf::writeEndBlock(DL_WriterA& dw, const std::string& name) { + std::string n = name; + std::transform(n.begin(), n.end(), n.begin(), ::toupper); + + if (n=="*PAPER_SPACE") { + dw.sectionBlockEntryEnd(0x1D); + } else if (n=="*MODEL_SPACE") { + dw.sectionBlockEntryEnd(0x21); + } else if (n=="*PAPER_SPACE0") { + dw.sectionBlockEntryEnd(0x25); + } else { + dw.sectionBlockEntryEnd(); + } +} + + + +/** + * Writes a viewport section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked VPORT section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeVPort(DL_WriterA& dw) { + dw.dxfString(0, "TABLE"); + dw.dxfString(2, "VPORT"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 0x8); + } + //dw.dxfHex(330, 0); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTable"); + } + dw.dxfInt(70, 1); + dw.dxfString(0, "VPORT"); + //dw.dxfHex(5, 0x2F); + if (version==DL_VERSION_2000) { + dw.handle(); + } + //dw.dxfHex(330, 8); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbViewportTableRecord"); + } + dw.dxfString( 2, "*Active"); + dw.dxfInt( 70, 0); + dw.dxfReal( 10, 0.0); + dw.dxfReal( 20, 0.0); + dw.dxfReal( 11, 1.0); + dw.dxfReal( 21, 1.0); + dw.dxfReal( 12, 286.3055555555555); + dw.dxfReal( 22, 148.5); + dw.dxfReal( 13, 0.0); + dw.dxfReal( 23, 0.0); + dw.dxfReal( 14, 10.0); + dw.dxfReal( 24, 10.0); + dw.dxfReal( 15, 10.0); + dw.dxfReal( 25, 10.0); + dw.dxfReal( 16, 0.0); + dw.dxfReal( 26, 0.0); + dw.dxfReal( 36, 1.0); + dw.dxfReal( 17, 0.0); + dw.dxfReal( 27, 0.0); + dw.dxfReal( 37, 0.0); + dw.dxfReal( 40, 297.0); + dw.dxfReal( 41, 1.92798353909465); + dw.dxfReal( 42, 50.0); + dw.dxfReal( 43, 0.0); + dw.dxfReal( 44, 0.0); + dw.dxfReal( 50, 0.0); + dw.dxfReal( 51, 0.0); + dw.dxfInt( 71, 0); + dw.dxfInt( 72, 100); + dw.dxfInt( 73, 1); + dw.dxfInt( 74, 3); + dw.dxfInt( 75, 1); + dw.dxfInt( 76, 1); + dw.dxfInt( 77, 0); + dw.dxfInt( 78, 0); + + if (version==DL_VERSION_2000) { + dw.dxfInt(281, 0); + dw.dxfInt( 65, 1); + dw.dxfReal(110, 0.0); + dw.dxfReal(120, 0.0); + dw.dxfReal(130, 0.0); + dw.dxfReal(111, 1.0); + dw.dxfReal(121, 0.0); + dw.dxfReal(131, 0.0); + dw.dxfReal(112, 0.0); + dw.dxfReal(122, 1.0); + dw.dxfReal(132, 0.0); + dw.dxfInt( 79, 0); + dw.dxfReal(146, 0.0); + } + dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a style section. This section is needed in DL_VERSION_R13. + */ +void DL_Dxf::writeStyle(DL_WriterA& dw, const DL_StyleData& style) { +// dw.dxfString( 0, "TABLE"); +// dw.dxfString( 2, "STYLE"); +// if (version==DL_VERSION_2000) { +// dw.dxfHex(5, 3); +// } + //dw.dxfHex(330, 0); +// if (version==DL_VERSION_2000) { +// dw.dxfString(100, "AcDbSymbolTable"); +// } +// dw.dxfInt( 70, 1); + dw.dxfString( 0, "STYLE"); + if (version==DL_VERSION_2000) { + if (style.name=="Standard") { + //dw.dxfHex(5, 0x11); + styleHandleStd = dw.handle(); + } + else { + dw.handle(); + } + } + //dw.dxfHex(330, 3); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbTextStyleTableRecord"); + } + dw.dxfString( 2, style.name); + dw.dxfInt( 70, style.flags); + dw.dxfReal( 40, style.fixedTextHeight); + dw.dxfReal( 41, style.widthFactor); + dw.dxfReal( 50, style.obliqueAngle); + dw.dxfInt( 71, style.textGenerationFlags); + dw.dxfReal( 42, style.lastHeightUsed); + if (version==DL_VERSION_2000) { + dw.dxfString( 3, ""); + dw.dxfString( 4, ""); + dw.dxfString(1001, "ACAD"); + //dw.dxfString(1000, style.name); + dw.dxfString(1000, style.primaryFontFile); + int xFlags = 0; + if (style.bold) { + xFlags = xFlags|0x2000000; + } + if (style.italic) { + xFlags = xFlags|0x1000000; + } + dw.dxfInt(1071, xFlags); + } + else { + dw.dxfString( 3, style.primaryFontFile); + dw.dxfString( 4, style.bigFontFile); + } + //dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a view section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked VIEW section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeView(DL_WriterA& dw) { + dw.dxfString( 0, "TABLE"); + dw.dxfString( 2, "VIEW"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 6); + } + //dw.dxfHex(330, 0); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTable"); + } + dw.dxfInt( 70, 0); + dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a ucs section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked UCS section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeUcs(DL_WriterA& dw) { + dw.dxfString( 0, "TABLE"); + dw.dxfString( 2, "UCS"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 7); + } + //dw.dxfHex(330, 0); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTable"); + } + dw.dxfInt( 70, 0); + dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a dimstyle section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked DIMSTYLE section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeDimStyle(DL_WriterA& dw, + double dimasz, double dimexe, double dimexo, + double dimgap, double dimtxt) { + + dw.dxfString( 0, "TABLE"); + dw.dxfString( 2, "DIMSTYLE"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 0xA); + dw.dxfString(100, "AcDbSymbolTable"); + } + dw.dxfInt( 70, 1); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbDimStyleTable"); + dw.dxfInt( 71, 0); + } + + + dw.dxfString( 0, "DIMSTYLE"); + if (version==DL_VERSION_2000) { + dw.dxfHex(105, 0x27); + } + //dw.handle(105); + //dw.dxfHex(330, 0xA); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbDimStyleTableRecord"); + } + dw.dxfString( 2, "Standard"); + if (version==DL_VERSION_R12) { + dw.dxfString( 3, ""); + dw.dxfString( 4, ""); + dw.dxfString( 5, ""); + dw.dxfString( 6, ""); + dw.dxfString( 7, ""); + dw.dxfReal( 40, 1.0); + } + + dw.dxfReal( 41, dimasz); + dw.dxfReal( 42, dimexo); + dw.dxfReal( 43, 3.75); + dw.dxfReal( 44, dimexe); + if (version==DL_VERSION_R12) { + dw.dxfReal( 45, 0.0); + dw.dxfReal( 46, 0.0); + dw.dxfReal( 47, 0.0); + dw.dxfReal( 48, 0.0); + } + dw.dxfInt( 70, 0); + if (version==DL_VERSION_R12) { + dw.dxfInt( 71, 0); + dw.dxfInt( 72, 0); + } + dw.dxfInt( 73, 0); + dw.dxfInt( 74, 0); + if (version==DL_VERSION_R12) { + dw.dxfInt( 75, 0); + dw.dxfInt( 76, 0); + } + dw.dxfInt( 77, 1); + dw.dxfInt( 78, 8); + dw.dxfReal(140, dimtxt); + dw.dxfReal(141, 2.5); + if (version==DL_VERSION_R12) { + dw.dxfReal(142, 0.0); + } + dw.dxfReal(143, 0.03937007874016); + if (version==DL_VERSION_R12) { + dw.dxfReal(144, 1.0); + dw.dxfReal(145, 0.0); + dw.dxfReal(146, 1.0); + } + dw.dxfReal(147, dimgap); + if (version==DL_VERSION_R12) { + dw.dxfInt(170, 0); + } + dw.dxfInt(171, 3); + dw.dxfInt(172, 1); + if (version==DL_VERSION_R12) { + dw.dxfInt(173, 0); + dw.dxfInt(174, 0); + dw.dxfInt(175, 0); + dw.dxfInt(176, 0); + dw.dxfInt(177, 0); + dw.dxfInt(178, 0); + } + if (version==DL_VERSION_2000) { + dw.dxfInt(271, 2); + dw.dxfInt(272, 2); + dw.dxfInt(274, 3); + dw.dxfInt(278, 44); + dw.dxfInt(283, 0); + dw.dxfInt(284, 8); + dw.dxfHex(340, styleHandleStd); + //dw.dxfHex(340, 0x11); + } + // * / + dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a blockrecord section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked BLOCKRECORD section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeBlockRecord(DL_WriterA& dw) { + dw.dxfString( 0, "TABLE"); + dw.dxfString( 2, "BLOCK_RECORD"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 1); + } + //dw.dxfHex(330, 0); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTable"); + } + dw.dxfInt( 70, 1); + + dw.dxfString( 0, "BLOCK_RECORD"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 0x1F); + } + //int msh = dw.handle(); + //dw.setModelSpaceHandle(msh); + //dw.dxfHex(330, 1); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbBlockTableRecord"); + } + dw.dxfString( 2, "*Model_Space"); + dw.dxfHex(340, 0x22); + + dw.dxfString( 0, "BLOCK_RECORD"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 0x1B); + } + //int psh = dw.handle(); + //dw.setPaperSpaceHandle(psh); + //dw.dxfHex(330, 1); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbBlockTableRecord"); + } + dw.dxfString( 2, "*Paper_Space"); + dw.dxfHex(340, 0x1E); + + dw.dxfString( 0, "BLOCK_RECORD"); + if (version==DL_VERSION_2000) { + dw.dxfHex(5, 0x23); + } + //int ps0h = dw.handle(); + //dw.setPaperSpace0Handle(ps0h); + //dw.dxfHex(330, 1); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbBlockTableRecord"); + } + dw.dxfString( 2, "*Paper_Space0"); + dw.dxfHex(340, 0x26); + + //dw.dxfString( 0, "ENDTAB"); +} + + + +/** + * Writes a single block record with the given name. + */ +void DL_Dxf::writeBlockRecord(DL_WriterA& dw, const std::string& name) { + dw.dxfString( 0, "BLOCK_RECORD"); + if (version==DL_VERSION_2000) { + dw.handle(); + } + //dw->dxfHex(330, 1); + if (version==DL_VERSION_2000) { + dw.dxfString(100, "AcDbSymbolTableRecord"); + dw.dxfString(100, "AcDbBlockTableRecord"); + } + dw.dxfString( 2, name); + dw.dxfHex(340, 0); +} + + + +/** + * Writes a objects section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked OBJECTS section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeObjects(DL_WriterA& dw, const std::string& appDictionaryName) { + dw.dxfString( 0, "SECTION"); + dw.dxfString( 2, "OBJECTS"); + + + dw.dxfString( 0, "DICTIONARY"); + dw.dxfHex(5, 0xC); + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(280, 0); + dw.dxfInt(281, 1); + dw.dxfString( 3, "ACAD_GROUP"); + dw.dxfHex(350, 0xD); + dw.dxfString( 3, "ACAD_LAYOUT"); + dw.dxfHex(350, 0x1A); + dw.dxfString( 3, "ACAD_MLINESTYLE"); + dw.dxfHex(350, 0x17); + dw.dxfString( 3, "ACAD_PLOTSETTINGS"); + dw.dxfHex(350, 0x19); + dw.dxfString( 3, "ACAD_PLOTSTYLENAME"); + dw.dxfHex(350, 0xE); + dw.dxfString( 3, "AcDbVariableDictionary"); + int acDbVariableDictionaryHandle = dw.handle(350); + //int acDbVariableDictionaryHandle = dw.getNextHandle(); + //dw.dxfHex(350, acDbVariableDictionaryHandle); + //dw.incHandle(); + + if (appDictionaryName.length()!=0) { + dw.dxfString( 3, appDictionaryName); + appDictionaryHandle = dw.handle(350); + //appDictionaryHandle = dw.getNextHandle(); + //dw.dxfHex(350, appDictionaryHandle); + //dw.incHandle(); + } + + dw.dxfString( 0, "DICTIONARY"); + dw.dxfHex(5, 0xD); + //dw.handle(); // D + //dw.dxfHex(330, 0xC); + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(280, 0); + dw.dxfInt(281, 1); + + + dw.dxfString( 0, "ACDBDICTIONARYWDFLT"); + dw.dxfHex(5, 0xE); + //dicId4 = dw.handle(); // E + //dw.dxfHex(330, 0xC); // C + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(281, 1); + dw.dxfString( 3, "Normal"); + dw.dxfHex(350, 0xF); + //dw.dxfHex(350, dw.getNextHandle()+5); // F + dw.dxfString(100, "AcDbDictionaryWithDefault"); + dw.dxfHex(340, 0xF); + //dw.dxfHex(340, dw.getNextHandle()+5); // F + + + dw.dxfString( 0, "ACDBPLACEHOLDER"); + dw.dxfHex(5, 0xF); + //dw.handle(); // F + //dw.dxfHex(330, dicId4); // E + + + dw.dxfString( 0, "DICTIONARY"); + //dicId3 = dw.handle(); // 17 + dw.dxfHex(5, 0x17); + //dw.dxfHex(330, 0xC); // C + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(280, 0); + dw.dxfInt(281, 1); + dw.dxfString( 3, "Standard"); + dw.dxfHex(350, 0x18); + //dw.dxfHex(350, dw.getNextHandle()+5); // 18 + + + dw.dxfString( 0, "MLINESTYLE"); + dw.dxfHex(5, 0x18); + //dw.handle(); // 18 + //dw.dxfHex(330, dicId3); // 17 + dw.dxfString(100, "AcDbMlineStyle"); + dw.dxfString( 2, "STANDARD"); + dw.dxfInt( 70, 0); + dw.dxfString( 3, ""); + dw.dxfInt( 62, 256); + dw.dxfReal( 51, 90.0); + dw.dxfReal( 52, 90.0); + dw.dxfInt( 71, 2); + dw.dxfReal( 49, 0.5); + dw.dxfInt( 62, 256); + dw.dxfString( 6, "BYLAYER"); + dw.dxfReal( 49, -0.5); + dw.dxfInt( 62, 256); + dw.dxfString( 6, "BYLAYER"); + + + dw.dxfString( 0, "DICTIONARY"); + dw.dxfHex(5, 0x19); + //dw.handle(); // 17 + //dw.dxfHex(330, 0xC); // C + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(280, 0); + dw.dxfInt(281, 1); + + + dw.dxfString( 0, "DICTIONARY"); + //dicId2 = dw.handle(); // 1A + dw.dxfHex(5, 0x1A); + //dw.dxfHex(330, 0xC); + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(281, 1); + dw.dxfString( 3, "Layout1"); + dw.dxfHex(350, 0x1E); + //dw.dxfHex(350, dw.getNextHandle()+2); // 1E + dw.dxfString( 3, "Layout2"); + dw.dxfHex(350, 0x26); + //dw.dxfHex(350, dw.getNextHandle()+4); // 26 + dw.dxfString( 3, "Model"); + dw.dxfHex(350, 0x22); + //dw.dxfHex(350, dw.getNextHandle()+5); // 22 + + + dw.dxfString( 0, "LAYOUT"); + dw.dxfHex(5, 0x1E); + //dw.handle(); // 1E + //dw.dxfHex(330, dicId2); // 1A + dw.dxfString(100, "AcDbPlotSettings"); + dw.dxfString( 1, ""); + dw.dxfString( 2, "none_device"); + dw.dxfString( 4, ""); + dw.dxfString( 6, ""); + dw.dxfReal( 40, 0.0); + dw.dxfReal( 41, 0.0); + dw.dxfReal( 42, 0.0); + dw.dxfReal( 43, 0.0); + dw.dxfReal( 44, 0.0); + dw.dxfReal( 45, 0.0); + dw.dxfReal( 46, 0.0); + dw.dxfReal( 47, 0.0); + dw.dxfReal( 48, 0.0); + dw.dxfReal( 49, 0.0); + dw.dxfReal(140, 0.0); + dw.dxfReal(141, 0.0); + dw.dxfReal(142, 1.0); + dw.dxfReal(143, 1.0); + dw.dxfInt( 70, 688); + dw.dxfInt( 72, 0); + dw.dxfInt( 73, 0); + dw.dxfInt( 74, 5); + dw.dxfString( 7, ""); + dw.dxfInt( 75, 16); + dw.dxfReal(147, 1.0); + dw.dxfReal(148, 0.0); + dw.dxfReal(149, 0.0); + dw.dxfString(100, "AcDbLayout"); + dw.dxfString( 1, "Layout1"); + dw.dxfInt( 70, 1); + dw.dxfInt( 71, 1); + dw.dxfReal( 10, 0.0); + dw.dxfReal( 20, 0.0); + dw.dxfReal( 11, 420.0); + dw.dxfReal( 21, 297.0); + dw.dxfReal( 12, 0.0); + dw.dxfReal( 22, 0.0); + dw.dxfReal( 32, 0.0); + dw.dxfReal( 14, 1.000000000000000E+20); + dw.dxfReal( 24, 1.000000000000000E+20); + dw.dxfReal( 34, 1.000000000000000E+20); + dw.dxfReal( 15, -1.000000000000000E+20); + dw.dxfReal( 25, -1.000000000000000E+20); + dw.dxfReal( 35, -1.000000000000000E+20); + dw.dxfReal(146, 0.0); + dw.dxfReal( 13, 0.0); + dw.dxfReal( 23, 0.0); + dw.dxfReal( 33, 0.0); + dw.dxfReal( 16, 1.0); + dw.dxfReal( 26, 0.0); + dw.dxfReal( 36, 0.0); + dw.dxfReal( 17, 0.0); + dw.dxfReal( 27, 1.0); + dw.dxfReal( 37, 0.0); + dw.dxfInt( 76, 0); + //dw.dxfHex(330, dw.getPaperSpaceHandle()); // 1B + dw.dxfHex(330, 0x1B); + + + dw.dxfString( 0, "LAYOUT"); + dw.dxfHex(5, 0x22); + //dw.handle(); // 22 + //dw.dxfHex(330, dicId2); // 1A + dw.dxfString(100, "AcDbPlotSettings"); + dw.dxfString( 1, ""); + dw.dxfString( 2, "none_device"); + dw.dxfString( 4, ""); + dw.dxfString( 6, ""); + dw.dxfReal( 40, 0.0); + dw.dxfReal( 41, 0.0); + dw.dxfReal( 42, 0.0); + dw.dxfReal( 43, 0.0); + dw.dxfReal( 44, 0.0); + dw.dxfReal( 45, 0.0); + dw.dxfReal( 46, 0.0); + dw.dxfReal( 47, 0.0); + dw.dxfReal( 48, 0.0); + dw.dxfReal( 49, 0.0); + dw.dxfReal(140, 0.0); + dw.dxfReal(141, 0.0); + dw.dxfReal(142, 1.0); + dw.dxfReal(143, 1.0); + dw.dxfInt( 70, 1712); + dw.dxfInt( 72, 0); + dw.dxfInt( 73, 0); + dw.dxfInt( 74, 0); + dw.dxfString( 7, ""); + dw.dxfInt( 75, 0); + dw.dxfReal(147, 1.0); + dw.dxfReal(148, 0.0); + dw.dxfReal(149, 0.0); + dw.dxfString(100, "AcDbLayout"); + dw.dxfString( 1, "Model"); + dw.dxfInt( 70, 1); + dw.dxfInt( 71, 0); + dw.dxfReal( 10, 0.0); + dw.dxfReal( 20, 0.0); + dw.dxfReal( 11, 12.0); + dw.dxfReal( 21, 9.0); + dw.dxfReal( 12, 0.0); + dw.dxfReal( 22, 0.0); + dw.dxfReal( 32, 0.0); + dw.dxfReal( 14, 0.0); + dw.dxfReal( 24, 0.0); + dw.dxfReal( 34, 0.0); + dw.dxfReal( 15, 0.0); + dw.dxfReal( 25, 0.0); + dw.dxfReal( 35, 0.0); + dw.dxfReal(146, 0.0); + dw.dxfReal( 13, 0.0); + dw.dxfReal( 23, 0.0); + dw.dxfReal( 33, 0.0); + dw.dxfReal( 16, 1.0); + dw.dxfReal( 26, 0.0); + dw.dxfReal( 36, 0.0); + dw.dxfReal( 17, 0.0); + dw.dxfReal( 27, 1.0); + dw.dxfReal( 37, 0.0); + dw.dxfInt( 76, 0); + //dw.dxfHex(330, dw.getModelSpaceHandle()); // 1F + dw.dxfHex(330, 0x1F); + + + dw.dxfString( 0, "LAYOUT"); + //dw.handle(); // 26 + dw.dxfHex(5, 0x26); + //dw.dxfHex(330, dicId2); // 1A + dw.dxfString(100, "AcDbPlotSettings"); + dw.dxfString( 1, ""); + dw.dxfString( 2, "none_device"); + dw.dxfString( 4, ""); + dw.dxfString( 6, ""); + dw.dxfReal( 40, 0.0); + dw.dxfReal( 41, 0.0); + dw.dxfReal( 42, 0.0); + dw.dxfReal( 43, 0.0); + dw.dxfReal( 44, 0.0); + dw.dxfReal( 45, 0.0); + dw.dxfReal( 46, 0.0); + dw.dxfReal( 47, 0.0); + dw.dxfReal( 48, 0.0); + dw.dxfReal( 49, 0.0); + dw.dxfReal(140, 0.0); + dw.dxfReal(141, 0.0); + dw.dxfReal(142, 1.0); + dw.dxfReal(143, 1.0); + dw.dxfInt( 70, 688); + dw.dxfInt( 72, 0); + dw.dxfInt( 73, 0); + dw.dxfInt( 74, 5); + dw.dxfString( 7, ""); + dw.dxfInt( 75, 16); + dw.dxfReal(147, 1.0); + dw.dxfReal(148, 0.0); + dw.dxfReal(149, 0.0); + dw.dxfString(100, "AcDbLayout"); + dw.dxfString( 1, "Layout2"); + dw.dxfInt( 70, 1); + dw.dxfInt( 71, 2); + dw.dxfReal( 10, 0.0); + dw.dxfReal( 20, 0.0); + dw.dxfReal( 11, 12.0); + dw.dxfReal( 21, 9.0); + dw.dxfReal( 12, 0.0); + dw.dxfReal( 22, 0.0); + dw.dxfReal( 32, 0.0); + dw.dxfReal( 14, 0.0); + dw.dxfReal( 24, 0.0); + dw.dxfReal( 34, 0.0); + dw.dxfReal( 15, 0.0); + dw.dxfReal( 25, 0.0); + dw.dxfReal( 35, 0.0); + dw.dxfReal(146, 0.0); + dw.dxfReal( 13, 0.0); + dw.dxfReal( 23, 0.0); + dw.dxfReal( 33, 0.0); + dw.dxfReal( 16, 1.0); + dw.dxfReal( 26, 0.0); + dw.dxfReal( 36, 0.0); + dw.dxfReal( 17, 0.0); + dw.dxfReal( 27, 1.0); + dw.dxfReal( 37, 0.0); + dw.dxfInt( 76, 0); + //dw.dxfHex(330, dw.getPaperSpace0Handle()); // 23 + dw.dxfHex(330, 0x23); + + dw.dxfString( 0, "DICTIONARY"); + //dw.dxfHex(5, 0x2C); + //dicId5 = + dw.dxfHex(5, acDbVariableDictionaryHandle); + //dw.handle(); // 2C + //dw.dxfHex(330, 0xC); // C + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(281, 1); + dw.dxfString( 3, "DIMASSOC"); + //dw.dxfHex(350, 0x2F); + dw.dxfHex(350, dw.getNextHandle()+1); // 2E + dw.dxfString( 3, "HIDETEXT"); + //dw.dxfHex(350, 0x2E); + dw.dxfHex(350, dw.getNextHandle()); // 2D + + + dw.dxfString( 0, "DICTIONARYVAR"); + //dw.dxfHex(5, 0x2E); + dw.handle(); // 2E + //dw.dxfHex(330, dicId5); // 2C + dw.dxfString(100, "DictionaryVariables"); + dw.dxfInt(280, 0); + dw.dxfInt( 1, 2); + + + dw.dxfString( 0, "DICTIONARYVAR"); + //dw.dxfHex(5, 0x2D); + dw.handle(); // 2D + //dw.dxfHex(330, dicId5); // 2C + dw.dxfString(100, "DictionaryVariables"); + dw.dxfInt(280, 0); + dw.dxfInt( 1, 1); +} + +void DL_Dxf::writeAppDictionary(DL_WriterA& dw) { + dw.dxfString( 0, "DICTIONARY"); + //dw.handle(); + dw.dxfHex(5, appDictionaryHandle); + dw.dxfString(100, "AcDbDictionary"); + dw.dxfInt(281, 1); +} + +int DL_Dxf::writeDictionaryEntry(DL_WriterA& dw, const std::string& name) { + dw.dxfString( 3, name); + int handle = dw.getNextHandle(); + dw.dxfHex(350, handle); + dw.incHandle(); + return handle; +} + +void DL_Dxf::writeXRecord(DL_WriterA& dw, int handle, int value) { + dw.dxfString( 0, "XRECORD"); + dw.dxfHex(5, handle); + dw.dxfHex(330, appDictionaryHandle); + dw.dxfString(100, "AcDbXrecord"); + dw.dxfInt(280, 1); + dw.dxfInt(90, value); +} + +void DL_Dxf::writeXRecord(DL_WriterA& dw, int handle, double value) { + dw.dxfString( 0, "XRECORD"); + dw.dxfHex(5, handle); + dw.dxfHex(330, appDictionaryHandle); + dw.dxfString(100, "AcDbXrecord"); + dw.dxfInt(280, 1); + dw.dxfReal(40, value); +} + +void DL_Dxf::writeXRecord(DL_WriterA& dw, int handle, bool value) { + dw.dxfString( 0, "XRECORD"); + dw.dxfHex(5, handle); + dw.dxfHex(330, appDictionaryHandle); + dw.dxfString(100, "AcDbXrecord"); + dw.dxfInt(280, 1); + dw.dxfBool(290, value); +} + +void DL_Dxf::writeXRecord(DL_WriterA& dw, int handle, const std::string& value) { + dw.dxfString( 0, "XRECORD"); + dw.dxfHex(5, handle); + dw.dxfHex(330, appDictionaryHandle); + dw.dxfString(100, "AcDbXrecord"); + dw.dxfInt(280, 1); + dw.dxfString(1000, value); +} + +/** + * Writes the end of the objects section. This section is needed in DL_VERSION_R13. + * Note that this method currently only writes a faked OBJECTS section + * to make the file readable by Aut*cad. + */ +void DL_Dxf::writeObjectsEnd(DL_WriterA& dw) { + dw.dxfString( 0, "ENDSEC"); +} + + + +/** + * Writes a comment to the DXF file. + */ +void DL_Dxf::writeComment(DL_WriterA& dw, const std::string& comment) { + dw.dxfString(999, comment); +} + + +/** + * Checks if the given variable is known by the given DXF version. + */ +bool DL_Dxf::checkVariable(const char* var, DL_Codes::version version) { + if (version>=DL_VERSION_2000) { + return true; + } else if (version==DL_VERSION_R12) { + // these are all the variables recognized by dxf r12: + if (!strcmp(var, "$ACADVER")) { + return true; + } + if (!strcmp(var, "$ACADVER")) { + return true; + } + if (!strcmp(var, "$ANGBASE")) { + return true; + } + if (!strcmp(var, "$ANGDIR")) { + return true; + } + if (!strcmp(var, "$ATTDIA")) { + return true; + } + if (!strcmp(var, "$ATTMODE")) { + return true; + } + if (!strcmp(var, "$ATTREQ")) { + return true; + } + if (!strcmp(var, "$AUNITS")) { + return true; + } + if (!strcmp(var, "$AUPREC")) { + return true; + } + if (!strcmp(var, "$AXISMODE")) { + return true; + } + if (!strcmp(var, "$AXISUNIT")) { + return true; + } + if (!strcmp(var, "$BLIPMODE")) { + return true; + } + if (!strcmp(var, "$CECOLOR")) { + return true; + } + if (!strcmp(var, "$CELTYPE")) { + return true; + } + if (!strcmp(var, "$CHAMFERA")) { + return true; + } + if (!strcmp(var, "$CHAMFERB")) { + return true; + } + if (!strcmp(var, "$CLAYER")) { + return true; + } + if (!strcmp(var, "$COORDS")) { + return true; + } + if (!strcmp(var, "$DIMALT")) { + return true; + } + if (!strcmp(var, "$DIMALTD")) { + return true; + } + if (!strcmp(var, "$DIMALTF")) { + return true; + } + if (!strcmp(var, "$DIMAPOST")) { + return true; + } + if (!strcmp(var, "$DIMASO")) { + return true; + } + if (!strcmp(var, "$DIMASZ")) { + return true; + } + if (!strcmp(var, "$DIMBLK")) { + return true; + } + if (!strcmp(var, "$DIMBLK1")) { + return true; + } + if (!strcmp(var, "$DIMBLK2")) { + return true; + } + if (!strcmp(var, "$DIMCEN")) { + return true; + } + if (!strcmp(var, "$DIMCLRD")) { + return true; + } + if (!strcmp(var, "$DIMCLRE")) { + return true; + } + if (!strcmp(var, "$DIMCLRT")) { + return true; + } + if (!strcmp(var, "$DIMDLE")) { + return true; + } + if (!strcmp(var, "$DIMDLI")) { + return true; + } + if (!strcmp(var, "$DIMEXE")) { + return true; + } + if (!strcmp(var, "$DIMEXO")) { + return true; + } + if (!strcmp(var, "$DIMGAP")) { + return true; + } + if (!strcmp(var, "$DIMLFAC")) { + return true; + } + if (!strcmp(var, "$DIMLIM")) { + return true; + } + if (!strcmp(var, "$DIMPOST")) { + return true; + } + if (!strcmp(var, "$DIMRND")) { + return true; + } + if (!strcmp(var, "$DIMSAH")) { + return true; + } + if (!strcmp(var, "$DIMSCALE")) { + return true; + } + if (!strcmp(var, "$DIMSE1")) { + return true; + } + if (!strcmp(var, "$DIMSE2")) { + return true; + } + if (!strcmp(var, "$DIMSHO")) { + return true; + } + if (!strcmp(var, "$DIMSOXD")) { + return true; + } + if (!strcmp(var, "$DIMSTYLE")) { + return true; + } + if (!strcmp(var, "$DIMTAD")) { + return true; + } + if (!strcmp(var, "$DIMTFAC")) { + return true; + } + if (!strcmp(var, "$DIMTIH")) { + return true; + } + if (!strcmp(var, "$DIMTIX")) { + return true; + } + if (!strcmp(var, "$DIMTM")) { + return true; + } + if (!strcmp(var, "$DIMTOFL")) { + return true; + } + if (!strcmp(var, "$DIMTOH")) { + return true; + } + if (!strcmp(var, "$DIMTOL")) { + return true; + } + if (!strcmp(var, "$DIMTP")) { + return true; + } + if (!strcmp(var, "$DIMTSZ")) { + return true; + } + if (!strcmp(var, "$DIMTVP")) { + return true; + } + if (!strcmp(var, "$DIMTXT")) { + return true; + } + if (!strcmp(var, "$DIMZIN")) { + return true; + } + if (!strcmp(var, "$DWGCODEPAGE")) { + return true; + } + if (!strcmp(var, "$DRAGMODE")) { + return true; + } + if (!strcmp(var, "$ELEVATION")) { + return true; + } + if (!strcmp(var, "$EXTMAX")) { + return true; + } + if (!strcmp(var, "$EXTMIN")) { + return true; + } + if (!strcmp(var, "$FILLETRAD")) { + return true; + } + if (!strcmp(var, "$FILLMODE")) { + return true; + } + if (!strcmp(var, "$HANDLING")) { + return true; + } + if (!strcmp(var, "$HANDSEED")) { + return true; + } + if (!strcmp(var, "$INSBASE")) { + return true; + } + if (!strcmp(var, "$LIMCHECK")) { + return true; + } + if (!strcmp(var, "$LIMMAX")) { + return true; + } + if (!strcmp(var, "$LIMMIN")) { + return true; + } + if (!strcmp(var, "$LTSCALE")) { + return true; + } + if (!strcmp(var, "$LUNITS")) { + return true; + } + if (!strcmp(var, "$LUPREC")) { + return true; + } + if (!strcmp(var, "$MAXACTVP")) { + return true; + } + if (!strcmp(var, "$MENU")) { + return true; + } + if (!strcmp(var, "$MIRRTEXT")) { + return true; + } + if (!strcmp(var, "$ORTHOMODE")) { + return true; + } + if (!strcmp(var, "$OSMODE")) { + return true; + } + if (!strcmp(var, "$PDMODE")) { + return true; + } + if (!strcmp(var, "$PDSIZE")) { + return true; + } + if (!strcmp(var, "$PELEVATION")) { + return true; + } + if (!strcmp(var, "$PEXTMAX")) { + return true; + } + if (!strcmp(var, "$PEXTMIN")) { + return true; + } + if (!strcmp(var, "$PLIMCHECK")) { + return true; + } + if (!strcmp(var, "$PLIMMAX")) { + return true; + } + if (!strcmp(var, "$PLIMMIN")) { + return true; + } + if (!strcmp(var, "$PLINEGEN")) { + return true; + } + if (!strcmp(var, "$PLINEWID")) { + return true; + } + if (!strcmp(var, "$PSLTSCALE")) { + return true; + } + if (!strcmp(var, "$PUCSNAME")) { + return true; + } + if (!strcmp(var, "$PUCSORG")) { + return true; + } + if (!strcmp(var, "$PUCSXDIR")) { + return true; + } + if (!strcmp(var, "$PUCSYDIR")) { + return true; + } + if (!strcmp(var, "$QTEXTMODE")) { + return true; + } + if (!strcmp(var, "$REGENMODE")) { + return true; + } + if (!strcmp(var, "$SHADEDGE")) { + return true; + } + if (!strcmp(var, "$SHADEDIF")) { + return true; + } + if (!strcmp(var, "$SKETCHINC")) { + return true; + } + if (!strcmp(var, "$SKPOLY")) { + return true; + } + if (!strcmp(var, "$SPLFRAME")) { + return true; + } + if (!strcmp(var, "$SPLINESEGS")) { + return true; + } + if (!strcmp(var, "$SPLINETYPE")) { + return true; + } + if (!strcmp(var, "$SURFTAB1")) { + return true; + } + if (!strcmp(var, "$SURFTAB2")) { + return true; + } + if (!strcmp(var, "$SURFTYPE")) { + return true; + } + if (!strcmp(var, "$SURFU")) { + return true; + } + if (!strcmp(var, "$SURFV")) { + return true; + } + if (!strcmp(var, "$TDCREATE")) { + return true; + } + if (!strcmp(var, "$TDINDWG")) { + return true; + } + if (!strcmp(var, "$TDUPDATE")) { + return true; + } + if (!strcmp(var, "$TDUSRTIMER")) { + return true; + } + if (!strcmp(var, "$TEXTSIZE")) { + return true; + } + if (!strcmp(var, "$TEXTSTYLE")) { + return true; + } + if (!strcmp(var, "$THICKNESS")) { + return true; + } + if (!strcmp(var, "$TILEMODE")) { + return true; + } + if (!strcmp(var, "$TRACEWID")) { + return true; + } + if (!strcmp(var, "$UCSNAME")) { + return true; + } + if (!strcmp(var, "$UCSORG")) { + return true; + } + if (!strcmp(var, "$UCSXDIR")) { + return true; + } + if (!strcmp(var, "$UCSYDIR")) { + return true; + } + if (!strcmp(var, "$UNITMODE")) { + return true; + } + if (!strcmp(var, "$USERI1")) { + return true; + } + if (!strcmp(var, "$USERR1")) { + return true; + } + if (!strcmp(var, "$USRTIMER")) { + return true; + } + if (!strcmp(var, "$VISRETAIN")) { + return true; + } + if (!strcmp(var, "$WORLDVIEW")) { + return true; + } + if (!strcmp(var, "$FASTZOOM")) { + return true; + } + if (!strcmp(var, "$GRIDMODE")) { + return true; + } + if (!strcmp(var, "$GRIDUNIT")) { + return true; + } + if (!strcmp(var, "$SNAPANG")) { + return true; + } + if (!strcmp(var, "$SNAPBASE")) { + return true; + } + if (!strcmp(var, "$SNAPISOPAIR")) { + return true; + } + if (!strcmp(var, "$SNAPMODE")) { + return true; + } + if (!strcmp(var, "$SNAPSTYLE")) { + return true; + } + if (!strcmp(var, "$SNAPUNIT")) { + return true; + } + if (!strcmp(var, "$VIEWCTR")) { + return true; + } + if (!strcmp(var, "$VIEWDIR")) { + return true; + } + if (!strcmp(var, "$VIEWSIZE")) { + return true; + } + return false; + } + + return false; +} + + + +/** + * @returns the library version as int (4 bytes, each byte one version number). + * e.g. if str = "2.0.2.0" getLibVersion returns 0x02000200 + */ +int DL_Dxf::getLibVersion(const std::string& str) { + int d[4]; + int idx = 0; + //char v[4][5]; + std::string v[4]; + int ret = 0; + + for (unsigned int i=0; i=2) { + d[3] = str.length(); + + v[0] = str.substr(0, d[0]); + v[1] = str.substr(d[0]+1, d[1]-d[0]-1); + v[2] = str.substr(d[1]+1, d[2]-d[1]-1); + if (idx>=3) { + v[3] = str.substr(d[2]+1, d[3]-d[2]-1); + } + else { + v[3] = "0"; + } + + ret = (atoi(v[0].c_str())<<(3*8)) + + (atoi(v[1].c_str())<<(2*8)) + + (atoi(v[2].c_str())<<(1*8)) + + (atoi(v[3].c_str())<<(0*8)); + + return ret; + } else { + std::cerr << "DL_Dxf::getLibVersion: invalid version number: " << str << "\n"; + return 0; + } +} + +/** + * Converts the given string into a double or returns the given + * default valud (def) if value is NULL or empty. + */ +//double DL_Dxf::toReal(const char* value, double def) { +// if (value!=NULL && value[0] != '\0') { +// printf("toReal: not empty: %s\n", value); +// printf("toReal: val: %f\n", atof(value)); +// printf("toReal: 0: %d\n", value[0]); +// printf("toReal: 1: %d\n", value[1]); +// printf("toReal: 2: %d\n", value[2]); +// double ret; +// if (strchr(value, ',') != NULL) { +// char* tmp = new char[strlen(value)+1]; +// strcpy(tmp, value); +// DL_WriterA::strReplace(tmp, ',', '.'); +// ret = atof(tmp); +// delete[] tmp; +// } +// else { +// ret = atof(value); +// } +// return ret; +// } else { +// return def; +// } +//} + + +/** + * Some test routines. + */ +void DL_Dxf::test() { + char* buf1; + char* buf2; + char* buf3; + char* buf4; + char* buf5; + char* buf6; + + buf1 = new char[10]; + buf2 = new char[10]; + buf3 = new char[10]; + buf4 = new char[10]; + buf5 = new char[10]; + buf6 = new char[10]; + + strcpy(buf1, " 10\n"); + strcpy(buf2, "10"); + strcpy(buf3, "10\n"); + strcpy(buf4, " 10 \n"); + strcpy(buf5, " 10 \r"); + strcpy(buf6, "\t10 \n"); + + std::cout << "1 buf1: '" << buf1 << "'\n"; + stripWhiteSpace(&buf1); + std::cout << "2 buf1: '" << buf1 << "'\n"; + //assert(!strcmp(buf1, "10")); + + std::cout << "1 buf2: '" << buf2 << "'\n"; + stripWhiteSpace(&buf2); + std::cout << "2 buf2: '" << buf2 << "'\n"; + + std::cout << "1 buf3: '" << buf3 << "'\n"; + stripWhiteSpace(&buf3); + std::cout << "2 buf3: '" << buf3 << "'\n"; + + std::cout << "1 buf4: '" << buf4 << "'\n"; + stripWhiteSpace(&buf4); + std::cout << "2 buf4: '" << buf4 << "'\n"; + + std::cout << "1 buf5: '" << buf5 << "'\n"; + stripWhiteSpace(&buf5); + std::cout << "2 buf5: '" << buf5 << "'\n"; + + std::cout << "1 buf6: '" << buf6 << "'\n"; + stripWhiteSpace(&buf6); + std::cout << "2 buf6: '" << buf6 << "'\n"; + +} + + diff --git a/datafile/dxf/dxflib/dl_dxf.h b/datafile/dxf/dxflib/dl_dxf.h new file mode 100644 index 0000000..54443c5 --- /dev/null +++ b/datafile/dxf/dxflib/dl_dxf.h @@ -0,0 +1,529 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_DXF_H +#define DL_DXF_H + +#include "dl_global.h" + +#include +#include +#include +#include +#include +#include + +#include "dl_attributes.h" +#include "dl_codes.h" +#include "dl_entities.h" +#include "dl_writer_ascii.h" + +#ifdef _WIN32 +#undef M_PI +#define M_PI 3.14159265358979323846 +//#pragma warning(disable : 4800) +#endif + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +#ifndef DL_NANDOUBLE +#define DL_NANDOUBLE std::numeric_limits::quiet_NaN() +#endif + +class DL_CreationInterface; +class DL_WriterA; + + +#define DL_VERSION "3.17.0.0" + +#define DL_VERSION_MAJOR 3 +#define DL_VERSION_MINOR 17 +#define DL_VERSION_REV 0 +#define DL_VERSION_BUILD 0 + +#define DL_UNKNOWN 0 +#define DL_LAYER 10 +#define DL_BLOCK 11 +#define DL_ENDBLK 12 +#define DL_LINETYPE 13 +#define DL_STYLE 20 +#define DL_SETTING 50 +#define DL_ENTITY_POINT 100 +#define DL_ENTITY_LINE 101 +#define DL_ENTITY_POLYLINE 102 +#define DL_ENTITY_LWPOLYLINE 103 +#define DL_ENTITY_VERTEX 104 +#define DL_ENTITY_SPLINE 105 +#define DL_ENTITY_KNOT 106 +#define DL_ENTITY_CONTROLPOINT 107 +#define DL_ENTITY_ARC 108 +#define DL_ENTITY_CIRCLE 109 +#define DL_ENTITY_ELLIPSE 110 +#define DL_ENTITY_INSERT 111 +#define DL_ENTITY_TEXT 112 +#define DL_ENTITY_MTEXT 113 +#define DL_ENTITY_DIMENSION 114 +#define DL_ENTITY_LEADER 115 +#define DL_ENTITY_HATCH 116 +#define DL_ENTITY_ATTRIB 117 +#define DL_ENTITY_IMAGE 118 +#define DL_ENTITY_IMAGEDEF 119 +#define DL_ENTITY_TRACE 120 +#define DL_ENTITY_SOLID 121 +#define DL_ENTITY_3DFACE 122 +#define DL_ENTITY_XLINE 123 +#define DL_ENTITY_RAY 124 +#define DL_ENTITY_ARCALIGNEDTEXT 125 +#define DL_ENTITY_SEQEND 126 +#define DL_XRECORD 200 +#define DL_DICTIONARY 210 + + +/** + * Reading and writing of DXF files. + * + * This class can read in a DXF file and calls methods from the + * interface DL_EntityContainer to add the entities to the + * contianer provided by the user of the library. + * + * It can also be used to write DXF files to a certain extent. + * + * When saving entities, special values for colors and linetypes + * can be used: + * + * Special colors are 0 (=BYBLOCK) and 256 (=BYLAYER). + * Special linetypes are "BYLAYER" and "BYBLOCK". + * + * @author Andrew Mustun + */ +class DXFLIB_EXPORT DL_Dxf { +public: + DL_Dxf(); + ~DL_Dxf(); + + bool in(const std::string& file, + DL_CreationInterface* creationInterface); + bool readDxfGroups(FILE* fp, + DL_CreationInterface* creationInterface); + static bool getStrippedLine(std::string& s, unsigned int size, + FILE* stream, bool stripSpace = true); + + bool readDxfGroups(std::stringstream& stream, + DL_CreationInterface* creationInterface); + bool in(std::stringstream &stream, + DL_CreationInterface* creationInterface); + static bool getStrippedLine(std::string& s, unsigned int size, + std::stringstream& stream, bool stripSpace = true); + + static bool stripWhiteSpace(char** s, bool stripSpaces = true); + + bool processDXFGroup(DL_CreationInterface* creationInterface, + int groupCode, const std::string& groupValue); + void addSetting(DL_CreationInterface* creationInterface); + void addLayer(DL_CreationInterface* creationInterface); + void addLinetype(DL_CreationInterface *creationInterface); + void addBlock(DL_CreationInterface* creationInterface); + void endBlock(DL_CreationInterface* creationInterface); + void addTextStyle(DL_CreationInterface* creationInterface); + + void addPoint(DL_CreationInterface* creationInterface); + void addLine(DL_CreationInterface* creationInterface); + void addXLine(DL_CreationInterface* creationInterface); + void addRay(DL_CreationInterface* creationInterface); + + void addPolyline(DL_CreationInterface* creationInterface); + void addVertex(DL_CreationInterface* creationInterface); + + void addSpline(DL_CreationInterface* creationInterface); + + void addArc(DL_CreationInterface* creationInterface); + void addCircle(DL_CreationInterface* creationInterface); + void addEllipse(DL_CreationInterface* creationInterface); + void addInsert(DL_CreationInterface* creationInterface); + + void addTrace(DL_CreationInterface* creationInterface); + void add3dFace(DL_CreationInterface* creationInterface); + void addSolid(DL_CreationInterface* creationInterface); + + void addMText(DL_CreationInterface* creationInterface); + void addText(DL_CreationInterface* creationInterface); + void addArcAlignedText(DL_CreationInterface* creationInterface); + + void addAttribute(DL_CreationInterface* creationInterface); + + DL_DimensionData getDimData(); + void addDimLinear(DL_CreationInterface* creationInterface); + void addDimAligned(DL_CreationInterface* creationInterface); + void addDimRadial(DL_CreationInterface* creationInterface); + void addDimDiametric(DL_CreationInterface* creationInterface); + void addDimAngular(DL_CreationInterface* creationInterface); + void addDimAngular3P(DL_CreationInterface* creationInterface); + void addDimOrdinate(DL_CreationInterface* creationInterface); + + void addLeader(DL_CreationInterface* creationInterface); + + void addHatch(DL_CreationInterface* creationInterface); + void addHatchLoop(); + void addHatchEdge(); + bool handleHatchData(DL_CreationInterface* creationInterface); + + void addImage(DL_CreationInterface* creationInterface); + void addImageDef(DL_CreationInterface* creationInterface); + + void addComment(DL_CreationInterface* creationInterface, const std::string& comment); + + void addDictionary(DL_CreationInterface* creationInterface); + void addDictionaryEntry(DL_CreationInterface* creationInterface); + + bool handleXRecordData(DL_CreationInterface* creationInterface); + bool handleDictionaryData(DL_CreationInterface* creationInterface); + + bool handleXData(DL_CreationInterface *creationInterface); + bool handleMTextData(DL_CreationInterface* creationInterface); + bool handleLWPolylineData(DL_CreationInterface* creationInterface); + bool handleSplineData(DL_CreationInterface* creationInterface); + bool handleLeaderData(DL_CreationInterface* creationInterface); + bool handleLinetypeData(DL_CreationInterface* creationInterface); + + void endEntity(DL_CreationInterface* creationInterface); + + void endSequence(DL_CreationInterface* creationInterface); + + //int stringToInt(const char* s, bool* ok=NULL); + + DL_WriterA* out(const char* file, + DL_Codes::version version=DL_VERSION_2000); + + void writeHeader(DL_WriterA& dw); + + void writePoint(DL_WriterA& dw, + const DL_PointData& data, + const DL_Attributes& attrib); + void writeLine(DL_WriterA& dw, + const DL_LineData& data, + const DL_Attributes& attrib); + void writeXLine(DL_WriterA& dw, + const DL_XLineData& data, + const DL_Attributes& attrib); + void writeRay(DL_WriterA& dw, + const DL_RayData& data, + const DL_Attributes& attrib); + void writePolyline(DL_WriterA& dw, + const DL_PolylineData& data, + const DL_Attributes& attrib); + void writeVertex(DL_WriterA& dw, + const DL_VertexData& data); + void writePolylineEnd(DL_WriterA& dw); + void writeSpline(DL_WriterA& dw, + const DL_SplineData& data, + const DL_Attributes& attrib); + void writeControlPoint(DL_WriterA& dw, + const DL_ControlPointData& data); + void writeFitPoint(DL_WriterA& dw, + const DL_FitPointData& data); + void writeKnot(DL_WriterA& dw, + const DL_KnotData& data); + void writeCircle(DL_WriterA& dw, + const DL_CircleData& data, + const DL_Attributes& attrib); + void writeArc(DL_WriterA& dw, + const DL_ArcData& data, + const DL_Attributes& attrib); + void writeEllipse(DL_WriterA& dw, + const DL_EllipseData& data, + const DL_Attributes& attrib); + void writeSolid(DL_WriterA& dw, + const DL_SolidData& data, + const DL_Attributes& attrib); + void writeTrace(DL_WriterA& dw, + const DL_TraceData& data, + const DL_Attributes& attrib); + void write3dFace(DL_WriterA& dw, + const DL_3dFaceData& data, + const DL_Attributes& attrib); + void writeInsert(DL_WriterA& dw, + const DL_InsertData& data, + const DL_Attributes& attrib); + void writeMText(DL_WriterA& dw, + const DL_MTextData& data, + const DL_Attributes& attrib); + void writeText(DL_WriterA& dw, + const DL_TextData& data, + const DL_Attributes& attrib); + void writeAttribute(DL_WriterA& dw, + const DL_AttributeData& data, + const DL_Attributes& attrib); + void writeDimStyleOverrides(DL_WriterA& dw, + const DL_DimensionData& data); + void writeDimAligned(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimAlignedData& edata, + const DL_Attributes& attrib); + void writeDimLinear(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimLinearData& edata, + const DL_Attributes& attrib); + void writeDimRadial(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimRadialData& edata, + const DL_Attributes& attrib); + void writeDimDiametric(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimDiametricData& edata, + const DL_Attributes& attrib); + void writeDimAngular(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimAngularData& edata, + const DL_Attributes& attrib); + void writeDimAngular3P(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimAngular3PData& edata, + const DL_Attributes& attrib); + void writeDimOrdinate(DL_WriterA& dw, + const DL_DimensionData& data, + const DL_DimOrdinateData& edata, + const DL_Attributes& attrib); + void writeLeader(DL_WriterA& dw, + const DL_LeaderData& data, + const DL_Attributes& attrib); + void writeLeaderVertex(DL_WriterA& dw, + const DL_LeaderVertexData& data); + void writeHatch1(DL_WriterA& dw, + const DL_HatchData& data, + const DL_Attributes& attrib); + void writeHatch2(DL_WriterA& dw, + const DL_HatchData& data, + const DL_Attributes& attrib); + void writeHatchLoop1(DL_WriterA& dw, + const DL_HatchLoopData& data); + void writeHatchLoop2(DL_WriterA& dw, + const DL_HatchLoopData& data); + void writeHatchEdge(DL_WriterA& dw, + const DL_HatchEdgeData& data); + + int writeImage(DL_WriterA& dw, + const DL_ImageData& data, + const DL_Attributes& attrib); + + void writeImageDef(DL_WriterA& dw, int handle, + const DL_ImageData& data); + + void writeLayer(DL_WriterA& dw, + const DL_LayerData& data, + const DL_Attributes& attrib); + + void writeLinetype(DL_WriterA& dw, + const DL_LinetypeData& data); + + void writeAppid(DL_WriterA& dw, const std::string& name); + + void writeBlock(DL_WriterA& dw, + const DL_BlockData& data); + void writeEndBlock(DL_WriterA& dw, const std::string& name); + + void writeVPort(DL_WriterA& dw); + void writeStyle(DL_WriterA& dw, const DL_StyleData& style); + void writeView(DL_WriterA& dw); + void writeUcs(DL_WriterA& dw); + void writeDimStyle(DL_WriterA& dw, + double dimasz, double dimexe, double dimexo, + double dimgap, double dimtxt); + void writeBlockRecord(DL_WriterA& dw); + void writeBlockRecord(DL_WriterA& dw, const std::string& name); + void writeObjects(DL_WriterA& dw, const std::string& appDictionaryName = ""); + void writeAppDictionary(DL_WriterA& dw); + int writeDictionaryEntry(DL_WriterA& dw, const std::string& name); + void writeXRecord(DL_WriterA& dw, int handle, int value); + void writeXRecord(DL_WriterA& dw, int handle, double value); + void writeXRecord(DL_WriterA& dw, int handle, bool value); + void writeXRecord(DL_WriterA& dw, int handle, const std::string& value); + void writeObjectsEnd(DL_WriterA& dw); + + void writeComment(DL_WriterA& dw, const std::string& comment); + + /** + * Converts the given string into a double or returns the given + * default valud (def) if value is NULL or empty. + */ + //static double toReal(const char* value, double def=0.0); + + /** + * Converts the given string into an int or returns the given + * default valud (def) if value is NULL or empty. + */ +// static int toInt(const char* value, int def=0) { +// if (value!=NULL && value[0] != '\0') { +// return atoi(value); +// } + +// return def; +// } + + /** + * Converts the given string into a string or returns the given + * default valud (def) if value is NULL or empty. + */ +// static const char* toString(const char* value, const char* def="") { +// if (value!=NULL && value[0] != '\0') { +// return value; +// } else { +// return def; +// } +// } + + static bool checkVariable(const char* var, DL_Codes::version version); + + DL_Codes::version getVersion() { + return version; + } + + int getLibVersion(const std::string &str); + + static void test(); + + bool hasValue(int code) { + return values.count(code)==1; + } + + int getIntValue(int code, int def) { + if (!hasValue(code)) { + return def; + } + return toInt(values[code]); + } + + int toInt(const std::string& str) { + char* p; + return strtol(str.c_str(), &p, 10); + } + + int getInt16Value(int code, int def) { + if (!hasValue(code)) { + return def; + } + return toInt16(values[code]); + } + + int toInt16(const std::string& str) { + char* p; + return strtol(str.c_str(), &p, 16); + } + + bool toBool(const std::string& str) { + char* p; + return (bool)strtol(str.c_str(), &p, 10); + } + + std::string getStringValue(int code, const std::string& def) { + if (!hasValue(code)) { + return def; + } + return values[code]; + } + + double getRealValue(int code, double def) { + if (!hasValue(code)) { + return def; + } + return toReal(values[code]); + } + + double toReal(const std::string& str) { + double ret; + // make sure the real value uses '.' not ',': + std::string str2 = str; + std::replace(str2.begin(), str2.end(), ',', '.'); + // make sure c++ expects '.' not ',': + std::istringstream istr(str2); + //istr.imbue(std::locale("C")); + istr >> ret; + return ret; + } + +private: + DL_Codes::version version; + + std::string polylineLayer; + double* vertices; + int maxVertices; + int vertexIndex; + + double* knots; + int maxKnots; + int knotIndex; + + double* weights; + int weightIndex; + + double* controlPoints; + int maxControlPoints; + int controlPointIndex; + + double* fitPoints; + int maxFitPoints; + int fitPointIndex; + + double* leaderVertices; + int maxLeaderVertices; + int leaderVertexIndex; + + bool firstHatchLoop; + DL_HatchEdgeData hatchEdge; + std::vector > hatchEdges; + + std::string xRecordHandle; + bool xRecordValues; + + // Only the useful part of the group code + std::string groupCodeTmp; + // ...same as integer + unsigned int groupCode; + // Only the useful part of the group value + std::string groupValue; + // Current entity type + int currentObjectType; + // Value of the current setting + char settingValue[DL_DXF_MAXLINE+1]; + // Key of the current setting (e.g. "$ACADVER") + std::string settingKey; + // Stores the group codes + std::map values; + // First call of this method. We initialize all group values in + // the first call. + bool firstCall; + // Attributes of the current entity (layer, color, width, line type) + DL_Attributes attrib; + // library version. hex: 0x20003001 = 2.0.3.1 + int libVersion; + // app specific dictionary handle: + unsigned long appDictionaryHandle; + // handle of standard text style, referenced by dimstyle: + unsigned long styleHandleStd; +}; + +#endif + +// EOF diff --git a/datafile/dxf/dxflib/dl_entities.h b/datafile/dxf/dxflib/dl_entities.h new file mode 100644 index 0000000..7a4c7ad --- /dev/null +++ b/datafile/dxf/dxflib/dl_entities.h @@ -0,0 +1,1813 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_ENTITIES_H +#define DL_ENTITIES_H + +#include "dl_global.h" + +#include +#include + +/** + * Layer Data. + */ +struct DXFLIB_EXPORT DL_LayerData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_LayerData(const std::string& name, + int flags, bool off = false) : + name(name), flags(flags), off(off) { + } + + /** Layer name. */ + std::string name; + /** Layer flags. (1 = frozen, 2 = frozen by default, 4 = locked) */ + int flags; + /** Layer is off */ + bool off; +}; + + + +/** + * Block Data. + */ +struct DXFLIB_EXPORT DL_BlockData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_BlockData(const std::string& bName, + int bFlags, + double bbpx, double bbpy, double bbpz) { + name = bName; + flags = bFlags; + bpx = bbpx; + bpy = bbpy; + bpz = bbpz; + } + + /** Block name. */ + std::string name; + /** Block flags. (not used currently) */ + int flags; + /** X Coordinate of base point. */ + double bpx; + /** Y Coordinate of base point. */ + double bpy; + /** Z Coordinate of base point. */ + double bpz; +}; + + +/** + * Line Type Data. + */ +struct DXFLIB_EXPORT DL_LinetypeData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_LinetypeData( + const std::string& name, + const std::string& description, + int flags, + int numberOfDashes, + double patternLength, + double* pattern = NULL + ) + : name(name), + description(description), + flags(flags), + numberOfDashes(numberOfDashes), + patternLength(patternLength), + pattern(pattern) + {} + + /** Linetype name */ + std::string name; + /** Linetype description */ + std::string description; + /** Linetype flags */ + int flags; + /** Number of dashes */ + int numberOfDashes; + /** Pattern length */ + double patternLength; + /** Pattern */ + double* pattern; +}; + + + +/** + * Text style data. + */ +struct DXFLIB_EXPORT DL_StyleData { + /** + * Constructor + * Parameters: see member variables. + */ + DL_StyleData( + const std::string& name, + int flags, + double fixedTextHeight, + double widthFactor, + double obliqueAngle, + int textGenerationFlags, + double lastHeightUsed, + const std::string& primaryFontFile, + const std::string& bigFontFile + ) + : name(name), + flags(flags), + fixedTextHeight(fixedTextHeight), + widthFactor(widthFactor), + obliqueAngle(obliqueAngle), + textGenerationFlags(textGenerationFlags), + lastHeightUsed(lastHeightUsed), + primaryFontFile(primaryFontFile), + bigFontFile(bigFontFile), + bold(false), + italic(false) { + } + + bool operator==(const DL_StyleData& other) { + // ignore lastHeightUsed: + return (name==other.name && + flags==other.flags && + fixedTextHeight==other.fixedTextHeight && + widthFactor==other.widthFactor && + obliqueAngle==other.obliqueAngle && + textGenerationFlags==other.textGenerationFlags && + primaryFontFile==other.primaryFontFile && + bigFontFile==other.bigFontFile); + } + + /** Style name */ + std::string name; + /** Style flags */ + int flags; + /** Fixed text height or 0 for not fixed. */ + double fixedTextHeight; + /** Width factor */ + double widthFactor; + /** Oblique angle */ + double obliqueAngle; + /** Text generation flags */ + int textGenerationFlags; + /** Last height used */ + double lastHeightUsed; + /** Primary font file name */ + std::string primaryFontFile; + /** Big font file name */ + std::string bigFontFile; + + bool bold; + bool italic; +}; + +/** + * Point Data. + */ +struct DXFLIB_EXPORT DL_PointData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_PointData(double px=0.0, double py=0.0, double pz=0.0) { + x = px; + y = py; + z = pz; + } + + /*! X Coordinate of the point. */ + double x; + /*! Y Coordinate of the point. */ + double y; + /*! Z Coordinate of the point. */ + double z; +}; + + + +/** + * Line Data. + */ +struct DXFLIB_EXPORT DL_LineData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_LineData(double lx1, double ly1, double lz1, + double lx2, double ly2, double lz2) { + x1 = lx1; + y1 = ly1; + z1 = lz1; + + x2 = lx2; + y2 = ly2; + z2 = lz2; + } + + /*! X Start coordinate of the point. */ + double x1; + /*! Y Start coordinate of the point. */ + double y1; + /*! Z Start coordinate of the point. */ + double z1; + + /*! X End coordinate of the point. */ + double x2; + /*! Y End coordinate of the point. */ + double y2; + /*! Z End coordinate of the point. */ + double z2; +}; + +/** + * XLine Data. + */ +struct DXFLIB_EXPORT DL_XLineData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_XLineData(double bx, double by, double bz, + double dx, double dy, double dz) : + bx(bx), by(by), bz(bz), + dx(dx), dy(dy), dz(dz) { + } + + /*! X base point. */ + double bx; + /*! Y base point. */ + double by; + /*! Z base point. */ + double bz; + + /*! X direction vector. */ + double dx; + /*! Y direction vector. */ + double dy; + /*! Z direction vector. */ + double dz; +}; + +/** + * Ray Data. + */ +struct DXFLIB_EXPORT DL_RayData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_RayData(double bx, double by, double bz, + double dx, double dy, double dz) : + bx(bx), by(by), bz(bz), + dx(dx), dy(dy), dz(dz) { + } + + /*! X base point. */ + double bx; + /*! Y base point. */ + double by; + /*! Z base point. */ + double bz; + + /*! X direction vector. */ + double dx; + /*! Y direction vector. */ + double dy; + /*! Z direction vector. */ + double dz; +}; + + + +/** + * Arc Data. + */ +struct DXFLIB_EXPORT DL_ArcData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_ArcData(double acx, double acy, double acz, + double aRadius, + double aAngle1, double aAngle2) { + + cx = acx; + cy = acy; + cz = acz; + radius = aRadius; + angle1 = aAngle1; + angle2 = aAngle2; + } + + /*! X Coordinate of center point. */ + double cx; + /*! Y Coordinate of center point. */ + double cy; + /*! Z Coordinate of center point. */ + double cz; + + /*! Radius of arc. */ + double radius; + /*! Startangle of arc in degrees. */ + double angle1; + /*! Endangle of arc in degrees. */ + double angle2; +}; + + + +/** + * Circle Data. + */ +struct DXFLIB_EXPORT DL_CircleData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_CircleData(double acx, double acy, double acz, + double aRadius) { + + cx = acx; + cy = acy; + cz = acz; + radius = aRadius; + } + + /*! X Coordinate of center point. */ + double cx; + /*! Y Coordinate of center point. */ + double cy; + /*! Z Coordinate of center point. */ + double cz; + + /*! Radius of arc. */ + double radius; +}; + + + +/** + * Polyline Data. + */ +struct DXFLIB_EXPORT DL_PolylineData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_PolylineData(int pNumber, int pMVerteces, int pNVerteces, int pFlags, double pElevation = 0.0) { + number = pNumber; + m = pMVerteces; + n = pNVerteces; + elevation = pElevation; + flags = pFlags; + } + + /*! Number of vertices in this polyline. */ + unsigned int number; + + /*! Number of vertices in m direction if polyline is a polygon mesh. */ + unsigned int m; + + /*! Number of vertices in n direction if polyline is a polygon mesh. */ + unsigned int n; + + /*! elevation of the polyline. */ + double elevation; + + /*! Flags */ + int flags; +}; + + + +/** + * Vertex Data. + */ +struct DXFLIB_EXPORT DL_VertexData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_VertexData(double px=0.0, double py=0.0, double pz=0.0, + double pBulge=0.0) { + x = px; + y = py; + z = pz; + bulge = pBulge; + } + + /*! X Coordinate of the vertex. */ + double x; + /*! Y Coordinate of the vertex. */ + double y; + /*! Z Coordinate of the vertex. */ + double z; + /*! Bulge of vertex. + * (The tangent of 1/4 of the arc angle or 0 for lines) */ + double bulge; +}; + + +/** + * Trace Data / solid data / 3d face data. + */ +struct DXFLIB_EXPORT DL_TraceData { + DL_TraceData() { + thickness = 0.0; + for (int i=0; i<4; i++) { + x[i] = 0.0; + y[i] = 0.0; + z[i] = 0.0; + } + } + + /** + * Constructor. + * Parameters: see member variables. + */ + DL_TraceData(double sx1, double sy1, double sz1, + double sx2, double sy2, double sz2, + double sx3, double sy3, double sz3, + double sx4, double sy4, double sz4, + double sthickness=0.0) { + + thickness = sthickness; + + x[0] = sx1; + y[0] = sy1; + z[0] = sz1; + + x[1] = sx2; + y[1] = sy2; + z[1] = sz2; + + x[2] = sx3; + y[2] = sy3; + z[2] = sz3; + + x[3] = sx4; + y[3] = sy4; + z[3] = sz4; + } + + /*! Thickness */ + double thickness; + + /*! Points */ + double x[4]; + double y[4]; + double z[4]; +}; + + + + + +/** + * Solid Data. + */ +typedef DL_TraceData DL_SolidData; + + +/** + * 3dface Data. + */ +typedef DL_TraceData DL_3dFaceData; + + +/** + * Spline Data. + */ +struct DXFLIB_EXPORT DL_SplineData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_SplineData(int degree, + int nKnots, + int nControl, + int nFit, + int flags) : + degree(degree), + nKnots(nKnots), + nControl(nControl), + nFit(nFit), + flags(flags) { + } + + /*! Degree of the spline curve. */ + unsigned int degree; + + /*! Number of knots. */ + unsigned int nKnots; + + /*! Number of control points. */ + unsigned int nControl; + + /*! Number of fit points. */ + unsigned int nFit; + + /*! Flags */ + int flags; + + double tangentStartX; + double tangentStartY; + double tangentStartZ; + double tangentEndX; + double tangentEndY; + double tangentEndZ; +}; + + + +/** + * Spline knot data. + */ +struct DXFLIB_EXPORT DL_KnotData { + DL_KnotData() {} + /** + * Constructor. + * Parameters: see member variables. + */ + DL_KnotData(double pk) { + k = pk; + } + + /*! Knot value. */ + double k; +}; + + + +/** + * Spline control point data. + */ +struct DXFLIB_EXPORT DL_ControlPointData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_ControlPointData(double px, double py, double pz, double weight) { + x = px; + y = py; + z = pz; + w = weight; + } + + /*! X coordinate of the control point. */ + double x; + /*! Y coordinate of the control point. */ + double y; + /*! Z coordinate of the control point. */ + double z; + /*! Weight of control point. */ + double w; +}; + + + +/** + * Spline fit point data. + */ +struct DXFLIB_EXPORT DL_FitPointData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_FitPointData(double x, double y, double z) : x(x), y(y), z(z) {} + + /*! X coordinate of the fit point. */ + double x; + /*! Y coordinate of the fit point. */ + double y; + /*! Z coordinate of the fit point. */ + double z; +}; + + + +/** + * Ellipse Data. + */ +struct DXFLIB_EXPORT DL_EllipseData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_EllipseData(double cx, double cy, double cz, + double mx, double my, double mz, + double ratio, + double angle1, double angle2) + : cx(cx), + cy(cy), + cz(cz), + mx(mx), + my(my), + mz(mz), + ratio(ratio), + angle1(angle1), + angle2(angle2) { + } + + /*! X Coordinate of center point. */ + double cx; + /*! Y Coordinate of center point. */ + double cy; + /*! Z Coordinate of center point. */ + double cz; + + /*! X coordinate of the endpoint of the major axis. */ + double mx; + /*! Y coordinate of the endpoint of the major axis. */ + double my; + /*! Z coordinate of the endpoint of the major axis. */ + double mz; + + /*! Ratio of minor axis to major axis.. */ + double ratio; + /*! Startangle of ellipse in rad. */ + double angle1; + /*! Endangle of ellipse in rad. */ + double angle2; +}; + + + +/** + * Insert Data. + */ +struct DXFLIB_EXPORT DL_InsertData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_InsertData(const std::string& name, + double ipx, double ipy, double ipz, + double sx, double sy, double sz, + double angle, + int cols, int rows, + double colSp, double rowSp) : + name(name), + ipx(ipx), ipy(ipy), ipz(ipz), + sx(sx), sy(sy), sz(sz), + angle(angle), + cols(cols), rows(rows), + colSp(colSp), rowSp(rowSp) { + } + + /*! Name of the referred block. */ + std::string name; + /*! X Coordinate of insertion point. */ + double ipx; + /*! Y Coordinate of insertion point. */ + double ipy; + /*! Z Coordinate of insertion point. */ + double ipz; + /*! X Scale factor. */ + double sx; + /*! Y Scale factor. */ + double sy; + /*! Z Scale factor. */ + double sz; + /*! Rotation angle in degrees. */ + double angle; + /*! Number of colums if we insert an array of the block or 1. */ + int cols; + /*! Number of rows if we insert an array of the block or 1. */ + int rows; + /*! Values for the spacing between cols. */ + double colSp; + /*! Values for the spacing between rows. */ + double rowSp; +}; + + + +/** + * MText Data. + */ +struct DXFLIB_EXPORT DL_MTextData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_MTextData(double ipx, double ipy, double ipz, + double dirx, double diry, double dirz, + double height, double width, + int attachmentPoint, + int drawingDirection, + int lineSpacingStyle, + double lineSpacingFactor, + const std::string& text, + const std::string& style, + double angle) : + ipx(ipx), ipy(ipy), ipz(ipz), + dirx(dirx), diry(diry), dirz(dirz), + height(height), width(width), + attachmentPoint(attachmentPoint), + drawingDirection(drawingDirection), + lineSpacingStyle(lineSpacingStyle), + lineSpacingFactor(lineSpacingFactor), + text(text), + style(style), + angle(angle) { + + } + + /*! X Coordinate of insertion point. */ + double ipx; + /*! Y Coordinate of insertion point. */ + double ipy; + /*! Z Coordinate of insertion point. */ + double ipz; + /*! X Coordinate of X direction vector. */ + double dirx; + /*! Y Coordinate of X direction vector. */ + double diry; + /*! Z Coordinate of X direction vector. */ + double dirz; + /*! Text height */ + double height; + /*! Width of the text box. */ + double width; + /** + * Attachment point. + * + * 1 = Top left, 2 = Top center, 3 = Top right, + * 4 = Middle left, 5 = Middle center, 6 = Middle right, + * 7 = Bottom left, 8 = Bottom center, 9 = Bottom right + */ + int attachmentPoint; + /** + * Drawing direction. + * + * 1 = left to right, 3 = top to bottom, 5 = by style + */ + int drawingDirection; + /** + * Line spacing style. + * + * 1 = at least, 2 = exact + */ + int lineSpacingStyle; + /** + * Line spacing factor. 0.25 .. 4.0 + */ + double lineSpacingFactor; + /*! Text string. */ + std::string text; + /*! Style string. */ + std::string style; + /*! Rotation angle. */ + double angle; +}; + + + +/** + * Text Data. + */ +struct DXFLIB_EXPORT DL_TextData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_TextData(double ipx, double ipy, double ipz, + double apx, double apy, double apz, + double height, double xScaleFactor, + int textGenerationFlags, + int hJustification, + int vJustification, + const std::string& text, + const std::string& style, + double angle) + : ipx(ipx), ipy(ipy), ipz(ipz), + apx(apx), apy(apy), apz(apz), + height(height), xScaleFactor(xScaleFactor), + textGenerationFlags(textGenerationFlags), + hJustification(hJustification), + vJustification(vJustification), + text(text), + style(style), + angle(angle) { + } + + /*! X Coordinate of insertion point. */ + double ipx; + /*! Y Coordinate of insertion point. */ + double ipy; + /*! Z Coordinate of insertion point. */ + double ipz; + + /*! X Coordinate of alignment point. */ + double apx; + /*! Y Coordinate of alignment point. */ + double apy; + /*! Z Coordinate of alignment point. */ + double apz; + + /*! Text height */ + double height; + /*! Relative X scale factor. */ + double xScaleFactor; + /*! 0 = default, 2 = Backwards, 4 = Upside down */ + int textGenerationFlags; + /** + * Horizontal justification. + * + * 0 = Left (default), 1 = Center, 2 = Right, + * 3 = Aligned, 4 = Middle, 5 = Fit + * For 3, 4, 5 the vertical alignment has to be 0. + */ + int hJustification; + /** + * Vertical justification. + * + * 0 = Baseline (default), 1 = Bottom, 2 = Middle, 3= Top + */ + int vJustification; + /*! Text string. */ + std::string text; + /*! Style (font). */ + std::string style; + /*! Rotation angle of dimension text away from default orientation. */ + double angle; +}; + +/** + * Arc Aligned Text Data. + */ +struct DXFLIB_EXPORT DL_ArcAlignedTextData { + + /*! Text string */ + std::string text; + /*! Font name */ + std::string font; + /*! Style */ + std::string style; + + /*! X coordinate of arc center point. */ + double cx; + /*! Y coordinate of arc center point. */ + double cy; + /*! Z coordinate of arc center point. */ + double cz; + /*! Arc radius. */ + double radius; + + /*! Relative X scale factor. */ + double xScaleFactor; + /*! Text height */ + double height; + /*! Character spacing */ + double spacing; + /*! Offset from arc */ + double offset; + /*! Right offset */ + double rightOffset; + /*! Left offset */ + double leftOffset; + /*! Start angle (radians) */ + double startAngle; + /*! End angle (radians) */ + double endAngle; + /*! Reversed character order: + * false: normal + * true: reversed + */ + bool reversedCharacterOrder; + /*! Direction + * 1: outward from center + * 2: inward from center + */ + int direction; + /*! Alignment: + * 1: fit + * 2: left + * 3: right + * 4: center + */ + int alignment; + /*! Side + * 1: convex + * 2: concave + */ + int side; + /*! Bold flag */ + bool bold; + /*! Italic flag */ + bool italic; + /*! Underline flag */ + bool underline; + /*! Character set value. Windows character set identifier. */ + int characerSet; + /*! Pitch and family value. Windows pitch and character family identifier. */ + int pitch; + /*! Font type: + * false: TTF + * true: SHX + */ + bool shxFont; + /*! Wizard flag */ + bool wizard; + /*! Arc handle/ID */ + int arcHandle; +}; + +/** + * Block attribute data. + */ +struct DXFLIB_EXPORT DL_AttributeData : public DL_TextData { + DL_AttributeData(const DL_TextData& tData, const std::string& tag) + : DL_TextData(tData), tag(tag) { + + } + + /** + * Constructor. + * Parameters: see member variables. + */ + DL_AttributeData(double ipx, double ipy, double ipz, + double apx, double apy, double apz, + double height, double xScaleFactor, + int textGenerationFlags, + int hJustification, + int vJustification, + const std::string& tag, + const std::string& text, + const std::string& style, + double angle) + : DL_TextData(ipx, ipy, ipz, + apx, apy, apz, + height, xScaleFactor, + textGenerationFlags, + hJustification, + vJustification, + text, + style, + angle), + tag(tag) { + } + + /*! Tag. */ + std::string tag; +}; + + +/** + * Generic Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimensionData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimensionData(double dpx, double dpy, double dpz, + double mpx, double mpy, double mpz, + int type, + int attachmentPoint, + int lineSpacingStyle, + double lineSpacingFactor, + const std::string& text, + const std::string& style, + double angle, + double linearFactor = 1.0, + double dimScale = 1.0) : + dpx(dpx), dpy(dpy), dpz(dpz), + mpx(mpx), mpy(mpy), mpz(mpz), + type(type), + attachmentPoint(attachmentPoint), + lineSpacingStyle(lineSpacingStyle), + lineSpacingFactor(lineSpacingFactor), + text(text), + style(style), + angle(angle), + linearFactor(linearFactor), + dimScale(dimScale) { + + } + + /*! X Coordinate of definition point. */ + double dpx; + /*! Y Coordinate of definition point. */ + double dpy; + /*! Z Coordinate of definition point. */ + double dpz; + /*! X Coordinate of middle point of the text. */ + double mpx; + /*! Y Coordinate of middle point of the text. */ + double mpy; + /*! Z Coordinate of middle point of the text. */ + double mpz; + /** + * Dimension type. + * + * 0 Rotated, horizontal, or vertical + * 1 Aligned + * 2 Angular + * 3 Diametric + * 4 Radius + * 5 Angular 3-point + * 6 Ordinate + * 64 Ordinate type. This is a bit value (bit 7) + * used only with integer value 6. If set, + * ordinate is X-type; if not set, ordinate is + * Y-type + * 128 This is a bit value (bit 8) added to the + * other group 70 values if the dimension text + * has been positioned at a user-defined + * location rather than at the default location + */ + int type; + /** + * Attachment point. + * + * 1 = Top left, 2 = Top center, 3 = Top right, + * 4 = Middle left, 5 = Middle center, 6 = Middle right, + * 7 = Bottom left, 8 = Bottom center, 9 = Bottom right, + */ + int attachmentPoint; + /** + * Line spacing style. + * + * 1 = at least, 2 = exact + */ + int lineSpacingStyle; + /** + * Line spacing factor. 0.25 .. 4.0 + */ + double lineSpacingFactor; + /** + * Text string. + * + * Text string entered explicitly by user or null + * or "<>" for the actual measurement or " " (one blank space). + * for supressing the text. + */ + std::string text; + /*! Dimension style (font name). */ + std::string style; + /** + * Rotation angle of dimension text away from + * default orientation. + */ + double angle; + /** + * Linear factor style override. + */ + double linearFactor; + /** + * Dimension scale (dimscale) style override. + */ + double dimScale; +}; + + + +/** + * Aligned Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimAlignedData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimAlignedData(double depx1, double depy1, double depz1, + double depx2, double depy2, double depz2) { + + epx1 = depx1; + epy1 = depy1; + epz1 = depz1; + + epx2 = depx2; + epy2 = depy2; + epz2 = depz2; + } + + /*! X Coordinate of Extension point 1. */ + double epx1; + /*! Y Coordinate of Extension point 1. */ + double epy1; + /*! Z Coordinate of Extension point 1. */ + double epz1; + + /*! X Coordinate of Extension point 2. */ + double epx2; + /*! Y Coordinate of Extension point 2. */ + double epy2; + /*! Z Coordinate of Extension point 2. */ + double epz2; +}; + + + +/** + * Linear (rotated) Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimLinearData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimLinearData(double ddpx1, double ddpy1, double ddpz1, + double ddpx2, double ddpy2, double ddpz2, + double dAngle, double dOblique) { + + dpx1 = ddpx1; + dpy1 = ddpy1; + dpz1 = ddpz1; + + dpx2 = ddpx2; + dpy2 = ddpy2; + dpz2 = ddpz2; + + angle = dAngle; + oblique = dOblique; + } + + /*! X Coordinate of Extension point 1. */ + double dpx1; + /*! Y Coordinate of Extension point 1. */ + double dpy1; + /*! Z Coordinate of Extension point 1. */ + double dpz1; + + /*! X Coordinate of Extension point 2. */ + double dpx2; + /*! Y Coordinate of Extension point 2. */ + double dpy2; + /*! Z Coordinate of Extension point 2. */ + double dpz2; + + /*! Rotation angle (angle of dimension line) in degrees. */ + double angle; + /*! Oblique angle in degrees. */ + double oblique; +}; + + + +/** + * Radial Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimRadialData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimRadialData(double ddpx, double ddpy, double ddpz, double dleader) { + dpx = ddpx; + dpy = ddpy; + dpz = ddpz; + + leader = dleader; + } + + /*! X Coordinate of definition point. */ + double dpx; + /*! Y Coordinate of definition point. */ + double dpy; + /*! Z Coordinate of definition point. */ + double dpz; + + /*! Leader length */ + double leader; +}; + + + +/** + * Diametric Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimDiametricData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimDiametricData(double ddpx, double ddpy, double ddpz, double dleader) { + dpx = ddpx; + dpy = ddpy; + dpz = ddpz; + + leader = dleader; + } + + /*! X Coordinate of definition point (DXF 15). */ + double dpx; + /*! Y Coordinate of definition point (DXF 25). */ + double dpy; + /*! Z Coordinate of definition point (DXF 35). */ + double dpz; + + /*! Leader length */ + double leader; +}; + + + +/** + * Angular Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimAngularData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimAngularData(double ddpx1, double ddpy1, double ddpz1, + double ddpx2, double ddpy2, double ddpz2, + double ddpx3, double ddpy3, double ddpz3, + double ddpx4, double ddpy4, double ddpz4) { + + dpx1 = ddpx1; + dpy1 = ddpy1; + dpz1 = ddpz1; + + dpx2 = ddpx2; + dpy2 = ddpy2; + dpz2 = ddpz2; + + dpx3 = ddpx3; + dpy3 = ddpy3; + dpz3 = ddpz3; + + dpx4 = ddpx4; + dpy4 = ddpy4; + dpz4 = ddpz4; + } + + /*! X Coordinate of definition point 1. */ + double dpx1; + /*! Y Coordinate of definition point 1. */ + double dpy1; + /*! Z Coordinate of definition point 1. */ + double dpz1; + + /*! X Coordinate of definition point 2. */ + double dpx2; + /*! Y Coordinate of definition point 2. */ + double dpy2; + /*! Z Coordinate of definition point 2. */ + double dpz2; + + /*! X Coordinate of definition point 3. */ + double dpx3; + /*! Y Coordinate of definition point 3. */ + double dpy3; + /*! Z Coordinate of definition point 3. */ + double dpz3; + + /*! X Coordinate of definition point 4. */ + double dpx4; + /*! Y Coordinate of definition point 4. */ + double dpy4; + /*! Z Coordinate of definition point 4. */ + double dpz4; +}; + + +/** + * Angular Dimension Data (3 points version). + */ +struct DXFLIB_EXPORT DL_DimAngular3PData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimAngular3PData(double ddpx1, double ddpy1, double ddpz1, + double ddpx2, double ddpy2, double ddpz2, + double ddpx3, double ddpy3, double ddpz3) { + + dpx1 = ddpx1; + dpy1 = ddpy1; + dpz1 = ddpz1; + + dpx2 = ddpx2; + dpy2 = ddpy2; + dpz2 = ddpz2; + + dpx3 = ddpx3; + dpy3 = ddpy3; + dpz3 = ddpz3; + } + + /*! X Coordinate of definition point 1. */ + double dpx1; + /*! Y Coordinate of definition point 1. */ + double dpy1; + /*! Z Coordinate of definition point 1. */ + double dpz1; + + /*! X Coordinate of definition point 2. */ + double dpx2; + /*! Y Coordinate of definition point 2. */ + double dpy2; + /*! Z Coordinate of definition point 2. */ + double dpz2; + + /*! X Coordinate of definition point 3. */ + double dpx3; + /*! Y Coordinate of definition point 3. */ + double dpy3; + /*! Z Coordinate of definition point 3. */ + double dpz3; +}; + + + +/** + * Ordinate Dimension Data. + */ +struct DXFLIB_EXPORT DL_DimOrdinateData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_DimOrdinateData(double ddpx1, double ddpy1, double ddpz1, + double ddpx2, double ddpy2, double ddpz2, + bool dxtype) { + + dpx1 = ddpx1; + dpy1 = ddpy1; + dpz1 = ddpz1; + + dpx2 = ddpx2; + dpy2 = ddpy2; + dpz2 = ddpz2; + + xtype = dxtype; + } + + /*! X Coordinate of definition point 1. */ + double dpx1; + /*! Y Coordinate of definition point 1. */ + double dpy1; + /*! Z Coordinate of definition point 1. */ + double dpz1; + + /*! X Coordinate of definition point 2. */ + double dpx2; + /*! Y Coordinate of definition point 2. */ + double dpy2; + /*! Z Coordinate of definition point 2. */ + double dpz2; + + /*! True if the dimension indicates the X-value, false for Y-value */ + bool xtype; +}; + + + +/** + * Leader (arrow). + */ +struct DXFLIB_EXPORT DL_LeaderData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_LeaderData(int lArrowHeadFlag, + int lLeaderPathType, + int lLeaderCreationFlag, + int lHooklineDirectionFlag, + int lHooklineFlag, + double lTextAnnotationHeight, + double lTextAnnotationWidth, + int lNumber) { + + arrowHeadFlag = lArrowHeadFlag; + leaderPathType = lLeaderPathType; + leaderCreationFlag = lLeaderCreationFlag; + hooklineDirectionFlag = lHooklineDirectionFlag; + hooklineFlag = lHooklineFlag; + textAnnotationHeight = lTextAnnotationHeight; + textAnnotationWidth = lTextAnnotationWidth; + number = lNumber; + } + + /*! Arrow head flag (71). */ + int arrowHeadFlag; + /*! Leader path type (72). */ + int leaderPathType; + /*! Leader creation flag (73). */ + int leaderCreationFlag; + /*! Hookline direction flag (74). */ + int hooklineDirectionFlag; + /*! Hookline flag (75) */ + int hooklineFlag; + /*! Text annotation height (40). */ + double textAnnotationHeight; + /*! Text annotation width (41) */ + double textAnnotationWidth; + /*! Number of vertices in leader (76). */ + int number; +}; + + + +/** + * Leader Vertex Data. + */ +struct DXFLIB_EXPORT DL_LeaderVertexData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_LeaderVertexData(double px=0.0, double py=0.0, double pz=0.0) { + x = px; + y = py; + z = pz; + } + + /*! X Coordinate of the vertex. */ + double x; + /*! Y Coordinate of the vertex. */ + double y; + /*! Z Coordinate of the vertex. */ + double z; +}; + + + +/** + * Hatch data. + */ +struct DXFLIB_EXPORT DL_HatchData { + /** + * Default constructor. + */ + DL_HatchData() {} + + /** + * Constructor. + * Parameters: see member variables. + */ + DL_HatchData(int numLoops, + bool solid, + double scale, + double angle, + const std::string& pattern, + double originX = 0.0, + double originY = 0.0) : + numLoops(numLoops), + solid(solid), + scale(scale), + angle(angle), + pattern(pattern), + originX(originX), + originY(originY) { + + } + + /*! Number of boundary paths (loops). */ + int numLoops; + /*! Solid fill flag (true=solid, false=pattern). */ + bool solid; + /*! Pattern scale or spacing */ + double scale; + /*! Pattern angle in degrees */ + double angle; + /*! Pattern name. */ + std::string pattern; + /*! Pattern origin */ + double originX; + double originY; +}; + + + +/** + * Hatch boundary path (loop) data. + */ +struct DXFLIB_EXPORT DL_HatchLoopData { + /** + * Default constructor. + */ + DL_HatchLoopData() {} + /** + * Constructor. + * Parameters: see member variables. + */ + DL_HatchLoopData(int hNumEdges) { + numEdges = hNumEdges; + } + + /*! Number of edges in this loop. */ + int numEdges; +}; + + + +/** + * Hatch edge data. + */ +struct DXFLIB_EXPORT DL_HatchEdgeData { + /** + * Default constructor. + */ + DL_HatchEdgeData() : defined(false), x1(0.0), y1(0.0), x2(0.0), y2(0.0) { + } + + /** + * Constructor for a line edge. + * Parameters: see member variables. + */ + DL_HatchEdgeData(double x1, double y1, + double x2, double y2) : + defined(true), + type(1), + x1(x1), + y1(y1), + x2(x2), + y2(y2) { + } + + /** + * Constructor for an arc edge. + * Parameters: see member variables. + */ + DL_HatchEdgeData(double cx, double cy, + double radius, + double angle1, double angle2, + bool ccw) : + defined(true), + type(2), + cx(cx), + cy(cy), + radius(radius), + angle1(angle1), + angle2(angle2), + ccw(ccw) { + } + + /** + * Constructor for an ellipse arc edge. + * Parameters: see member variables. + */ + DL_HatchEdgeData(double cx, double cy, + double mx, double my, + double ratio, + double angle1, double angle2, + bool ccw) : + defined(true), + type(3), + cx(cx), + cy(cy), + angle1(angle1), + angle2(angle2), + ccw(ccw), + mx(mx), + my(my), + ratio(ratio) { + } + + /** + * Constructor for a spline edge. + * Parameters: see member variables. + */ + DL_HatchEdgeData(unsigned int degree, + bool rational, + bool periodic, + unsigned int nKnots, + unsigned int nControl, + unsigned int nFit, + const std::vector& knots, + const std::vector >& controlPoints, + const std::vector >& fitPoints, + const std::vector& weights, + double startTangentX, + double startTangentY, + double endTangentX, + double endTangentY) : + defined(true), + type(4), + degree(degree), + rational(rational), + periodic(periodic), + nKnots(nKnots), + nControl(nControl), + nFit(nFit), + controlPoints(controlPoints), + knots(knots), + weights(weights), + fitPoints(fitPoints), + startTangentX(startTangentX), + startTangentY(startTangentY), + endTangentX(endTangentX), + endTangentY(endTangentY) { + } + + /** + * Set to true if this edge is fully defined. + */ + bool defined; + + /** + * Edge type. 1=line, 2=arc, 3=elliptic arc, 4=spline. + */ + int type; + + // line edges: + + /*! Start point (X). */ + double x1; + /*! Start point (Y). */ + double y1; + /*! End point (X). */ + double x2; + /*! End point (Y). */ + double y2; + + /*! Center point of arc or ellipse arc (X). */ + double cx; + /*! Center point of arc or ellipse arc (Y). */ + double cy; + /*! Arc radius. */ + double radius; + /*! Start angle of arc or ellipse arc. */ + double angle1; + /*! End angle of arc or ellipse arc. */ + double angle2; + /*! Counterclockwise flag for arc or ellipse arc. */ + bool ccw; + + /*! Major axis end point (X). */ + double mx; + /*! Major axis end point (Y). */ + double my; + /*! Axis ratio */ + double ratio; + + + /*! Spline degree */ + unsigned int degree; + bool rational; + bool periodic; + /*! Number of knots. */ + unsigned int nKnots; + /*! Number of control points. */ + unsigned int nControl; + /*! Number of fit points. */ + unsigned int nFit; + + std::vector > controlPoints; + std::vector knots; + std::vector weights; + std::vector > fitPoints; + + double startTangentX; + double startTangentY; + + double endTangentX; + double endTangentY; + + /** Polyline boundary vertices (x y [bulge])*/ + std::vector > vertices; + //bool closed; +}; + + + +/** + * Image Data. + */ +struct DXFLIB_EXPORT DL_ImageData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_ImageData(const std::string& iref, + double iipx, double iipy, double iipz, + double iux, double iuy, double iuz, + double ivx, double ivy, double ivz, + int iwidth, int iheight, + int ibrightness, int icontrast, int ifade) { + ref = iref; + ipx = iipx; + ipy = iipy; + ipz = iipz; + ux = iux; + uy = iuy; + uz = iuz; + vx = ivx; + vy = ivy; + vz = ivz; + width = iwidth; + height = iheight; + brightness = ibrightness; + contrast = icontrast; + fade = ifade; + } + + /*! Reference to the image file + (unique, used to refer to the image def object). */ + std::string ref; + /*! X Coordinate of insertion point. */ + double ipx; + /*! Y Coordinate of insertion point. */ + double ipy; + /*! Z Coordinate of insertion point. */ + double ipz; + /*! X Coordinate of u vector along bottom of image. */ + double ux; + /*! Y Coordinate of u vector along bottom of image. */ + double uy; + /*! Z Coordinate of u vector along bottom of image. */ + double uz; + /*! X Coordinate of v vector along left side of image. */ + double vx; + /*! Y Coordinate of v vector along left side of image. */ + double vy; + /*! Z Coordinate of v vector along left side of image. */ + double vz; + /*! Width of image in pixel. */ + int width; + /*! Height of image in pixel. */ + int height; + /*! Brightness (0..100, default = 50). */ + int brightness; + /*! Contrast (0..100, default = 50). */ + int contrast; + /*! Fade (0..100, default = 0). */ + int fade; +}; + + + +/** + * Image Definition Data. + */ +struct DXFLIB_EXPORT DL_ImageDefData { + /** + * Constructor. + * Parameters: see member variables. + */ + DL_ImageDefData(const std::string& iref, + const std::string& ifile) { + ref = iref; + file = ifile; + } + + /*! Reference to the image file + (unique, used to refer to the image def object). */ + std::string ref; + + /*! Image file */ + std::string file; +}; + + + +/** + * Dictionary data. + */ +struct DXFLIB_EXPORT DL_DictionaryData { + DL_DictionaryData(const std::string& handle) : handle(handle) {} + std::string handle; +}; + + + +/** + * Dictionary entry data. + */ +struct DXFLIB_EXPORT DL_DictionaryEntryData { + DL_DictionaryEntryData(const std::string& name, const std::string& handle) : + name(name), handle(handle) {} + + std::string name; + std::string handle; +}; + +#endif + +// EOF diff --git a/datafile/dxf/dxflib/dl_exception.h b/datafile/dxf/dxflib/dl_exception.h new file mode 100644 index 0000000..7fd944b --- /dev/null +++ b/datafile/dxf/dxflib/dl_exception.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** Copyright (C) 2001 Robert J. Campbell Jr. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_EXCEPTION_H +#define DL_EXCEPTION_H + +#include "dl_global.h" + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +/** + * Used for exception handling. + */ +class DXFLIB_EXPORT DL_Exception {} +; + +/** + * Used for exception handling. + */ +class DXFLIB_EXPORT DL_NullStrExc : public DL_Exception {} +; + +/** + * Used for exception handling. + */ +class DXFLIB_EXPORT DL_GroupCodeExc : public DL_Exception { + DL_GroupCodeExc(int gc=0) : groupCode(gc) {} + int groupCode; +}; +#endif + diff --git a/datafile/dxf/dxflib/dl_extrusion.h b/datafile/dxf/dxflib/dl_extrusion.h new file mode 100644 index 0000000..d836c04 --- /dev/null +++ b/datafile/dxf/dxflib/dl_extrusion.h @@ -0,0 +1,143 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_EXTRUSION_H +#define DL_EXTRUSION_H + +#include "dl_global.h" + +#include + + +/** + * Extrusion direction. + * + * @author Andrew Mustun + */ +class DXFLIB_EXPORT DL_Extrusion { + +public: + + /** + * Default constructor. + */ + DL_Extrusion() { + direction = new double[3]; + setDirection(0.0, 0.0, 1.0); + setElevation(0.0); + } + + + /** + * Destructor. + */ + ~DL_Extrusion() { + delete[] direction ; + } + + + /** + * Constructor for DXF extrusion. + * + * @param direction Vector of axis along which the entity shall be extruded + * this is also the Z axis of the Entity coordinate system + * @param elevation Distance of the entities XY plane from the origin of the + * world coordinate system + */ + DL_Extrusion(double dx, double dy, double dz, double elevation) { + direction = new double[3]; + setDirection(dx, dy, dz); + setElevation(elevation); + } + + + + /** + * Sets the direction vector. + */ + void setDirection(double dx, double dy, double dz) { + direction[0]=dx; + direction[1]=dy; + direction[2]=dz; + } + + + + /** + * @return direction vector. + */ + double* getDirection() const { + return direction; + } + + + + /** + * @return direction vector. + */ + void getDirection(double dir[]) const { + dir[0]=direction[0]; + dir[1]=direction[1]; + dir[2]=direction[2]; + } + + + + /** + * Sets the elevation. + */ + void setElevation(double elevation) { + this->elevation = elevation; + } + + + + /** + * @return Elevation. + */ + double getElevation() const { + return elevation; + } + + + + /** + * Copies extrusion (deep copies) from another extrusion object. + */ + DL_Extrusion operator = (const DL_Extrusion& extru) { + setDirection(extru.direction[0], extru.direction[1], extru.direction[2]); + setElevation(extru.elevation); + + return *this; + } + + + +private: + double *direction; + double elevation; +}; + +#endif + diff --git a/datafile/dxf/dxflib/dl_global.h b/datafile/dxf/dxflib/dl_global.h new file mode 100644 index 0000000..0d52bea --- /dev/null +++ b/datafile/dxf/dxflib/dl_global.h @@ -0,0 +1,13 @@ +#if defined(DXFLIB_DLL) +# ifdef _WIN32 +# if defined(DXFLIB_LIBRARY) +# define DXFLIB_EXPORT __declspec(dllexport) +# else +# define DXFLIB_EXPORT __declspec(dllimport) +# endif +# else +# define DXFLIB_EXPORT +# endif +#else +# define DXFLIB_EXPORT +#endif diff --git a/datafile/dxf/dxflib/dl_writer.h b/datafile/dxf/dxflib/dl_writer.h new file mode 100644 index 0000000..2aa09d5 --- /dev/null +++ b/datafile/dxf/dxflib/dl_writer.h @@ -0,0 +1,654 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** Copyright (C) 2001 Robert J. Campbell Jr. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DL_WRITER_H +#define DL_WRITER_H + +#include "dl_global.h" + +#ifndef _WIN32 +#include +#endif + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + +#include "dl_attributes.h" +#include "dl_codes.h" + + + +/** + * Defines interface for writing low level DXF constructs to + * a file. Implementation is defined in derived classes that write + * to binary or ASCII files. + * + * Implements functions that write higher level constructs in terms of + * the low level ones. + * + * @todo Add error checking for string/entry length. + */ +class DXFLIB_EXPORT DL_Writer { +public: + /** + * @param version DXF version. Defaults to DL_VERSION_2002. + */ + DL_Writer(DL_Codes::version version) : m_handle(0x30) { + this->version = version; + modelSpaceHandle = 0; + paperSpaceHandle = 0; + paperSpace0Handle = 0; + } + + virtual ~DL_Writer() {} + ; + + /** Generic section for section 'name'. + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  name
+     * 
+ */ + void section(const char* name) const { + dxfString(0, "SECTION"); + dxfString(2, name); + } + + /** + * Section HEADER + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  HEADER
+     * 
+ */ + void sectionHeader() const { + section("HEADER"); + } + + /** + * Section TABLES + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  TABLES
+     * 
+ */ + void sectionTables() const { + section("TABLES"); + } + + /** + * Section BLOCKS + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  BLOCKS
+     * 
+ */ + void sectionBlocks() const { + section("BLOCKS"); + } + + /** + * Section ENTITIES + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  ENTITIES
+     * 
+ */ + void sectionEntities() const { + section("ENTITIES"); + } + + /** + * Section CLASSES + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  CLASSES
+     * 
+ */ + void sectionClasses() const { + section("CLASSES"); + } + + /** + * Section OBJECTS + * + *
+     *   0
+     *  SECTION
+     *   2
+     *  OBJECTS
+     * 
+ */ + void sectionObjects() const { + section("OBJECTS"); + } + + /** + * End of a section. + * + *
+     *   0
+     *  ENDSEC
+     * 
+ */ + void sectionEnd() const { + dxfString(0, "ENDSEC"); + } + + /** + * Generic table for table 'name' with 'num' entries: + * + *
+     *   0
+     *  TABLE
+     *   2
+     *  name
+     *  70
+     *   num
+     * 
+ */ + void table(const char* name, int num, int h=0) const { + dxfString(0, "TABLE"); + dxfString(2, name); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } + else { + dxfHex(5, h); + } + dxfString(100, "AcDbSymbolTable"); + } + dxfInt(70, num); + } + + /** Table for layers. + * + * @param num Number of layers in total. + * + *
+     *   0
+     *  TABLE
+     *   2
+     *  LAYER
+     *   70
+     *      num
+     * 
+ */ + void tableLayers(int num) const { + table("LAYER", num, 2); + } + + /** Table for line types. + * + * @param num Number of line types in total. + * + *
+     *   0
+     *  TABLE
+     *   2
+     *  LTYPE
+     *   70
+     *      num
+     * 
+ */ + void tableLinetypes(int num) const { + //linetypeHandle = 5; + table("LTYPE", num, 5); + } + + /** Table for application id. + * + * @param num Number of registered applications in total. + * + *
+     *   0
+     *  TABLE
+     *   2
+     *  APPID
+     *   70
+     *      num
+     * 
+ */ + void tableAppid(int num) const { + table("APPID", num, 9); + } + + /** Table for text style. + * + * @param num Number of text styles. + * + *
+     *   0
+     *  TABLE
+     *   2
+     *  STYLE
+     *   70
+     *      num
+     * 
+ */ + void tableStyle(int num) const { + table("STYLE", num, 3); + } + + /** + * End of a table. + * + *
+     *   0
+     *  ENDTAB
+     * 
+ */ + void tableEnd() const { + dxfString(0, "ENDTAB"); + } + + /** + * End of the DXF file. + * + *
+     *   0
+     *  EOF
+     * 
+ */ + void dxfEOF() const { + dxfString(0, "EOF"); + } + + /** + * Comment. + * + *
+     *  999
+     *  text
+     * 
+ */ + void comment(const char* text) const { + dxfString(999, text); + } + + /** + * Entity. + * + *
+     *   0
+     *  entTypeName
+     * 
+ * + * @return Unique handle or 0. + */ + void entity(const char* entTypeName) const { + dxfString(0, entTypeName); + if (version>=DL_VERSION_2000) { + handle(); + } + } + + /** + * Attributes of an entity. + * + *
+     *   8
+     *  layer
+     *  62
+     *  color
+     *  39
+     *  width
+     *   6
+     *  linetype
+     * 
+ */ + void entityAttributes(const DL_Attributes& attrib) const { + + // layer name: + dxfString(8, attrib.getLayer()); + + // R12 doesn't accept BYLAYER values. The value has to be missing + // in that case. + if (version>=DL_VERSION_2000 || attrib.getColor()!=256) { + dxfInt(62, attrib.getColor()); + } + if (version>=DL_VERSION_2000 && attrib.getColor24()!=-1) { + dxfInt(420, attrib.getColor24()); + } + if (version>=DL_VERSION_2000) { + dxfInt(370, attrib.getWidth()); + } + if (version>=DL_VERSION_2000) { + dxfReal(48, attrib.getLinetypeScale()); + } + std::string linetype = attrib.getLinetype(); + std::transform(linetype.begin(), linetype.end(), linetype.begin(), ::toupper); + if (version>=DL_VERSION_2000 || linetype=="BYLAYER") { + dxfString(6, attrib.getLinetype()); + } + } + + /** + * Subclass. + */ + void subClass(const char* sub) const { + dxfString(100, sub); + } + + /** + * Layer (must be in the TABLES section LAYER). + * + *
+     *   0
+     *  LAYER
+     * 
+ */ + void tableLayerEntry(unsigned long int h=0) const { + dxfString(0, "LAYER"); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } else { + dxfHex(5, h); + } + dxfString(100, "AcDbSymbolTableRecord"); + dxfString(100, "AcDbLayerTableRecord"); + } + } + + /** + * Line type (must be in the TABLES section LTYPE). + * + *
+     *   0
+     *  LTYPE
+     * 
+ */ + void tableLinetypeEntry(unsigned long int h=0) const { + dxfString(0, "LTYPE"); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } else { + dxfHex(5, h); + } + //dxfHex(330, 0x5); + dxfString(100, "AcDbSymbolTableRecord"); + dxfString(100, "AcDbLinetypeTableRecord"); + } + } + + /** + * Appid (must be in the TABLES section APPID). + * + *
+     *   0
+     *  APPID
+     * 
+ */ + void tableAppidEntry(unsigned long int h=0) const { + dxfString(0, "APPID"); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } else { + dxfHex(5, h); + } + //dxfHex(330, 0x9); + dxfString(100, "AcDbSymbolTableRecord"); + dxfString(100, "AcDbRegAppTableRecord"); + } + } + + /** + * Block (must be in the section BLOCKS). + * + *
+     *   0
+     *  BLOCK
+     * 
+ */ + void sectionBlockEntry(unsigned long int h=0) const { + dxfString(0, "BLOCK"); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } else { + dxfHex(5, h); + } + //dxfHex(330, blockHandle); + dxfString(100, "AcDbEntity"); + if (h==0x1C) { + dxfInt(67, 1); + } + dxfString(8, "0"); // TODO: Layer for block + dxfString(100, "AcDbBlockBegin"); + } + } + + /** + * End of Block (must be in the section BLOCKS). + * + *
+     *   0
+     *  ENDBLK
+     * 
+ */ + void sectionBlockEntryEnd(unsigned long int h=0) const { + dxfString(0, "ENDBLK"); + if (version>=DL_VERSION_2000) { + if (h==0) { + handle(); + } else { + dxfHex(5, h); + } + //dxfHex(330, blockHandle); + dxfString(100, "AcDbEntity"); + if (h==0x1D) { + dxfInt(67, 1); + } + dxfString(8, "0"); // TODO: Layer for block + dxfString(100, "AcDbBlockEnd"); + } + } + + void color(int col=256) const { + dxfInt(62, col); + } + void linetype(const char *lt) const { + dxfString(6, lt); + } + void linetypeScale(double scale) const { + dxfReal(48, scale); + } + void lineWeight(int lw) const { + dxfInt(370, lw); + } + + void coord(int gc, double x, double y, double z=0) const { + dxfReal(gc, x); + dxfReal(gc+10, y); + dxfReal(gc+20, z); + } + + void coordTriplet(int gc, const double* value) const { + if (value) { + dxfReal(gc, *value++); + dxfReal(gc+10, *value++); + dxfReal(gc+20, *value++); + } + } + + void resetHandle() const { + m_handle = 1; + } + + /** + * Writes a unique handle and returns it. + */ + unsigned long handle(int gc=5) const { + // handle has to be hex + dxfHex(gc, m_handle); + return m_handle++; + } + + /** + * @return Next handle that will be written. + */ + unsigned long getNextHandle() const { + return m_handle; + } + + /** + * Increases handle, so that the handle returned remains available. + */ + unsigned long incHandle() const { + return m_handle++; + } + + /** + * Sets the handle of the model space. Entities refer to + * this handle. + */ + void setModelSpaceHandle(unsigned long h) { + modelSpaceHandle = h; + } + + unsigned long getModelSpaceHandle() { + return modelSpaceHandle; + } + + /** + * Sets the handle of the paper space. Some special blocks refer to + * this handle. + */ + void setPaperSpaceHandle(unsigned long h) { + paperSpaceHandle = h; + } + + unsigned long getPaperSpaceHandle() { + return paperSpaceHandle; + } + + /** + * Sets the handle of the paper space 0. Some special blocks refer to + * this handle. + */ + void setPaperSpace0Handle(unsigned long h) { + paperSpace0Handle = h; + } + + unsigned long getPaperSpace0Handle() { + return paperSpace0Handle; + } + + /** + * Must be overwritten by the implementing class to write a + * real value to the file. + * + * @param gc Group code. + * @param value The real value. + */ + virtual void dxfReal(int gc, double value) const = 0; + + /** + * Must be overwritten by the implementing class to write an + * int value to the file. + * + * @param gc Group code. + * @param value The int value. + */ + virtual void dxfInt(int gc, int value) const = 0; + + /** + * Can be overwritten by the implementing class to write a + * bool value to the file. + * + * @param gc Group code. + * @param value The bool value. + */ + virtual void dxfBool(int gc, bool value) const { + dxfInt(gc, (int)value); + } + + /** + * Must be overwritten by the implementing class to write an + * int value (hex) to the file. + * + * @param gc Group code. + * @param value The int value. + */ + virtual void dxfHex(int gc, int value) const = 0; + + /** + * Must be overwritten by the implementing class to write a + * string to the file. + * + * @param gc Group code. + * @param value The string. + */ + virtual void dxfString(int gc, const char* value) const = 0; + + /** + * Must be overwritten by the implementing class to write a + * string to the file. + * + * @param gc Group code. + * @param value The string. + */ + virtual void dxfString(int gc, const std::string& value) const = 0; + +protected: + mutable unsigned long m_handle; + mutable unsigned long modelSpaceHandle; + mutable unsigned long paperSpaceHandle; + mutable unsigned long paperSpace0Handle; + + /** + * DXF version to be created. + */ + DL_Codes::version version; +private: +}; + +#endif diff --git a/datafile/dxf/dxflib/dl_writer_ascii.cpp b/datafile/dxf/dxflib/dl_writer_ascii.cpp new file mode 100644 index 0000000..199707a --- /dev/null +++ b/datafile/dxf/dxflib/dl_writer_ascii.cpp @@ -0,0 +1,156 @@ +/**************************************************************************** +** Copyright (C) 2001-2013 RibbonSoft, GmbH. All rights reserved. +** Copyright (C) 2001 Robert J. Campbell Jr. +** +** This file is part of the dxflib project. +** +** This file is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** Licensees holding valid dxflib Professional Edition licenses may use +** this file in accordance with the dxflib Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.ribbonsoft.com for further details. +** +** Contact info@ribbonsoft.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + +#include "dl_writer_ascii.h" +#include "dl_exception.h" + + +/** + * Closes the output file. + */ +void DL_WriterA::close() const { + m_ofile.close(); +} + + +/** + * @retval true Opening file has failed. + * @retval false Otherwise. + */ +bool DL_WriterA::openFailed() const { + return m_ofile.fail(); +} + + + +/** + * Writes a real (double) variable to the DXF file. + * + * @param gc Group code. + * @param value Double value + */ +void DL_WriterA::dxfReal(int gc, double value) const { + char str[256]; + if (version==DL_Codes::AC1009_MIN) { + sprintf(str, "%.6lf", value); + } + else { + sprintf(str, "%.16lf", value); + } + + // fix for german locale: + strReplace(str, ',', '.'); + + // Cut away those zeros at the end: + bool dot = false; + int end = -1; + for (unsigned int i=0; i0 && end<(int)strlen(str)) { + str[end] = '\0'; + } + + dxfString(gc, str); + m_ofile.flush(); +} + + + +/** + * Writes an int variable to the DXF file. + * + * @param gc Group code. + * @param value Int value + */ +void DL_WriterA::dxfInt(int gc, int value) const { + m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n" << value << "\n"; +} + + + +/** + * Writes a hex int variable to the DXF file. + * + * @param gc Group code. + * @param value Int value + */ +void DL_WriterA::dxfHex(int gc, int value) const { + char str[12]; + sprintf(str, "%0X", value); + dxfString(gc, str); +} + + + +/** + * Writes a string variable to the DXF file. + * + * @param gc Group code. + * @param value String + */ +void DL_WriterA::dxfString(int gc, const char* value) const { + if (value==NULL) { +#ifndef __GCC2x__ + //throw DL_NullStrExc(); +#endif + } + m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n" + << value << "\n"; +} + + + +void DL_WriterA::dxfString(int gc, const std::string& value) const { + m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n" + << value << "\n"; +} + + +/** + * Replaces every occurence of src with dest in the null terminated str. + */ +void DL_WriterA::strReplace(char* str, char src, char dest) { + size_t i; + for (i=0; i 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "dl_writer.h" +#include +#include + +/** + * Implements functions defined in DL_Writer for writing low + * level DXF constructs to an ASCII format DXF file. + * + * @para fname File name of the file to be created. + * @para version DXF version. Defaults to DL_VERSION_2002. + * + * @todo What if \c fname is NULL? Or \c fname can't be opened for + * another reason? + */ +class DXFLIB_EXPORT DL_WriterA : public DL_Writer { +public: + DL_WriterA(const char* fname, DL_Codes::version version=DL_VERSION_2000) + : DL_Writer(version), m_ofile(fname) {} + virtual ~DL_WriterA() {} + + bool openFailed() const; + void close() const; + void dxfReal(int gc, double value) const; + void dxfInt(int gc, int value) const; + void dxfHex(int gc, int value) const; + void dxfString(int gc, const char* value) const; + void dxfString(int gc, const std::string& value) const; + + static void strReplace(char* str, char src, char dest); + +private: + /** + * DXF file to be created. + */ + mutable std::ofstream m_ofile; + +}; + +#endif + diff --git a/datafile/dxf/dxfreader.cpp b/datafile/dxf/dxfreader.cpp new file mode 100644 index 0000000..24db047 --- /dev/null +++ b/datafile/dxf/dxfreader.cpp @@ -0,0 +1,379 @@ +#include "dxfreader.h" +#include + +DxfReader::DxfReader(const QString &fileName, QObject *parent) + : QObject(parent) + , fileName(fileName) +{ + //QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); + + // 读取 dxf 文件 + DL_Dxf *dxf = new DL_Dxf; + if (!dxf->in(std::string(fileName.toLocal8Bit()), this)) { // if file open failed + std::cerr << std::string(fileName.toLocal8Bit()) << " could not be opened.\n"; + return; + } + delete dxf; + dxf = nullptr; +} + +void DxfReader::addText(const DL_TextData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfText << data; +} + +void DxfReader::addLine(const DL_LineData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfLines << data; +} + +void DxfReader::addArc(const DL_ArcData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfArcs << data; +} + +void DxfReader::addCircle(const DL_CircleData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfCircles << data; +} + +void DxfReader::addEllipse(const DL_EllipseData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfEllipses << data; +} + +void DxfReader::addPolyline(const DL_PolylineData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfPolylines << data; +} + +void DxfReader::addPoint(const DL_PointData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfPoints << data; +} + +void DxfReader::addSpline(const DL_SplineData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfSplines << data; +} + +void DxfReader::addBlock(const DL_BlockData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfBlocks << data; +} + +void DxfReader::endBlock() +{ + +} + +void DxfReader::addLayer(const DL_LayerData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfLayers << data; +} + +void DxfReader::addLinetype(const DL_LinetypeData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfLinetypes << data; +} + +void DxfReader::addLinetypeDash(double length) +{ + if(length < 0){} +} + +void DxfReader::addXLine(const DL_XLineData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfXLines << data; +} + +void DxfReader::addRay(const DL_RayData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfRays << data; +} + +void DxfReader::addVertex(const DL_VertexData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfVertexs << data; +} + +void DxfReader::addControlPoint(const DL_ControlPointData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfControlPoints << data; +} + +void DxfReader::addFitPoint(const DL_FitPointData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfFitPoints << data; +} + +void DxfReader::addKnot(const DL_KnotData &data) +{ + if(data.k == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addInsert(const DL_InsertData &data) +{ + if(data.angle == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addSolid(const DL_SolidData &data) +{ + if(data.x == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addTrace(const DL_TraceData &data) +{ + if(data.x == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addTextStyle(const DL_StyleData &data) +{ + if(data.flags == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addMTextChunk(const std::string &text) +{ + if(text.data() == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addMText(const DL_MTextData &data) +{ + if(data.angle == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addArcAlignedText(const DL_ArcAlignedTextData &data) +{ + if(data.alignment == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addAttribute(const DL_AttributeData &data) +{ + if(data.angle == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimAlign(const DL_DimensionData &data, const DL_DimAlignedData &edata) +{ + if(data.angle == 0){} + if(edata.epx1 == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimLinear(const DL_DimensionData &data, const DL_DimLinearData &edata) +{ + if(data.angle == 0){} + if(edata.angle == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimRadial(const DL_DimensionData &data, const DL_DimRadialData &edata) +{ + if(data.angle == 0){} + if(edata.dpx == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimDiametric(const DL_DimensionData &data, const DL_DimDiametricData &edata) +{ + if(data.angle == 0){} + if(edata.dpx == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimAngular(const DL_DimensionData &data, const DL_DimAngularData &edata) +{ + if(data.angle == 0){} + if(edata.dpx1 == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimAngular3P(const DL_DimensionData &data, const DL_DimAngular3PData &edata) +{ + if(data.angle == 0){} + if(edata.dpx1 == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDimOrdinate(const DL_DimensionData &data, const DL_DimOrdinateData &edata) +{ + if(data.angle == 0){} + if(edata.dpx1 == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addLeader(const DL_LeaderData &data) +{ + if(data.arrowHeadFlag == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addLeaderVertex(const DL_LeaderVertexData &data) +{ + if(data.x == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addHatch(const DL_HatchData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfHatchs << data; +} + +void DxfReader::addHatchLoop(const DL_HatchLoopData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfHatchLoops << data; +} + +void DxfReader::addHatchEdge(const DL_HatchEdgeData &data) +{ + //qDebug() << Q_FUNC_INFO; + dxfHatchEdges << data; +} + +void DxfReader::addImage(const DL_ImageData &data) +{ + if(data.brightness == 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::linkImage(const DL_ImageDefData &data) +{ + if(data.file == ""){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addXRecord(const std::string &handle) +{ + if(handle.length() <= 0){} +} + +void DxfReader::addXRecordString(int code, const std::string &value) +{ + if(code <= 0){} + if(value.length() <= 0){} +} + +void DxfReader::addXRecordReal(int code, double value) +{ + if(code <= 0){} + if(value <= 0){} +} + +void DxfReader::addXRecordInt(int code, int value) +{ + if(code <= 0){} + if(value <= 0){} +} + +void DxfReader::addXRecordBool(int code, bool value) +{ + if(code <= 0){} + if(value <= 0){} +} + +void DxfReader::addXDataApp(const std::string &appId) +{ + if(appId.length() <= 0){} +} + +void DxfReader::addXDataString(int code, const std::string &value) +{ + if(code <= 0){} + if(value.length() <= 0){} +} + +void DxfReader::addXDataReal(int code, double value) +{ + if(code <= 0){} + if(value <= 0){} +} + +void DxfReader::addXDataInt(int code, int value) +{ + if(code <= 0){} + if(value <= 0){} +} + +void DxfReader::addDictionary(const DL_DictionaryData &data) +{ + if(data.handle.length() <= 0){} +// qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addDictionaryEntry(const DL_DictionaryEntryData &data) +{ + if(data.handle.length() <= 0){} +// qDebug() << Q_FUNC_INFO; +} + +void DxfReader::setVariableVector(const std::string &key, double v1, double v2, double v3, int code) +{ + if(key.length() <= 0){} + if(v1 <= 0){} + if(v2 <= 0){} + if(v3 <= 0){} + if(code <= 0){} +} + +void DxfReader::setVariableString(const std::string &key, const std::string &value, int code) +{ + if(key.length() <= 0){} + if(value.length() <= 0){} + if(code <= 0){} +} + +void DxfReader::setVariableInt(const std::string &key, int value, int code) +{ + if(key.length() <= 0){} + if(value <= 0){} + if(code <= 0){} +} + +void DxfReader::setVariableDouble(const std::string &key, double value, int code) +{ + if(key.length() <= 0){} + if(value <= 0){} + if(code <= 0){} +} + +void DxfReader::add3dFace(const DL_3dFaceData &data) +{ + if(data.thickness <= 0){} + //qDebug() << Q_FUNC_INFO; +} + +void DxfReader::addComment(const std::string &comment) +{ + if(comment.length() <= 0){} +} + +void DxfReader::endSequence() +{ + //qDebug() << Q_FUNC_INFO; +} diff --git a/datafile/dxf/dxfreader.h b/datafile/dxf/dxfreader.h new file mode 100644 index 0000000..cef9f40 --- /dev/null +++ b/datafile/dxf/dxfreader.h @@ -0,0 +1,109 @@ +#ifndef DXFREADER_H +#define DXFREADER_H + +#include +#include +#include "dxflib/dl_dxf.h" +#include "dxflib/dl_creationadapter.h" + +class DxfReader : public QObject, public DL_CreationAdapter +{ + Q_OBJECT +public: + struct DxfText { + QString Text; + }; + explicit DxfReader(const QString &fileName, QObject *parent = nullptr); + + virtual void addText(const DL_TextData& data) override; + virtual void addLine(const DL_LineData& data) override; + virtual void addArc(const DL_ArcData& data) override; + virtual void addCircle(const DL_CircleData& data) override; + virtual void addEllipse(const DL_EllipseData& data) override; + virtual void addPolyline(const DL_PolylineData& data) override; + virtual void addPoint(const DL_PointData& data) override; + virtual void addSpline(const DL_SplineData& data) override; + virtual void addBlock(const DL_BlockData& data) override; + virtual void endBlock() override; + + virtual void addLayer(const DL_LayerData& data) override; + virtual void addLinetype(const DL_LinetypeData& data) override; + virtual void addLinetypeDash(double length) override; + virtual void addXLine(const DL_XLineData& data) override; + virtual void addRay(const DL_RayData& data) override; + virtual void addVertex(const DL_VertexData& data) override; + virtual void addControlPoint(const DL_ControlPointData& data) override; + virtual void addFitPoint(const DL_FitPointData& data) override; + virtual void addKnot(const DL_KnotData& data) override; + virtual void addInsert(const DL_InsertData& data) override; + virtual void addSolid(const DL_SolidData& data) override; + virtual void addTrace(const DL_TraceData& data) override; + virtual void addTextStyle(const DL_StyleData& data) override; + virtual void addMTextChunk(const std::string& text) override; + virtual void addMText(const DL_MTextData& data) override; + virtual void addArcAlignedText(const DL_ArcAlignedTextData& data) override; + virtual void addAttribute(const DL_AttributeData& data) override; + virtual void addDimAlign(const DL_DimensionData& data, const DL_DimAlignedData& edata) override; + virtual void addDimLinear(const DL_DimensionData& data, const DL_DimLinearData& edata) override; + virtual void addDimRadial(const DL_DimensionData& data, const DL_DimRadialData& edata) override; + virtual void addDimDiametric(const DL_DimensionData& data, const DL_DimDiametricData& edata) override; + virtual void addDimAngular(const DL_DimensionData& data, const DL_DimAngularData& edata) override; + virtual void addDimAngular3P(const DL_DimensionData& data, const DL_DimAngular3PData& edata) override; + virtual void addDimOrdinate(const DL_DimensionData& data, const DL_DimOrdinateData& edata) override; + virtual void addLeader(const DL_LeaderData &data) override; + virtual void addLeaderVertex(const DL_LeaderVertexData &data) override; + virtual void addHatch(const DL_HatchData& data) override; + virtual void addHatchLoop(const DL_HatchLoopData& data) override; + virtual void addHatchEdge(const DL_HatchEdgeData& data) override; + virtual void addImage(const DL_ImageData &data) override; + virtual void linkImage(const DL_ImageDefData &data) override; + + virtual void addXRecord(const std::string& handle) override; + virtual void addXRecordString(int code, const std::string& value) override; + virtual void addXRecordReal(int code, double value) override; + virtual void addXRecordInt(int code, int value) override; + virtual void addXRecordBool(int code, bool value) override; + + virtual void addXDataApp(const std::string& appId) override; + virtual void addXDataString(int code, const std::string& value) override; + virtual void addXDataReal(int code, double value) override; + virtual void addXDataInt(int code, int value) override; + + virtual void addDictionary(const DL_DictionaryData& data) override; + virtual void addDictionaryEntry(const DL_DictionaryEntryData& data) override; + + virtual void setVariableVector(const std::string& key, double v1, double v2, double v3, int code) override; + virtual void setVariableString(const std::string& key, const std::string& value, int code) override; + virtual void setVariableInt(const std::string& key, int value, int code) override; + virtual void setVariableDouble(const std::string& key, double value, int code) override; + + virtual void add3dFace(const DL_3dFaceData &data) override; + virtual void addComment(const std::string &comment) override; + virtual void endSequence() override; + + QList dxfLines; + QList dxfText; + QList dxfArcs; + QList dxfCircles; + QList dxfEllipses; + QList dxfPolylines; + QList dxfPoints; + QList dxfSplines; + QList dxfBlocks; + QList dxfVertexs; + QList dxfLayers; + QList dxfLinetypes; + QList dxfXLines; + QList dxfRays; + QList dxfControlPoints; + QList dxfFitPoints; + QList dxfHatchs; + QList dxfHatchLoops; + QList dxfHatchEdges; + +private: + QString fileName; + +}; + +#endif // DXFREADER_H diff --git a/datafile/embdata.cpp b/datafile/embdata.cpp new file mode 100644 index 0000000..a983c78 --- /dev/null +++ b/datafile/embdata.cpp @@ -0,0 +1,10660 @@ +#include "embdata.h" +#include "main.h" +#include "sharedviews/setcontrolstyle.h" +#include +#include + +static int emb_showDirX = (1);// X向显示坐标和数据坐标的差异 +static int emb_showDirY = (1);// Y向显示坐标和数据坐标的差异 + +const int headNum = 5; // 机头数 + +EmbData::EmbData() +{ + m_pEmbDs16Head = new DataDs16FileHead(); + m_penHeadPix.resize(5); + m_penPoint.resize(5); + clear(); +} + +EmbData::~EmbData() +{ + clear(); + if(m_pEmbDs16Head != NULL) + { + delete m_pEmbDs16Head; + } +} + +void EmbData::clear() +{ + m_maxX = 0; + m_minX = 0; + m_maxY = 0; + m_minY = 0; + m_fileid = 0; + + m_spaceX = 0; + m_spaceY = 0; + + m_penX = 0; + m_penY = 0; + + m_embDs16Data.clear(); + + m_editedflag = 0; + m_filePath.clear(); + m_factor = 0; + + m_dispDatFront.clear();//飞梭机前排数据 + m_dispDatMiddle.clear();//飞梭机中排数据 + m_dispDatBehind.clear();//飞梭机后排数据 + + m_dispMinX = S32_MAX; + m_dispMaxX = S32_MIN; + m_dispMinY = S32_MAX; + m_dispMaxY = S32_MIN; + m_oftNeedleSize = 0; + m_ritStepSize = 0; + + memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead)); +} + +QByteArray & EmbData::getDsDat() +{ + //qDebug()<<"m_editedflag"<(ds16DataPtr) + sizeof(DsAbsItem) > ary.data() + size) { + qDebug("Array access out of bounds at step %d", i); + return false; + } + + if( + ds16DataPtr->ctrl == DATA_SEWING || + ds16DataPtr->ctrl == DATA_JUMP || + ds16DataPtr->ctrl == DATA_OFFSET) + { + if(i == 0) + { + firstX = ds16DataPtr->ax; + } + endX = ds16DataPtr->ax; + } + ds16DataPtr++; + } + + if(abs(endX - firstX) != 0) // 不等于0mm + { + qDebug() << "firstX:" << firstX << "endX:" << endX; + return false; + } + + return true; +} + +//按照标志位置来设置文件数据-旋转角度调整 +QByteArray EmbData::rotationAngleAdjustment(int flag) +{ + // 检查数据大小是否足够 + if (m_embDs16Data.size() < static_cast(sizeof(DataDs16FileHead))) + { + qDebug("dat dataBegin err: not enough data for header!"); + return QByteArray(); + } + + DataDs16FileHead *dataDs16FileHead = reinterpret_cast(m_embDs16Data.data()); + int size = m_embDs16Data.size(); + int datasize = size - static_cast(sizeof(DataDs16FileHead)); + + if (datasize <= 0) + { + qDebug("dat dataBegin err: datasize is non-positive!"); + return QByteArray(); + } + + int stepsize = datasize / static_cast(sizeof(Ds16Item)); + if (stepsize <= 0) + { + qDebug("ds16 data size err: stepsize is non-positive!"); + return QByteArray(); + } + + Ds16Item *ds16DataPtr = reinterpret_cast(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + Ds16Item *ds16DataPtr_tmp = reinterpret_cast(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + QList drList; + for(int i = 0; i < stepsize; ++i) + { + drList.append(ds16DataPtr_tmp->dr); + ds16DataPtr_tmp++; + } + + switch (flag) + { + case 1: + { + dataDs16FileHead->beginR += ds16DataPtr->dr; + for (int i = 0; i < stepsize - 1; ++i) + { + // 确保指针不越界 + if (reinterpret_cast(ds16DataPtr) + sizeof(Ds16Item) > m_embDs16Data.data() + size) + { + qDebug("Array access out of bounds at step %d", i); + return QByteArray(); + } + ds16DataPtr->dr = drList.at(i+1); + if (i == stepsize - 2) + { + (ds16DataPtr + 1)->dr = 0; + } + ds16DataPtr++; + } + } + break; + case -1: + { + for (int i = 0; i < stepsize - 1; ++i) + { + // 确保指针不越界 + if (reinterpret_cast(ds16DataPtr) + sizeof(Ds16Item) > m_embDs16Data.data() + size) + { + qDebug("Array access out of bounds at step %d", i); + return QByteArray(); + } + if (i == 0) + { + (ds16DataPtr + 1)->dr = drList.at(i); + ds16DataPtr->dr = 0; + continue; + } + (ds16DataPtr + 1)->dr = drList.at(i); + ds16DataPtr++; + } + } + break; + case 0: + return m_embDs16Data; + break; + default: + qDebug()<<"The Flag is no meet the requirements!"; + return QByteArray(); + } + + return QByteArray(); +} + +QByteArray EmbData::getDispDat(double showWidth,double showHeight) +{ + QByteArray dispDat; + + ViewItem dispItem; + dispDat.clear();//显示绘图用的数据(需要转换) + + // ds16数据 + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + return dispDat; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + return dispDat; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + return dispDat; + } + + double width = showWidth; + double height = showHeight; + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + // 显示花样图形 + u8 ctrlByte; + u8 attrByte; + int dx; + int dy; + int dr; + + double datposx, datposy, datposr, firstx, firsty; + double curx, cury, curr, prex, prey; + curx = cury = curr = prex = prey = 0; + + double unit = 100.0;//因为ds16的数据是0.01毫米 + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) +// int dpx = (showWidth)/2.0 - ((m_maxX+m_minX)/unit)/2.0; +// int dpy = (showHeight)/2.0 - ((m_maxY+m_minY)/unit)/2.0; + + int dpx = (showWidth)/2.0; + int dpy = (showHeight)/2.0; + + datposx = pDsHead->beginX; + datposy = pDsHead->beginY; + datposr = pDsHead->beginR; + + firstx = pDsHead->beginX; + firsty = pDsHead->beginY; + + curx = (datposx - firstx)/unit + dpx; + cury = (datposy - firsty)/unit + dpy; + + if(isFlipDispYMac()) + { + emb_showDirY = -1; + } + + if(isFlipDispXMac()) + { + emb_showDirX = -1; + } + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + // double maxX = S32_MIN; + // double maxY = S32_MIN; + // double minX = S32_MAX; + // double minY = S32_MAX; + + for (int i = 0; i < stepsize; i++) + { + prex = curx; + prey = cury; + + // 读入一个针步数据 + ctrlByte = ds16DataPtr->ctrl; + attrByte = ds16DataPtr->attr; + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + dr = ds16DataPtr->dr; + + datposx += dx; + datposy += dy; + datposr += dr; + + curx = (datposx - firstx)/unit + dpx; + cury = (datposy - firsty)/unit + dpy; + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + while(datposr >= PI10000) + { + datposr -= (PI20000-1); + } + while(datposr <= -PI10000) + { + datposr += (PI20000-1); + } + + dispItem.ctrl = ctrlByte; + dispItem.attr = attrByte; + dispItem.bx = prex; + dispItem.by = prey; + dispItem.ex = curx; + dispItem.ey = cury; + dispItem.ar = curr; + + memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action)); + + dispDat.append((char*)(&dispItem), sizeof(ViewItem)); + + ds16DataPtr++; + } + + return dispDat; +} + +//设置数据区文件头的fileid,计算完以后的fileid再设置进来 +void EmbData::setDsDatHeadFileID(u32 fileid) +{ + if(m_pEmbDs16Head != NULL) + { + m_pEmbDs16Head->fileid = fileid; + if((u32)m_embDs16Data.size() > sizeof(DataDs16FileHead)) + { + memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head, sizeof(DataDs16FileHead)); + } + } +} + +//得到绝对坐标的maxXY和minXY +void EmbData::getAbsDatRangeXY() +{ + m_minX = S32_MAX; + m_maxX = S32_MIN; + m_minY = S32_MAX; + m_maxY = S32_MIN; + + double ax, ay; + int minx, miny, maxx, maxy; + + const QByteArray & ary = m_embAbsData; + int size = ary.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return; + } + DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //----- + minx = S32_MAX; + maxx = S32_MIN; + miny = S32_MAX; + maxy = S32_MIN; + + // 数据区 + for (int j = 0; j < stepsize; j++) + { + ax = absDataPtr->ax; + ay = absDataPtr->ay; + + if (minx > ax) { minx = ax; } + if (maxx < ax) { maxx = ax; } + if (miny > ay) { miny = ay; } + if (maxy < ay) { maxy = ay; } + + absDataPtr++; + } + + if (m_minX > minx) { m_minX = minx; } + if (m_minX > maxx) { m_minX = maxx; } + if (m_maxX < minx) { m_maxX = minx; } + if (m_maxX < maxx) { m_maxX = maxx; } + if (m_minY > miny) { m_minY = miny; } + if (m_minY > maxy) { m_minY = maxy; } + if (m_maxY < miny) { m_maxY = miny; } + if (m_maxY < maxy) { m_maxY = maxy; } + + qDebug() << "==========================m_minX" << m_minX; + qDebug() << "==========================m_minY" << m_minY; + qDebug() << "==========================m_maxY" << m_maxY; + qDebug() << "==========================m_maxX" << m_maxX; +} + +// 添加锁针针步 +/// +/// \brief EmbData::addLockStitchs +/// \param mode +/// \param lockNeedles//锁针针数 +/// \param lockNum//锁针次数 +/// \return +/// +int EmbData::addLockStitchs(u8 mode, u8 lockNeedles, u8 lockNum) +{ + if (lockNeedles <= 0) + { + return -1; + } + + int size = m_embAbsData.size(); + if (size <= 0) + { + return -1; + } + + u8 clockNeedles = lockNeedles; + + // 文件头 + int stepsize = (size - sizeof(DataDs16FileHead))/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("dat size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + + QByteArray tgtdsdat; // 添加后的绝对坐标数据 + tgtdsdat.clear(); + tgtdsdat.append((char*)pHead, sizeof(DataDs16FileHead)); + + // if(mode == MODE_LOCK) //锁针 来回加固 + // { + // QByteArray data = lockReinforce(lockNeedles, lockNum, absDataPtr, stepsize); + // tgtdsdat.append(data); + // } + // else if(mode == MODE_THICKEN) //密针 分割大针步 + // { + // QByteArray data = thickenReinforce(lockNeedles, lockNum, absDataPtr, stepsize); + // tgtdsdat.append(data); + // } + + //DsAbsItem * test = (pData + stepsize - 1);//最后一针 + //DsAbsItem * test1 = pData;//第一针 + + int runflag = 0; + + for (int j = 0; j < stepsize; j++) + { + if (absDataPtr->ctrl == DATA_SEWING || absDataPtr->ctrl == DATA_SEWING_R || + absDataPtr->ctrl == DATA_SYNCSEW || absDataPtr->ctrl == DATA_MIRROR_SEC)//包括起针和剪线后加锁针 + { + if ((runflag == 0 || runflag > 3)) + { + // 添加锁针 + if(mode == MODE_LOCK)//锁针方式 + { + int nst = 0; + if(lockNum%2 == 0)//偶数 + { + nst = 0; + } + else//奇数 + { + nst = lockNeedles; + } + + if(j == 0 && lockNeedles == 1) + { + nst = lockNeedles; + } + + do + { + if(j + nst < stepsize) + { + DsAbsItem * nextPtr = absDataPtr+nst; // 要加锁针的点 + if (nextPtr->ctrl == DATA_SEWING || nextPtr->ctrl == DATA_SEWING_R || + nextPtr->ctrl == DATA_SYNCSEW || nextPtr->ctrl == DATA_MIRROR_SEC) + { + if(lockNum%2 == 0)//偶数锁针 + { + nextPtr--; + for (int kNum = 0; kNum < lockNum; kNum++) + { + if(kNum%2 == 0) + { + for (int s = 0; s < lockNeedles; s++) + { + nextPtr++; + if(nextPtr >= pData && nextPtr < (pData + stepsize)) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = absDataPtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = nextPtr->ax; + nitem.ay = nextPtr->ay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + } + } + nextPtr++;//之前没有这一行,刘威添加 + if(kNum > 0 && kNum%2 != 0) + { + for (int s = lockNeedles; s > 0; s--) + { + nextPtr--; + if(kNum == lockNum-1 && s == 1) + { + continue;//最后一次锁针的最后一步不添加 + } + if((nextPtr >= pData && nextPtr < (pData + stepsize)) || j == 0) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = absDataPtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = nextPtr->ax; + nitem.ay = nextPtr->ay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + } + } + } + } + else//奇数锁针 + { + { + nextPtr--; + if(nextPtr >= pData && nextPtr < (pData + stepsize)) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = DATA_OFFSET;//第一针步转换为跨步 + nitem.attr = absDataPtr->attr; + nitem.ax = nextPtr->ax; + nitem.ay = nextPtr->ay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + nextPtr++;//之前这一行为nextPtr--,刘威修改 + } + + for (int k = 0; k < lockNum; k++) + { + if(k%2 == 0)//偶数 + { + for (int s = lockNeedles; s > 0; s--) + { + if (nextPtr >= pData && nextPtr < (pData + stepsize)) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = absDataPtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = nextPtr->ax; + nitem.ay = nextPtr->ay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + nextPtr--; + } + nextPtr++; + } + + if(k > 0 && k%2 != 0)//奇数 + { + for (int s = 0; s < lockNeedles; s++) + { + nextPtr++; + if(nextPtr >= pData && nextPtr < (pData + stepsize)) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = absDataPtr->ctrl; + nitem.attr = absDataPtr->attr | ATTR_RESEW; + nitem.ax = nextPtr->ax; + nitem.ay = nextPtr->ay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + } + nextPtr--; + } + } + } + break; + } + else + { + break; + } + } + else + { + break; + } + }while(1); + } + else if(mode == MODE_THICKEN)//密针方式 + { + tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem)); + + s16 nNum = 0; + if(lockNum == 0)//如果锁针次数为0时,第一针锁针次数就是锁针针数 + { + nNum = lockNeedles+1; + } + else + { + nNum = lockNum+1; + } + + do + { + if(j < stepsize) + { + DsAbsItem * nextPtr = absDataPtr; // 下一个点 + if (nextPtr->ctrl == DATA_SEWING || nextPtr->ctrl == DATA_SEWING_R || nextPtr->ctrl == DATA_SYNCSEW || nextPtr->ctrl == DATA_MIRROR_SEC) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + DsAbsItem * prePtr = absDataPtr; + + for (int s = 0; s < clockNeedles; s++) + { + double dx = nextPtr->ax - prePtr->ax; + double dy = nextPtr->ay - prePtr->ay; + double len = sqrt(dx*dx + dy*dy); + if (len <= 0) + { + prePtr = nextPtr; + nextPtr++; + clockNeedles++; + if(nextPtr >= (pData + stepsize)) + { + break; + } + continue; + } + + if(prePtr >= pData && prePtr < (pData + stepsize)) + { + double dLen = len / nNum; + double axbase = prePtr->ax; + double aybase = prePtr->ay; + + for (int k = 0; k < nNum; k++) + { + double nax = dx * dLen / len + axbase; + double nay = dy * dLen / len + aybase; + + nitem.ctrl = absDataPtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = nax; + nitem.ay = nay; + nitem.ar = absDataPtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + + axbase = nax; + aybase = nay; + } + if(lockNum == 0) + { + nNum--; + } + } + prePtr = nextPtr; + nextPtr++; + } + clockNeedles = lockNeedles; + break; + } + else + { + break; + } + } + else + { + break; + } + }while(1); + + for (int s = 0; s < lockNeedles; s++)//跳到不加锁针的那一针 + { + absDataPtr++; + j++; + } + } + runflag = 1; + } + } + else if (absDataPtr->ctrl == DATA_CUTTRD || absDataPtr->ctrl == DATA_CUTTER_SEC || absDataPtr->ctrl == DATA_SYNC_CUTTER) + { + runflag = 10; + } + else + { + runflag = 0; + } + + DsAbsItem * prePtrstep = absDataPtr-1; // 上一个点 + //加锁针 + if (absDataPtr->ctrl == DATA_END + || absDataPtr->ctrl == DATA_NULL + || j == stepsize - 1 + + //当前点不为缝纫,上一个点为缝纫 + //适用于双头或四头绗缝机++++++ + || ((prePtrstep->ctrl == DATA_SEWING) && + (absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData) + || ((prePtrstep->ctrl == DATA_SEWING_R) && + (absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData) + || ((prePtrstep->ctrl == DATA_MIRROR_SEC) && + (absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData) + || ((prePtrstep->ctrl == DATA_SYNCSEW) && + (absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData) + //适用于双头或四头绗缝机++++++ + + || absDataPtr->ctrl == DATA_CUTTRD + || absDataPtr->ctrl == DATA_CUTTER_SEC + || absDataPtr->ctrl == DATA_SYNC_CUTTER) + { + int m = 1; + //结束前或剪线前加锁针 + DsAbsItem * prePtr = absDataPtr-1; // 上一个点 + u8 ctl = prePtr->ctrl; + + //如果结束前为剪线则不加锁针了,因为剪线前已经加了锁针 + if((ctl == DATA_CUTTRD || ctl == DATA_CUTTER_SEC || ctl == DATA_SYNC_CUTTER) && + (absDataPtr->ctrl == DATA_NULL || absDataPtr->ctrl == DATA_END)) + { + tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem)); + absDataPtr++; + continue; + } + + //如果第二机头剪线前为第一机头剪线,则不加锁针,因为第一机头剪线前已经加了锁针 + if(ctl == DATA_CUTTRD && absDataPtr->ctrl == DATA_CUTTER_SEC) + { + tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem)); + absDataPtr++; + continue; + } + + //如果同步剪线前为第一机头剪线或第二机头剪线,则不加锁针,因为之前已经加了锁针 + if(ctl == DATA_SYNC_CUTTER && (absDataPtr->ctrl == DATA_CUTTRD || absDataPtr->ctrl == DATA_CUTTER_SEC)) + { + tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem)); + absDataPtr++; + continue; + } + + //为缝纫或双机头同步缝纫或双机头镜像缝纫(双头组合机型是有后两种) + while(ctl != DATA_SEWING && ctl != DATA_SEWING_R && ctl != DATA_SYNCSEW && ctl != DATA_MIRROR_SEC && ctl != DATA_DRAWING) + { + prePtr--; + if(prePtr < pData)//越界起始地址 2025.4.22 ls + { + return -1; + } + m++; + ctl = prePtr->ctrl; + } + + // 添加锁针 + int nst = 1; + int addIdx = m+1; + + if(mode == MODE_LOCK)//锁针方式 + { + do + { + if(j-m-nst > 0) + { + DsAbsItem * lockPtr = prePtr; // 要加锁针的点 + if (lockPtr->ctrl == DATA_SEWING || lockPtr->ctrl == DATA_SEWING_R || lockPtr->ctrl == DATA_SYNCSEW || lockPtr->ctrl == DATA_MIRROR_SEC) + { + for (int k = 0; k < lockNum; k++) + { + if(k%2 == 0) + { + for (int s = lockNeedles; s > 0; s--) + { + lockPtr--; + if(lockPtr >= pData && lockPtr < (pData + stepsize))//越界起始地址 2025.4.22 ls + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = prePtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = lockPtr->ax; + nitem.ay = lockPtr->ay; + nitem.ar = prePtr->ar; +// if((int)(tgtdsdat.size()-addIdx*sizeof(DsAbsItem)) < tgtdsdat.size()) +// { +// tgtdsdat.insert((tgtdsdat.size()-addIdx*sizeof(DsAbsItem)),(char*)(&nitem), sizeof(DsAbsItem)); +// addIdx++; +// } + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + } + } + + if(k > 0 && k%2 != 0) + { + for (int s = 0; s < lockNeedles; s++) + { + lockPtr++; + if(lockPtr >= pData && lockPtr < (pData + stepsize)) + { + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = prePtr->ctrl; + nitem.attr = (absDataPtr->attr | ATTR_RESEW); + nitem.ax = lockPtr->ax; + nitem.ay = lockPtr->ay; + nitem.ar = prePtr->ar; +// if((int)(tgtdsdat.size()-addIdx*sizeof(DsAbsItem)) < tgtdsdat.size()) +// { +// tgtdsdat.insert((tgtdsdat.size()-addIdx*sizeof(DsAbsItem)),(char*)(&nitem), sizeof(DsAbsItem)); +// addIdx++; +// } + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + } + } + } + } + break; + } + else + { + break; + } + } + else + { + break; + } + }while(1); + } + else if(mode == MODE_THICKEN)//密针方式 + { + addIdx += 1; + nst = lockNeedles; + + DsAbsItem * ptr = prePtr-lockNeedles; // 加锁针点 + while(ptr->ctrl != DATA_SEWING && ptr->ctrl != DATA_SEWING_R && ptr->ctrl != DATA_SYNCSEW && ptr->ctrl != DATA_MIRROR_SEC) + { + ptr++; + lockNeedles--; + addIdx--; + if(ptr >= (pData + stepsize) || lockNeedles <= 0) + { + break; + } + } + + //去除要加密针的已添加的针步 + tgtdsdat.remove(tgtdsdat.size() - lockNeedles*sizeof(DsAbsItem),lockNeedles*sizeof(DsAbsItem)); + + s16 nNum = 0; + if(lockNum == 0)//如果锁针次数为0时,第一针锁针次数就是锁针针数 + { + nNum = lockNeedles+1; + } + else + { + nNum = lockNum+1; + } + + do + { + if(j-m-nst > 0) + { + DsAbsItem * lockPtr = prePtr-lockNeedles; // 加锁针点 + addIdx -= lockNeedles; + if(lockPtr < pData)//越界起始地址 + { + return -1; + } + //为缝纫或双机头同步缝纫或双机头镜像缝纫(双头组合机型是有后两种) + if (lockPtr->ctrl == DATA_SEWING || lockPtr->ctrl == DATA_SEWING_R || lockPtr->ctrl == DATA_SYNCSEW || lockPtr->ctrl == DATA_MIRROR_SEC) + { + for (int s = 0; s < lockNeedles; s++) + { + DsAbsItem * nextPtr = lockPtr+1; + if(nextPtr > (pData + (stepsize-1))) + { + return -1; + } + double dx = nextPtr->ax - lockPtr->ax; + double dy = nextPtr->ay - lockPtr->ay; + double len = sqrt(dx*dx + dy*dy); + if (len <= 0) + { + if(lockNum == 0) + { + nNum--; + } + + lockPtr++; + addIdx++; + if(lockPtr > (pData + (stepsize-1))) + { + return -1; + } + if (lockPtr->ctrl != DATA_SEWING && lockPtr->ctrl != DATA_SEWING_R && lockPtr->ctrl != DATA_SYNCSEW && lockPtr->ctrl != DATA_MIRROR_SEC) + { + break; + } + continue; + } + double dLen = len / nNum; + double axbase = lockPtr->ax; + double aybase = lockPtr->ay; + + for (int k = 0; k < nNum; k++) + { + double nax = dx * dLen / len + axbase; + double nay = dy * dLen / len + aybase; + DsAbsItem nitem; + memset(&nitem,0,sizeof(DsAbsItem)); + nitem.ctrl = prePtr->ctrl; + nitem.attr = absDataPtr->attr | ATTR_RESEW; + nitem.ax = nax; + nitem.ay = nay; + nitem.ar = prePtr->ar; + tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem)); + + axbase = nax; + aybase = nay; + } + if(lockNum == 0) + { + nNum--; + } + lockPtr++; + if (lockPtr->ctrl != DATA_SEWING && lockPtr->ctrl != DATA_SEWING_R && lockPtr->ctrl != DATA_SYNCSEW && lockPtr->ctrl != DATA_MIRROR_SEC) + { + break; + } + } + break; + } + else + { + lockPtr++; + lockNeedles -= 1; + if(lockNeedles <= 0 || lockPtr >= (pData + stepsize)) + { + break; + } + } + } + else + { + break; + } + }while(1); + } + } + + tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem)); + + absDataPtr++; + } + + m_embAbsData.clear(); + m_embAbsData = tgtdsdat; + + m_editedflag = 1; + return 0; +} + +//锁针加固方式 +/// +/// \brief EmbData::lockReinforce +/// \param needles 针数 +/// \param num 次数 +/// \param absDataPtr +/// \param stepSize +/// \return +/// +QByteArray EmbData::lockReinforce(u8 needles, u8 num, DsAbsItem *absDataPtr, int stepSize) +{ + QByteArray result; + for(int i = 0; i < stepSize-1; i++) + { + bool isNeedOriginPoint = true; + do + { + if(needles == 0 || num == 0) + { + break; + } + + //加固条件,此针为缝纫并且 第一针或者上一针不是缝纫 + if(absDataPtr->ctrl == DATA_SEWING) + { + //第一针 + if(i==0) + { + if(num%2 == 0)//偶数次 从起始点开始 + { + evenNumberAddLock(result, absDataPtr, needles, num); + } + else //奇数次 + { + oddNumberAddLock(result, absDataPtr, needles, num); + } + + } + //上一针不是缝纫针步 线断起始加固 + else if((absDataPtr-1)->ctrl != DATA_SEWING) + { + if(num%2 == 0)//偶数次 从起始点开始 + { + evenNumberAddLock(result, absDataPtr - 1, needles, num); + addResew(result, absDataPtr - 1, DATA_SEWING); + isNeedOriginPoint = false; + } + else //奇数次 从中间点点开始 + { + //把上一针删了 + result.remove(result.size() - sizeof(DsAbsItem), sizeof(DsAbsItem)); + oddNumberAddLock(result, absDataPtr - 1, needles, num); + addResew(result, absDataPtr - 1, DATA_SEWING); + isNeedOriginPoint = false; + } + } + //下一针不为缝纫 结尾加固 + else if(i < stepSize-1 && (absDataPtr+1)->ctrl != DATA_SEWING) + { + + } + else + { + break; + } + } + break; + } + while(0); + + if(isNeedOriginPoint) + addResew(result, absDataPtr, absDataPtr->ctrl, false); + absDataPtr++; + } + return result; +} + +//密针加固方式 +QByteArray EmbData::thickenReinforce(u8 needles, u8 num, DsAbsItem *absDataPtr, int stepSize) +{ + if(needles == 0 && num == 0){}//为了去掉编译警告 + QByteArray result; + for(int i = 0; i < stepSize; i++) + { + + absDataPtr++; + } + + return result; +} + +//加回针或者锁针 +void EmbData::addResew(QByteArray &data, DsAbsItem *ptr, u8 ctrl ,bool resewFlag) +{ + DsAbsItem item; + memset(&item,0,sizeof(DsAbsItem)); + item.ctrl = ctrl; + item.ax = ptr->ax; + item.ay = ptr->ay; + item.ar = ptr->ar; + if(resewFlag) + item.attr = ptr->attr | ATTR_RESEW; + else + item.attr = ptr->attr; + data.append((char*)(&item), sizeof(DsAbsItem)); +} + +void EmbData::evenNumberAddLock(QByteArray &data, DsAbsItem *absDataPtr,int lockNeedles, int num) +{ + if(num < 0 || num % 2 !=0) + { + return; + } + QList listPoint; + //添加原点 + DsAbsItem * dataPtr = absDataPtr; + if(DATA_SEWING == absDataPtr->ctrl) //第一针 + { + addResew(data, dataPtr, dataPtr->ctrl); + } + //记录要添加的点 + for(int j = 0; j < lockNeedles; j++) + { + dataPtr++; + listPoint.append(dataPtr); + } + + //循环添加 + for(int count = num/2; count > 0; count--) + { + //正向添加 + for(DsAbsItem * ptr : listPoint) + { + addResew(data, ptr, DATA_SEWING); + } + //反向加回 + for(int k = listPoint.size(); k > 0; k--) + { + //端点不加 因为正向的时候加过了 + if(k == listPoint.size()) + continue; + DsAbsItem * ptr = listPoint.at(k-1); + addResew(data, ptr, DATA_SEWING); + } + + if(count > 1) + addResew(data, absDataPtr, DATA_SEWING); + } +} + +void EmbData::oddNumberAddLock(QByteArray &data, DsAbsItem *absDataPtr, int lockNeedles, int num) +{ + QList listPoint; + DsAbsItem * dataPtr = absDataPtr; + + if(absDataPtr->ctrl != DATA_SEWING) + { + dataPtr --; + } + + //记录要添加的点 + for(int j = 0; j < lockNeedles; j++) + { + dataPtr++; + listPoint.append(dataPtr); + } + + if(absDataPtr->ctrl != DATA_SEWING) + { + addResew(data, dataPtr++, absDataPtr->ctrl, true); + absDataPtr--; + } + //反向加回 + for(int k = listPoint.size(); k > 0; k--) + { + DsAbsItem * ptr = listPoint.at(k-1); + addResew(data, ptr, DATA_SEWING, true); + } + + //此时可以当作偶数处理 + int tempNum = num - 1; + evenNumberAddLock(data, absDataPtr, lockNeedles, tempNum); +} + +//角度修正 +int EmbData::angleCorrection(s16 oft) +{ + if (oft == 0) + { + return 0; + } + + double dx, dy, dr; + double ax, ay, ar; + double bdx, bdy; + bdx = bdy = 0; + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem * secondPtr = NULL;//第二个点坐标指针 + + double addx,addy; + addx = addy = 0; + double s = 0; + + int firstY = 0;//花样第一点坐标 + + // 数据区 + for (int j = 0; j < stepsize; j++) + { + if (j == 0)//第一针 + { + dx = absDataPtr->ax; + dy = absDataPtr->ay; + dr = absDataPtr->ar; + firstY = absDataPtr->ay; + } + else + { + dx = absDataPtr->ax - ax; + dy = absDataPtr->ay - ay; + dr = absDataPtr->ar - ar; + } + + if (j == 1)//第二针 + { + secondPtr = absDataPtr; + } + + //判断夹角是否大于60度 + if(dr >= ANGLECORR || dr <= -ANGLECORR || j == stepsize - 1) + { + s = sqrt(bdx*bdx + bdy*bdy); + if(s == 0) + { + addx = 0; + addy = 0; + } + else + { + addx = bdx*oft/s; + addy = bdy*oft/s; + m_endPosX = addx; + m_endPosY = addy; + } + + absDataPtr--; + if(absDataPtr->ctrl == DATA_SEWING) + { + absDataPtr->ax += addx; + absDataPtr->ay += addy; + } + absDataPtr++; + } + + ax = absDataPtr->ax; + ay = absDataPtr->ay; + ar = absDataPtr->ar; + + bdx = dx; + bdy = dy; + + absDataPtr++; + } + + DsAbsItem *datItem = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)+sizeof(DsAbsItem)*(stepsize-1)); + + DsAbsItem insertItem; + memcpy(&insertItem,datItem,sizeof(DsAbsItem)); + + int mdy = secondPtr->ay - firstY; + double modY = datItem->ay + mdy; + + insertItem.ctrl = DATA_SEWING; + double tar = atan2((modY-datItem->ay),(secondPtr->ax-datItem->ax)); + insertItem.ar = (tar * 10000+0.5*(tar>0?1:-1)); + insertItem.ax = secondPtr->ax; + insertItem.ay = modY; + m_embAbsData.insert(sizeof(DataDs16FileHead)+sizeof(DsAbsItem)*(stepsize-1),(char*)(&insertItem),sizeof(DsAbsItem));//插入回针 + m_embAbsData.remove(sizeof(DataDs16FileHead),sizeof(DsAbsItem));//去掉第一针 + + //重新计算角度 + size = m_embAbsData.size(); + datasize = size - sizeof(DataDs16FileHead); + stepsize = datasize/sizeof(DsAbsItem); + DsAbsItem * ptr = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead)); + double prex = 0; + double prey = 0; + double curx = 0; + double cury = 0; + double ddx = 0; + double ddy = 0; + for(int i = 0; i < stepsize; i++) + { + curx = ptr->ax; + cury = ptr->ay; + ddx = curx - prex; + ddy = cury - prey; + double tar = atan2(ddy,ddx); + ptr->ar = (tar * 10000+0.5*(tar>0?1:-1)); + prex = curx; + prey = cury; + ptr++; + } + + return 1; +} + +int EmbData::angleCorrectionXY(s32 px, s32 nx, s32 py, s32 ny) +{ + if(px == 0 && nx == 0 && py == 0 && ny == 0) + { + return -1; + } + double dx, dy, dr; + double ax, ay, ar; + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + QByteArray ary; + ary.clear(); + DataDs16FileHead *head = (DataDs16FileHead *)m_embAbsData.data(); + ary.append((char*)head,sizeof(DataDs16FileHead)); + + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + //记录第一个点的绝对坐标值 + DsAbsItem firstAbsDataPtr; + memcpy(&firstAbsDataPtr,(char*)pData,sizeof(DsAbsItem)); + + //记录第二个点的绝对坐标值 + DsAbsItem secAbsDataPtr; + + // 过滤掉坐标值及属性相同的针步,只留一个,避免空针(不拟合针步时空针会使补偿异常) + DsAbsItem * lstAbsDataPtr = absDataPtr; + for (int j = 0; j < stepsize; j++) + { + if(j == 0) + { + //注释掉这行代码,为了去掉第一针,为了结束时加补偿,再缝下一个图元时能直接回到第二个点,而不是第一个点,只有缝制第一个图元时会少一针,其他地方正常,没有影响 + //ary.append((char*)absDataPtr,sizeof(DsAbsItem)); + } + else + { + if(lstAbsDataPtr->ax == absDataPtr->ax && lstAbsDataPtr->ay == absDataPtr->ay && + lstAbsDataPtr->ctrl == absDataPtr->ctrl && lstAbsDataPtr->attr == absDataPtr->attr && + lstAbsDataPtr->action == absDataPtr->action) + { + } + else + { + ary.append((char*)absDataPtr,sizeof(DsAbsItem)); + } + } + + if(j == 1) + { + secAbsDataPtr.ax = absDataPtr->ax; + secAbsDataPtr.ay = absDataPtr->ay; + } + lstAbsDataPtr = absDataPtr; + absDataPtr++; + } + + m_embAbsData.clear(); + m_embAbsData.append(ary); + size = m_embAbsData.size(); + datasize = size - sizeof(DataDs16FileHead); + stepsize = datasize/sizeof(DsAbsItem); + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + ary.clear(); + head = (DataDs16FileHead *)(m_embAbsData.data()); + ary.append((char*)head,sizeof(DataDs16FileHead)); + + double addx,addy; + addx = addy = 0; + + int maxX = S32_MIN; + int maxY = S32_MIN; + int minY = S32_MAX; + int minX = S32_MAX; + + // 数据区 + for (int j = 0; j < stepsize; j++) + { + if (j == 0)//第一针 + { + dx = absDataPtr->ax; + dy = absDataPtr->ay; + dr = absDataPtr->ar; + } + else + { + dx = absDataPtr->ax - ax; + dy = absDataPtr->ay - ay; + dr = absDataPtr->ar - ar; + } + + if (absDataPtr->ax > maxX) + { + maxX = absDataPtr->ax; + } + if (absDataPtr->ax < minX) + { + minX = absDataPtr->ax; + } + if (absDataPtr->ay > maxY) + { + maxY = absDataPtr->ay; + } + if (absDataPtr->ay < minY) + { + minY = absDataPtr->ay; + } + + //判断夹角是否大于60度或小于-60度 + if(dr >= ANGLECORR || dr <= -ANGLECORR) + { + if(dx > 0) + { + addx = 0 - nx; + } + else if(dx == 0) + { + DsAbsItem * prePtr = absDataPtr-1; + double prex = prePtr->ax; + while(prex == absDataPtr->ax) + { + prePtr--; + prex = prePtr->ax; + if(prePtr == pData) + { + break; + } + } + double cx = prex - absDataPtr->ax; + if(cx < 0) + { + addx = px; + } + else + { + addx = 0 - nx; + } + } + else + { + addx = px; + } + + if(dy > 0) + { + addy = py; + } + else if(dy == 0) + { + DsAbsItem * prePtr = absDataPtr-1; + double prey = prePtr->ay; + while(prey == absDataPtr->ay) + { + prePtr--; + prey = prePtr->ay; + if(prePtr == pData) + { + break; + } + } + double cy = prey - absDataPtr->ay; + if(cy < 0) + { + addy = py; + } + else + { + addy = 0 - ny; + } + } + else + { + addy = 0 - ny; + } + + absDataPtr--; +// int ccx = absDataPtr->ax; +// int ccy = absDataPtr->ay; +// DsAbsItem * temp = absDataPtr - 1; +// ccx = ccx - temp->ax; +// ccy = ccy - temp->ay; +// addx += ccx; +// addy += ccy; + + if(absDataPtr->ctrl == DATA_SEWING) + { +// absDataPtr->ax += addx; +// absDataPtr->ay += addy; + + DsAbsItem item; + memcpy((char*)&item,(char*)absDataPtr,sizeof(DsAbsItem)); + + double xyLen = sqrt((addx/100.0*addx/100.0)*10000.0+ (addy/100.0*addy/100.0)*10000.0); + if(xyLen > 200)//大于2毫米 + { + double dx{0},dy{0}; + double cdx{0},cdy{0}; + + //分割针步 + double splitVal = 200.0;//分割针步为200 + + s32 stepNum = xyLen / splitVal;//拆分几步 + double lastStep = (double)((int)xyLen % (int)splitVal); + double addStep = lastStep / stepNum; + + for(int m = 0; m < stepNum; m++) + { + double stepX = 0; + double stepY = 0; + + stepX = addx * splitVal / xyLen + addx * addStep / xyLen; + stepY = addy * splitVal / xyLen + addy * addStep / xyLen; + + dx = qRound(stepX);//四舍五入 + dy = qRound(stepY); + + if (m == stepNum-1) + { + //最后一针,消除累计误差 + dx = addx - cdx; + dy = addy - cdy; + } + + cdx += dx; + cdy += dy; + +// item.ax = temp->ax + cdx; +// item.ay = temp->ay + cdy; + item.ax = absDataPtr->ax + cdx; + item.ay = absDataPtr->ay + cdy; + + int rsize = ary.size(); + DsAbsItem tmp; + memcpy(&tmp,ary.data()+rsize-sizeof(DsAbsItem),sizeof(DsAbsItem)); + +// if(m == 0) +// { +// ary.remove(rsize-sizeof(DsAbsItem),sizeof(DsAbsItem)); +// } + ary.append((char*)&item,sizeof(DsAbsItem)); + } + } + else + { + item.ax = absDataPtr->ax + addx; + item.ay = absDataPtr->ay + addy; + +// int rsize = ary.size(); +// ary.remove(rsize-sizeof(DsAbsItem),sizeof(DsAbsItem)); + ary.append((char*)&item,sizeof(DsAbsItem)); + } + } + absDataPtr++; + } + + ax = absDataPtr->ax; + ay = absDataPtr->ay; + ar = absDataPtr->ar; + + ary.append((char*)absDataPtr,sizeof(DsAbsItem)); + absDataPtr++; + } + + DsAbsItem *tempPtr = (DsAbsItem *)(ary.data() + ary.size() - sizeof(DsAbsItem)); + //让结束后再回到起点位置上,避免越缝越偏 + DsAbsItem addPtr; + memcpy(&addPtr,&firstAbsDataPtr,sizeof(DsAbsItem)); + addPtr.ax = tempPtr->ax + (secAbsDataPtr.ax - firstAbsDataPtr.ax); + addPtr.ay = tempPtr->ay + (secAbsDataPtr.ay - firstAbsDataPtr.ay); + + pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + + int idx = 0; + while(tempPtr->ctrl != DATA_SEWING) + { + tempPtr--; + if(tempPtr == pData) + { + return -1; + } + idx++; + } + + ary.insert(ary.size() - sizeof(DsAbsItem)*idx, (char*)&addPtr, sizeof(DsAbsItem)); + + m_embAbsData.clear(); + m_embAbsData.append(ary); + + //重新计算角度 + size = m_embAbsData.size(); + datasize = size - sizeof(DataDs16FileHead); + stepsize = datasize/sizeof(DsAbsItem); + DsAbsItem * ptr = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead)); + double prex = 0; + double prey = 0; + double curx = 0; + double cury = 0; + double ddx = 0; + double ddy = 0; + for(int i = 0; i < stepsize; i++) + { + curx = ptr->ax; + cury = ptr->ay; + ddx = curx - prex; + ddy = cury - prey; + double tar = atan2(ddy,ddx); + ptr->ar = (tar * 10000+0.5*(tar>0?1:-1)); + prex = curx; + prey = cury; + ptr++; + } + + return 0; +} + +//按固定针步重新拟合(用户可设置的参数,暂未用到) +void EmbData::reFitByStep(s32 stepLen) +{ + QList lineList; + lineList.clear(); + + int stepLength = stepLen;//参数(300-800 单位0.01mm) + + LineItem item; + item.absItemList.clear(); + + int dr = 0; + unsigned char ctrl; + double prer = 0; + + double ax, ay, ar; + ax = ay = ar = 0; + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + //添加线段集合(夹角大于某个值时为新的一段线段) + int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead)); + prer = dataBeg->ar; + for (int i = 0; i < stepsize; i++) + { + ctrl = dataBeg->ctrl; + dr = dataBeg->ar - prer; + + unsigned char nctrl,bctrl; + if(i == stepsize-1) + { + nctrl = ctrl; + } + else + { + dataBeg++; + nctrl = dataBeg->ctrl;//下一针步属性 + dataBeg--; + } + + if(i == 0) + { + bctrl = ctrl; + } + else + { + dataBeg--; + bctrl = dataBeg->ctrl;//上一针步属性 + dataBeg++; + } + + if(ctrl != DATA_SEWING) + { + item.absItemList.append(*dataBeg); + } + + //上一针非缝纫属性且当前针为缝纫属性 + if(bctrl != DATA_SEWING && ctrl == DATA_SEWING) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*dataBeg); + } + //下一针非缝纫针步与当前针为缝纫针步 + else if(nctrl != DATA_SEWING && ctrl == DATA_SEWING) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*dataBeg); + } + //上一针为缝纫针步与当前针非缝纫针步 + else if(bctrl == DATA_SEWING && ctrl != DATA_SEWING) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*dataBeg); + } + //下一针为缝纫针步与当前针非缝纫针步 + else if(nctrl == DATA_SEWING && ctrl != DATA_SEWING) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*dataBeg); + } + else if(ctrl == DATA_SEWING) + { + double angle = dr / 10000.0 * (180.0 / PI); + if(angle > 30 || angle < -30)//新的一条线段(30度为分界) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*dataBeg); + } + else + { + item.absItemList.append(*dataBeg); + } + } + prer = dataBeg->ar; + dataBeg++; + } + + //开始重置针步(绝对坐标的线段集合) + QByteArray nabsData; + nabsData.clear(); + double cx,cy,cr; + cx = cy = cr = 0; + int lSize = lineList.size(); + for(int j = 0; j < lSize; j++) + { + int pSize = lineList[j].absItemList.size(); + for(int m = 0; m < pSize; m++) + { + memset(&absItem,0,sizeof(DsAbsItem)); + absItem = lineList[j].absItemList[m]; + + ctrl = absItem.ctrl; + //absItem.ax = absItem.ax - minX; + //absItem.ay = absItem.ay - minY; + ax = absItem.ax; + ay = absItem.ay; + ar = absItem.ar; + + if(ctrl != DATA_SEWING) + { + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + continue; + } + if(m == 0) + { + cx = ax; + cy = ay; + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + } + if(m == pSize - 1 && pSize > 1) + { + //最后一步如果超出长度就均分 + int pos = nabsData.size()-sizeof(DsAbsItem); + DsAbsItem * litem = (DsAbsItem *)((nabsData.data()+pos)); + + double curX = absItem.ax; + double curY = absItem.ay; + + double preX = litem->ax; + double preY = litem->ay; + + double ldis = sqrt(((curX-preX)/100.0*(curX-preX)/100.0)*10000.0+((curY-preY)/100.0*(curY-preY)/100.0)*10000.0); + if(ldis > stepLength) + { + DsAbsItem addItem; + memset(&addItem,0,sizeof(DsAbsItem)); + addItem = absItem; + + if(litem->ay == absItem.ay)//y相同 + { + addItem.ay = absItem.ay; + addItem.ax = (absItem.ax+litem->ax)/2; + + nabsData.append((char*)&addItem,sizeof(DsAbsItem)); + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + break; + } + else if(litem->ax == absItem.ax)//x相同 + { + addItem.ax = absItem.ax; + addItem.ay = (absItem.ay+litem->ay)/2; + + nabsData.append((char*)&addItem,sizeof(DsAbsItem)); + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + break; + } + else + { + double k = ((double)(absItem.ay-litem->ay))/((double)(absItem.ax-litem->ay)); + double cdis = ldis / 2; + double r = atan(k); + double x = cdis * cos(r); + double y = cdis * sin(r); + + addItem.ax = litem->ax + x; + addItem.ay = litem->ay + y; + nabsData.append((char*)&addItem,sizeof(DsAbsItem)); + + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + break; + } + } + else + { + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + break; + } + } + double dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0); + while(dis > stepLength) + { + QPoint firstPoint(0,0);//直线第一个点 + if((m-1) >= 0) + { + // firstPoint.setX(lineList[j].absItemList[m-1].ax-minX); + // firstPoint.setY(lineList[j].absItemList[m-1].ay-minY); + firstPoint.setX(lineList[j].absItemList[m-1].ax); + firstPoint.setY(lineList[j].absItemList[m-1].ay); + } + + QPoint secondPoint;//直线第二个点 + secondPoint.setX(ax); + secondPoint.setY(ay); + + QPoint circlePoint;//圆心 + circlePoint.setX(cx); + circlePoint.setY(cy); + + QPoint p; + if(secondPoint.x()-firstPoint.x() == 0) + { + p.setX(secondPoint.x()); + //int y = (secondPoint.y()/stepLength)*stepLength; + //int y = (secondPoint.y()+firstPoint.y())/2; + //取出上一点的坐标 + int pos = nabsData.size()-sizeof(DsAbsItem); + DsAbsItem * litem = (DsAbsItem *)((nabsData.data()+pos)); + int y = 0; + if(litem->ay >= secondPoint.y()) + { + y = litem->ay - stepLength; + } + else + { + y = litem->ay + stepLength; + } + + p.setY(y); + + cx = p.x(); + cy = p.y(); + + if(cx < 0 || cy < 0) + { + //qDebug()<= (stepLength-10)) + { + bl3 = true; + } + + if(bl3) + { + if(bl1 == true && bl2 == true) + { + double dis1 = sqrt(((ax-x1)/100.0*(ax-x1)/100.0)*10000.0+((ay-y1)/100.0*(ay-y1)/100.0)*10000.0); + double dis2 = sqrt(((ax-x2)/100.0*(ax-x2)/100.0)*10000.0+((ay-y2)/100.0*(ay-y2)/100.0)*10000.0); + if(dis1 > dis2) + { + cx = x2; + cy = y2; + } + else + { + cx = x1; + cy = y1; + } + + absItem.ax = cx; + absItem.ay = cy; + nabsData.append((char*)&absItem,sizeof(DsAbsItem)); + + dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0); + } + else + { + if(bl1) + { + p.setX(x1); + p.setY(y1); + } + else if(bl2) + { + p.setX(x2); + p.setY(y2); + } + else + { + qDebug()<<"bl1&bl2=false"; + break; + } + + cx = p.x(); + cy = p.y(); + + if(cx < 0 || cy < 0) + { + //qDebug()<dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数 + m_pEmbDs16Head->itemNums = stepsize; // 数据项个数 + m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和 + m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和 + m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid = + + m_embAbsData.clear(); + m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead)); + m_embAbsData.append(nabsData); +} + +#define MERGEANGLE PI/180*70*10000 //70度 +void EmbData::reFitLine(s32 stepLen) +{ + QList lineList; + lineList.clear(); + + double stepLength = stepLen;//参数(200-800 单位0.01mm) + if(stepLength <= 0) + { + return; + } + + LineItem item; + item.absItemList.clear(); + + int dr = 0; + double prer = 0; + DsAbsItem preItem; + memset(&preItem,0,sizeof(DsAbsItem)); + s16 addOftFlag = 0; + s16 addSewFlag = 0; + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + //添加线段集合(夹角大于某个值时为新的一段线段) + int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + memcpy((char*)m_pEmbDs16Head,m_embAbsData.data(),sizeof(DataDs16FileHead)); + DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead)); + prer = dataBeg->ar; + for (int i = 0; i < stepsize; i++) + { + dr = dataBeg->ar - prer; + + while (dr < -PI10000) + { + dr += PI20000; + } + while (dr > PI10000) + { + dr -= PI20000; + } + + if(dataBeg->ctrl == DATA_OFFSET) + { + if(item.absItemList.size() > 0) + { + lineList.append(item); + } + item.absItemList.clear(); + + item.absItemList.append(*dataBeg); + lineList.append(item); + item.absItemList.clear(); + } + else if(dataBeg->ctrl != DATA_SEWING) + { + if(addSewFlag == 1) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*(dataBeg-1)); + addSewFlag = 0; + } + item.absItemList.append(*dataBeg); + addOftFlag = 1; + } + else + { + addSewFlag = 1; + if(addOftFlag == 1) + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*(dataBeg-1)); + item.absItemList.append(*dataBeg); + addOftFlag = 0; + } + if((abs(dr) > MERGEANGLE))//新的一条线段 + { + lineList.append(item); + item.absItemList.clear(); + item.absItemList.append(*(dataBeg-1)); + item.absItemList.append(*dataBeg); + } + else + { + item.absItemList.append(*dataBeg); + } + } + + prer = dataBeg->ar; + dataBeg++; + } + + //开始重置针步(绝对坐标的线段集合) + QByteArray nabsData; + nabsData.clear(); + QList outList; + + int lSize = lineList.size(); + for(int i = 0; i < lSize; i++) + { + outList.clear(); + + int pSize = lineList[i].absItemList.size(); + if(pSize == 1)//只有一个点 + { + nabsData.append((char*)&lineList[i].absItemList[0],sizeof(DsAbsItem)); + } + else + { + getCurvePointFillLine(lineList[i].absItemList,stepLength,outList); + //从第二段开始起始点不向绝对坐标中添加,如果添加会出现空针步 + int idx = 0; + if(i > 0) + { + idx = 1; + } + for(int m = idx; m < outList.size(); m++) + { + nabsData.append((char*)(&outList[m]), sizeof(DsAbsItem)); + } + } + } + + //重新计算ar + stepsize = nabsData.size() / sizeof(DsAbsItem); + if(stepsize <= 0) + { + return; + } + + //如果最后一针不为结束码,则添加结束码,ax和ay是最后一针的 + DsAbsItem dsAbsItem; + memcpy(&dsAbsItem,nabsData.data()+(nabsData.size() - sizeof(DsAbsItem)),sizeof(DsAbsItem)); + if(dsAbsItem.ctrl != DATA_END && dsAbsItem.ctrl != DATA_NULL) + { + dsAbsItem.ctrl = DATA_END; + nabsData.append((char*)(&dsAbsItem), sizeof(DsAbsItem)); + stepsize++; + } + + DsAbsItem * absDataPtr = (DsAbsItem *)(nabsData.data()); + + double minX, maxX, minY, maxY; + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + double prex,prey,curx,cury,dx,dy; + prex = prey = curx = cury = dx = dy = 0; + + prex = absDataPtr->ax; + prey = absDataPtr->ay; + + for (int i = 0; i < stepsize; i++) + { + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + dx = curx - prex; + dy = cury - prey; + + double tar = atan2(dy,dx); + absDataPtr->ar = (tar*10000+0.5*(tar>0?1:-1)); + // qDebug() <<"dx dy " << dx << " /"<< dy << " index(absDataPtr->ar) : " << i << " : "<< absDataPtr->ar; + if(curx > maxX) + { + maxX = curx; + } + if(curx < minX) + { + minX = curx; + } + + if(cury > maxY) + { + maxY = cury; + } + if(cury < minY) + { + minY = cury; + } + + prex = curx; + prey = cury; + + absDataPtr++; + } + + //修改绝对坐标数据 + m_pEmbDs16Head->dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数 + m_pEmbDs16Head->itemNums = stepsize; // 数据项个数 + m_pEmbDs16Head->maxX = maxX; + m_pEmbDs16Head->minX = minX; + m_pEmbDs16Head->maxY = maxY; + m_pEmbDs16Head->minY = minY; + qDebug() << "-------- m_pEmbDs16Head->maxY = maxY;" << m_pEmbDs16Head->maxY ; + m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和 + m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和 + m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid = + + m_embAbsData.clear(); + m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead)); + m_embAbsData.append(nabsData); + + m_ritStepSize = stepLen; +} + +void EmbData::reFitLineDoubleHead(s32 stepLen) +{ + QList lineList; + lineList.clear(); + + double stepLength = stepLen;//参数(200-800 单位0.01mm) + if(stepLength <= 0) + { + return; + } + + LineItem item; + item.absItemList.clear(); + + int dr = 0; + double prer = 0; + DsAbsItem preItem; + memset(&preItem,0,sizeof(DsAbsItem)); + + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + //添加线段集合(夹角大于某个值时为新的一段线段) + int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + memcpy((char*)m_pEmbDs16Head,m_embAbsData.data(),sizeof(DataDs16FileHead)); + DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead)); + prer = dataBeg->ar; + for (int i = 0; i < stepsize; i++) + { + dr = dataBeg->ar - prer; + + while (dr < -PI10000) + { + dr += PI20000; + } + while (dr > PI10000) + { + dr -= PI20000; + } + + //只要遇到左机头偏移或右机头偏移,就添加到一段新的线段中 + if(dataBeg->ctrl == DATA_OFFSET || dataBeg->ctrl == DATA_OFFSET_SEC) + { + if(item.absItemList.size() > 0) + { + lineList.append(item); + } + item.absItemList.clear(); + + item.absItemList.append(*dataBeg); + lineList.append(item); + item.absItemList.clear(); + } + //只要遇到剪线码,就添加到一段新的线段中 + else if(dataBeg->ctrl == DATA_CUTTRD || dataBeg->ctrl == DATA_SYNC_CUTTER || dataBeg->ctrl == DATA_CUTTER_SEC) + { + if(item.absItemList.size() > 0) + { + lineList.append(item); + } + item.absItemList.clear(); + + item.absItemList.append(*dataBeg); + lineList.append(item); + item.absItemList.clear(); + } + else + { + if((abs(dr) > MERGEANGLE))//新的一条线段 + { + if(item.absItemList.size() > 0) + { + lineList.append(item); + } + item.absItemList.clear(); + + DsAbsItem * preDataBeg = dataBeg - 1; + if(preDataBeg->ctrl != DATA_OFFSET_SEC) + { + if(preDataBeg->ctrl == dataBeg->ctrl || + (dataBeg->ctrl == DATA_SYNCSEW || dataBeg->ctrl == DATA_MIRROR_SEC || + dataBeg->ctrl == DATA_SYNCOFST || dataBeg->ctrl == DATA_MIRROR_OFT_SEC)) + { + item.absItemList.append(*preDataBeg); + } + } + else + { + DsAbsItem * preDataBeg2 = dataBeg - 2; + if(preDataBeg2->ctrl != DATA_OFFSET) + { + if(preDataBeg2->ctrl == dataBeg->ctrl || + (dataBeg->ctrl == DATA_SYNCSEW || dataBeg->ctrl == DATA_MIRROR_SEC || + dataBeg->ctrl == DATA_SYNCOFST || dataBeg->ctrl == DATA_MIRROR_OFT_SEC)) + { + item.absItemList.append(*preDataBeg2); + } + } + } + item.absItemList.append(*dataBeg); + } + else + { + item.absItemList.append(*dataBeg); + } + } + + prer = dataBeg->ar; + dataBeg++; + } + + if(item.absItemList.size() > 0) + { + lineList.append(item); + } + + //开始重置针步(绝对坐标的线段集合) + QByteArray nabsData; + nabsData.clear(); + QList outList; + + int lSize = lineList.size(); + for(int i = 0; i < lSize; i++) + { + outList.clear(); + + int pSize = lineList[i].absItemList.size(); + if(pSize == 1)//只有一个点 + { + nabsData.append((char*)&lineList[i].absItemList[0],sizeof(DsAbsItem)); + } + else + { + // for(int j = 0; j < lineList[i].absItemList.size(); j++) + // { + // nabsData.append((char*)&lineList[i].absItemList[j],sizeof(DsAbsItem)); + // } + + getCurvePointFillLine(lineList[i].absItemList,stepLength,outList); + //从第二段开始起始点不向绝对坐标中添加,如果添加会出现空针步 + int idx = 0; + if(i > 0) + { + idx = 1; + } + for(int m = idx; m < outList.size(); m++) + { + nabsData.append((char*)(&outList[m]), sizeof(DsAbsItem)); + } + } + } + + //重新计算ar + stepsize = nabsData.size() / sizeof(DsAbsItem); + if(stepsize <= 0) + { + return; + } + + //如果最后一针不为结束码,则添加结束码,ax和ay是最后一针的 + DsAbsItem dsAbsItem; + memcpy(&dsAbsItem,nabsData.data()+(nabsData.size() - sizeof(DsAbsItem)),sizeof(DsAbsItem)); + if(dsAbsItem.ctrl != DATA_END && dsAbsItem.ctrl != DATA_NULL) + { + dsAbsItem.ctrl = DATA_END; + nabsData.append((char*)(&dsAbsItem), sizeof(DsAbsItem)); + stepsize++; + } + + DsAbsItem * absDataPtr = (DsAbsItem *)(nabsData.data()); + + double minX, maxX, minY, maxY; + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + double prex,prey,curx,cury,dx,dy; + prex = prey = curx = cury = dx = dy = 0; + + prex = absDataPtr->ax; + prey = absDataPtr->ay; + + for (int i = 0; i < stepsize; i++) + { + curx = absDataPtr->ax; + cury = absDataPtr->ay; + + dx = curx - prex; + dy = cury - prey; + + double tar = atan2(dy,dx); + absDataPtr->ar = (tar*10000+0.5*(tar>0?1:-1)); + // qDebug() <<"dx dy " << dx << " /"<< dy << " index(absDataPtr->ar) : " << i << " : "<< absDataPtr->ar; + if(curx > maxX) + { + maxX = curx; + } + if(curx < minX) + { + minX = curx; + } + + if(cury > maxY) + { + maxY = cury; + } + if(cury < minY) + { + minY = cury; + } + + prex = curx; + prey = cury; + + absDataPtr++; + } + + //修改绝对坐标数据 + m_pEmbDs16Head->dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数 + m_pEmbDs16Head->itemNums = stepsize; // 数据项个数 + m_pEmbDs16Head->maxX = maxX; + m_pEmbDs16Head->minX = minX; + m_pEmbDs16Head->maxY = maxY; + m_pEmbDs16Head->minY = minY; + qDebug() << "-------- m_pEmbDs16Head->maxY = maxY;" << m_pEmbDs16Head->maxY ; + m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和 + m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和 + m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid = + + m_embAbsData.clear(); + m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead)); + m_embAbsData.append(nabsData); + + m_ritStepSize = stepLen; +} + +//移动起始点,左边,前边 +int EmbData::moveStartPoint(short left, short front) +{ + if(m_pEmbDs16Head == NULL){return -1;} + if(m_embDs16Data.size() <= 0){return -1;} + + m_pEmbDs16Head->anchorX += left; + m_pEmbDs16Head->anchorY += front; + m_pEmbDs16Head->beginX += left; + m_pEmbDs16Head->beginY += front; + + //将最大最小值写入文件头 + m_pEmbDs16Head->maxX += left; + m_pEmbDs16Head->minX += left; + m_pEmbDs16Head->maxY += front; + m_pEmbDs16Head->minY += front; + qDebug() << "-------- m_pEmbDs16Head->maxY += front;" << m_pEmbDs16Head->maxY ; + + m_maxX += left; + m_minX += left; + m_maxY += front; + m_minY += front; + memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead)); + + return 0; +} + +QByteArray & EmbData::lolaComp(s16 valuePos, s16 valueNeg, s16 valueZero) +{ + if(valuePos == 0 && valueNeg == 0 && valueZero == 0) + { + return m_embDs16Data; + } + + m_minY = S32_MAX; + m_maxY = S32_MIN; + + double compValPos = valuePos / 1000.0;//一米补偿量,单位mm + compValPos *= 100;//单位0.01mm + + double compValNeg = valueNeg / 1000.0;//一米补偿量,单位mm + compValNeg *= 100;//单位0.01mm + + double compValZero = valueZero / 1000.0;//一米补偿量,单位mm + compValZero *= 100;//单位0.01mm + + // ds16数据 + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + return m_embDs16Data; + } + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + return m_embDs16Data; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + return m_embDs16Data; + } + + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data()); + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + double actY = pDsHead->beginY; + m_minY = m_maxY = ds16DataPtr->dy; + + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + if(ds16DataPtr->dx > 0) + { + ds16DataPtr->dy += compValPos; + } + + if(ds16DataPtr->dx < 0) + { + ds16DataPtr->dy += compValNeg; + } + + if(ds16DataPtr->dx == 0) + { + ds16DataPtr->dy += compValZero; + } + + actY += ds16DataPtr->dy; + if(m_minY > actY) + { + m_minY = actY; + } + if(m_maxY < actY) + { + m_maxY = actY; + } + + ds16DataPtr++; + } + +#if(1) + //保存成ds16文件 + QString ds16FilePath = m_filePath + ".ds16"; + QFile file(ds16FilePath); + + if(file.exists())//存在ds16文件 + { + QFile::remove(ds16FilePath); + } + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << m_filePath; + return m_embDs16Data; + } + else + { + file.write(m_embDs16Data); + file.close(); + } +#endif + + return m_embDs16Data; +} + +void EmbData::setLastStepAngle() +{ + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return; + } + + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem * preAbsDataPtr = NULL; + DsAbsItem * lastAbsDataPtr = NULL; + + int rsize = m_embAbsData.size(); + DsAbsItem tmp; + memcpy(&tmp,m_embAbsData.data()+rsize-2*sizeof(DsAbsItem),sizeof(DsAbsItem)); + + int firstFlag = 0; + int dx = 0; + int dy = 0; + + for (int j = 0; j < stepsize; j++) + { + if(j == 0) + { + preAbsDataPtr = absDataPtr; + } + else + { + if(firstFlag == 0) + { + dx = absDataPtr->ax - preAbsDataPtr->ax; + dy = absDataPtr->ay - preAbsDataPtr->ay; + firstFlag = 1; + } + } + + if(absDataPtr->ctrl == DATA_SEWING) + { + lastAbsDataPtr = absDataPtr; + } + absDataPtr++; + } + + //到下一版的第一针的角度变化 + if(lastAbsDataPtr != NULL) + { + double tar = atan2(dy,dx); + lastAbsDataPtr->ar = 0 + (tar * 10000+0.5*(tar>0?1:-1));//0度为基准,再加上第一针的角度变化 + } + + memcpy(&tmp,m_embAbsData.data()+rsize-2*sizeof(DsAbsItem),sizeof(DsAbsItem)); + return; +} + +void EmbData::moveDataBeginPonit(s32 left, s32 front) +{ + if((u32)m_embAbsData.size() > sizeof(DataDs16FileHead)){ + DataDs16FileHead *dhead = (DataDs16FileHead *)(m_embAbsData.data()); + dhead->beginX += left; + dhead->beginY += front; + dhead->maxX += left; + dhead->minX += left; + dhead->maxY += front; + dhead->minY += front; + } +} + +void EmbData::appendAEmbAbsFile(QString filePath, QByteArray array, int mirror) +{ + m_filePath = filePath; + convertAbsDat(array,mirror);//是否镜像、旋转、缩放的转换 + m_embAbsData.clear(); + m_embAbsData.append(array); + m_editedflag = 1; +} + +void EmbData::setAbsDat(QByteArray & dat) +{ + m_embAbsData = dat; +} + +QByteArray & EmbData::getAbsDat(void) +{ + return m_embAbsData; +} + +int EmbData::getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & colorIdx, int & dr, int & ar, int & dxV, int & dyV) +{ + if (m_editedflag != 0) + { + createEmbDs16FromAbs(); + } + + posx = 0; + posy = 0; + colorIdx = 0; + dr = 0; + ar = 0; + + // 文件头 + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("m_embDs16Data data less then head size"); + return -1; + } + + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data()); + + int datasize = size - sizeof(DataDs16FileHead); + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + posx = pDsHead->beginX; + posy = pDsHead->beginY; + +// posx = 0; +// posy = 0; + + if (stitchIdx <= 0) + { + return 0; + } + + colorIdx = 1; + + if (stitchIdx > datasize) + { + stitchIdx = datasize; + } + + int dx, dy; + u8 ctrl, attr; + + for (int i = 0; i < stitchIdx; i++) + { + ctrl = ds16DataPtr->ctrl; + attr = ds16DataPtr->attr; + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + dr = ds16DataPtr->dr; + dxV = ds16DataPtr->dx; + dyV = ds16DataPtr->dy; + + if (ctrl == DATA_CHGND) + { + colorIdx++; + } + + if ((attr&0x80) != 0) + { + dx *= -1; + } + + if ((attr&0x40) != 0) + { + dy *= -1; + } + + posx += dx; + posy += dy; + ar += dr; + + ds16DataPtr++; + } + + return 0; +} + +//设置起始点 +void EmbData::setStartPosition(int x, int y) +{ + qDebug()<<__FUNCTION__; + if(m_pEmbDs16Head == NULL){ + qDebug()<< "(m_pEmbDs16Head == NULL)"; + return; + } + if(m_embDs16Data.size() <= 0){ + qDebug()<< "(m_embDs16Data.size() <= 0)"; + return; + } + + //旧的起始点坐标 + int oldBeginX = m_pEmbDs16Head->beginX; + int oldBeginY = m_pEmbDs16Head->beginY; + + m_pEmbDs16Head->beginX = x; + m_pEmbDs16Head->beginY = y; + + //新的起始点坐标与旧的起始点坐标的差值 + int cx = x - oldBeginX; + int cy = y - oldBeginY; + + //重新计算最大最小XY + double maxX = m_pEmbDs16Head->maxX + cx; + double minX = m_pEmbDs16Head->minX + cx; + double maxY = m_pEmbDs16Head->maxY + cy; + double minY = m_pEmbDs16Head->minY + cy; + + //将最大最小值写入文件头 + m_pEmbDs16Head->maxX = maxX; + m_pEmbDs16Head->minX = minX; + m_pEmbDs16Head->maxY = maxY; + m_pEmbDs16Head->minY = minY; + qDebug() << "--------m_pEmbDs16Head->maxY = maxY" << m_pEmbDs16Head->maxY ; + + //修复偶尔点击中间按钮花样消失的bug + m_maxX = maxX; + m_minX = minX; + m_maxY = maxY; + m_minY = minY; + + memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead)); + qDebug()<<"m_maxX"<beginX *= factorx; + pDsHead->beginY *= factory; + + // 数据缩放 + for (int j = 0; j < stepsize; j++) + { + double ax = absDataPtr->ax; + double ay = absDataPtr->ay; + + ax *= factorx; + ay *= factory; + + absDataPtr->ax = ax; + absDataPtr->ay = ay; + + absDataPtr++; + } + + m_editedflag = 1; + + return 1; +} + +int EmbData::setMirror(MirrorType mirror) +{ + int mirrorr = 0; + int mirrorrdir = 0; + + if(mirror == HorizontalMirror) + { + mirrorr = 1*PI*10000; + mirrorrdir = -1; + } + else if (mirror == VerticalMirror) + { + mirrorr = 2*PI*10000; + mirrorrdir = -1; + } + else if (mirror == BothMirror) + { + mirrorr = 1*PI*10000; + mirrorrdir = 1; + } + + // 文件头 + const QByteArray & ary = m_embAbsData; + if(!checkData(ary.size())) + { + return -1; + } + int stepsize = (ary.size() - sizeof(DataDs16FileHead))/sizeof(DsAbsItem); + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data()); + + int maxX = pDsHead->maxX; + int minX = pDsHead->minX; + int maxY = pDsHead->maxY; + int minY = pDsHead->minY; + int width = maxX - minX; //宽 + int height = maxY - minY; //高 + + //在最大最小xy中 对起始点进行镜像处理 + int bx = pDsHead->beginX; + int by = pDsHead->beginY; + //平移到原点 + bx -= minX; + by -= minY; + + //镜像 + if(mirror == HorizontalMirror || mirror == BothMirror) + pDsHead->beginX = (width - bx) + minX; + if(mirror == VerticalMirror || mirror == BothMirror) + pDsHead->beginY = (height - by) + minY; + + //beginR的旋转 + double br = pDsHead->beginR; + if (mirrorrdir > 0) + { + br = br + mirrorr; + } + else if (mirrorrdir < 0) + { + br = mirrorr - br; + } + while (br > 2*PI * 10000) + { + br -= 2*PI * 10000; + } + while (br < -2*PI * 10000) + { + br += 2*PI * 10000; + } + pDsHead->beginR = br; + + DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + + // 数据镜像 + for (int j = 0; j < stepsize; j++) + { + double ax = absDataPtr->ax; + double ay = absDataPtr->ay; + double ar = absDataPtr->ar; + + //平移到原点 + ax -= minX; + ay -= minY; + + //镜像 + if(mirror == HorizontalMirror || mirror == BothMirror) + absDataPtr->ax = (width - ax) + minX; + if(mirror == VerticalMirror || mirror == BothMirror) + absDataPtr->ay = (height - ay) + minY; + + if (mirrorrdir > 0) + { + ar = ar + mirrorr; + } + else if (mirrorrdir < 0) + { + ar = mirrorr - ar; + } + + while (ar > 2*PI * 10000) + { + ar -= 2*PI * 10000; + } + while (ar < -2*PI * 10000) + { + ar += 2*PI * 10000; + } + absDataPtr->ar = ar; + + absDataPtr++; + } + + m_editedflag = 1; + return 1; +} + +//flag :true代表顺时针方向 +int EmbData::setRotate90(bool flag) +{ + + // 文件头 + const QByteArray & ary = m_embAbsData; + if(!checkData(ary.size())) + { + return -1; + } + int stepsize = (ary.size() - sizeof(DataDs16FileHead))/sizeof(DsAbsItem); + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data()); + + int maxX = pDsHead->maxX; + int minX = pDsHead->minX; + int maxY = pDsHead->maxY; + int minY = pDsHead->minY; + int width = maxX - minX; //宽 + int height = maxY - minY; //高 + + int bx = pDsHead->beginX; + int by = pDsHead->beginY; + //平移到原点 + bx -= minX; + by -= minY; + + int tempX; + int tempY; + //旋转 + if(flag) + { + tempX = by; + tempY = width - bx; + } + else + { + tempX = height - by; + tempY = bx; + } + pDsHead->beginX = tempX + minX; + pDsHead->beginY = tempY + minY; + qDebug() << "__=++++++++++++++++++++++pDsHead->beginX" << pDsHead->beginX; + qDebug() << "__=++++++++++++++++++++++pDsHead->beginY" << pDsHead->beginY; + + DsAbsItem * absDataPtr = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + for (int j = 0; j < stepsize; j++) + { + double ax = absDataPtr->ax; + double ay = absDataPtr->ay; + + //平移到原点 + ax -= minX; + ay -= minY; + //旋转 + int rx, ry; + if(flag){ + rx = ay; + ry = width - ax; + } + else + { + rx = height - ay; + ry = ax; + } + //平移回 + absDataPtr->ax = rx + minX; + absDataPtr->ay = ry + minY; + absDataPtr++; + } + + m_editedflag = 1; + return 1; + +} + +/// +/// \brief //获得下一个图元的第一缝纫针步 +/// \param curIndex +/// \return +/// +int EmbData::getNextElementIndex(int curIndex) +{ + // ds16数据 + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return -1; + } + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = ds16DataPtr + curIndex; + + u8 curByte =ds16DataPtr->ctrl; //当前状态 + ds16DataPtr ++; + curIndex ++; + + int i = curIndex; + for (; i < stepsize; i++) + { + + if(curByte != DATA_SEWING) + { + if(ds16DataPtr->ctrl == DATA_SEWING) + break; + }else{ + if(ds16DataPtr->ctrl != DATA_SEWING) + curByte = ds16DataPtr->ctrl; + } + ds16DataPtr++; + } + return i; +} + +/// +/// \brief //上一个图元(当前为跨步时)或当前图元(当前为缝纫时)的第一缝纫针步 +/// \param curIndex +/// \return +/// +int EmbData::getPreOrThisElementIndex(int curIndex) +{ + // ds16数据 + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return -1; + } + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = ds16DataPtr + curIndex; + + u8 curByte =ds16DataPtr->ctrl; //当前状态 + ds16DataPtr--; + curIndex --; + + int i = curIndex; + + for (; i > 0; i--) + { + //如果当前是缝纫数据,找到其他的就返回下一针 + if(curByte == DATA_SEWING) + { + if(ds16DataPtr->ctrl != DATA_SEWING) + break; + }else{ + //找到其他的就返回下一针 + if(ds16DataPtr->ctrl == DATA_SEWING) + curByte = DATA_SEWING; + } + ds16DataPtr--; + } + return ++i; +} + +//------------------------------------------------- +// 分割切刀数据(裁床专用代码) +// +#define CUT_MINST_STP (5.0) // 拟合小针步,小于此值的针步将被合并,单位0.01mm +#define CUT_LINE_MIN_STP (20.0) // 直线最小步长,单位0.01mm +#define CUT_LINE_MAX_STP (800.0) // 直线最大步长,单位0.01mm + +#define CUT_ROUD_ANG (ANGLECORR) // 圆弧转角判断度数,单位:10000弧度 +#define CUT_ROUD_STP (10.0) // 圆弧补偿步长,单位0.01mm +#define CUT1_RADIUS (50.0) // 切刀1圆弧补偿半径,精度0.01mm +#define CUT2_RADIUS (50.0) // 切刀2圆弧补偿半径,精度0.01mm + +// 分割直线 (匀变步长 分割针步) +// 返回值: 增加的针数 +// posX1,posY1: 起点坐标 +// posX2,posY2: 起点坐标 +// stepMin: 最小分割针步大小 +// stepMax: 最大分割针步大小 + +// 分割直线 +int EmbData::splittingLine(double posX1, double posY1, + double posX2, double posY2, + int stepMin, int stepMax, + QByteArray &cutData, DsAbsItem item) +{ + int num = 0; // 增加的针步数 + if ((stepMin == 0) || (stepMax == 0)) + { + return -1; + } + + DsAbsItem absItem; + + // 线段长 + double len = sqrt((posX1-posX2)*(posX1-posX2)+(posY1-posY2)*(posY1-posY2)); + + if (len <= stepMin) + { + memcpy(&absItem,&item,sizeof(DsAbsItem)); + num++; + cutData.append((char*)(&absItem), sizeof(DsAbsItem)); // 中间数据 + } + else + {// 分割份数 + int n = (int)(len/stepMin + 0.5); + + int i,j ; + double add; + + j = stepMin; + add = 0; + for (i=0; i<(n/2);i++) + {// 扫描匀速点和降速点 + add += j; + j += stepMin; + + if (((add*2)>= len) || + (j >= stepMax) || + 0) + { + break; + } + } + + int n1 = i; // 匀速点 + int n2 = n-n1-2; // 减速点 + + j = 1; + add = 1; + + for (i=1; i<=n;i++) + { + if (i >= add) + { + add += j; + if (add > n) + { + add = n; + } + + if ((i >= n2) && (j > 2)) + { + j--; + } + else if (i < n1) + { + j++; + } + + + memcpy(&absItem,&item,sizeof(DsAbsItem)); + absItem.ax = posX1+(posX2-posX1)*i/n; + absItem.ay = posY1+(posY2-posY1)*i/n; + num++; + cutData.append((char*)(&absItem), sizeof(DsAbsItem)); // 中间数据 + } + } + } + + return num; +} + + +// 分割圆弧 +// 返回值: 增加的针数 +// posX1,posY1: 起点坐标 +// posX2,posY2: 起点坐标 +// xc,yc,r: 圆心,半径 +// dr1,dr2: 起点,终点角度 +// step: 分割针步大小 + +// 分割圆弧 +int EmbData::splittingArc(double posX1, double posY1, + double posX2, double posY2, + double xc, double yc, double r, + double dr1,double dr2,int step, + QByteArray &cutData, DsAbsItem item) +{ + int num = 0; + int dir = 1; + + // 弦长 + double len = sqrt((posX1-posX2)*(posX1-posX2)+(posY1-posY2)*(posY1-posY2)); + // 圆心角 + double k = (r*r+r*r-len*len)/(2*r*r); + if (k < -1) + { + k = -1; + } + else if (k > 1) + { + k = 1; + } + + double alph = acos(k); + + if (0) // 执行此代码生成大圆弧 + { + alph = PI*2 - alph; + } + + if (1) + {// 求旋转方向 + dr1 = dr1*-180/PI10000; + dr2 = dr2*-180/PI10000; + //qDebug()<<"bdr1="<<(dr1)<<",bdr2="<<(dr2); + + + do + {// 将dr1变换到整数 + if ((dr1 >= 0) && (dr1 < 360)) { break; } + else if (dr1 < 0) { dr1 += 360; } + else if (dr1 >= 360) { dr1 -= 360; } + }while(1); + + do + {// 将dr2变换到整数 + if ((dr2 >= 0) && (dr2 < 360)) { break; } + else if (dr2 < 0) { dr2 += 360; } + else if (dr2 >= 360) { dr2 -= 360; } + }while(1); + + + if (((dr1 <= 180) && (dr2 <= 180)) || + ((dr1 > 180) && (dr2 > 180)) || + 0 ) + { + if (dr1 < dr2) + { + dir = -1; // 逆时针(正转) + } + else + { + dir = 1; // 顺时针(反转) + } + } + else if ((dr1 > 180) && (dr2 <= 180)) + { + if ((dr1-180) > dr2) + { + dir = -1; // 逆时针(正转) + } + else + { + dir = 1; // 顺时针(反转) + } + } + else if ((dr1 <= 180) && (dr2 > 180)) + { + if ((dr1+180) > dr2) + { + dir = -1; // 逆时针(正转) + } + else + { + dir = 1; // 顺时针(反转) + } + } + // qDebug()<<"edr1="<<(int)(dr1+0.5)<<",edr2="<<(int)(dr2+0.5)<<",dir="< 1) || (fabs(lasty-posY2) > 1)) && + (i < (n-1)) && + 1) + {// 圆弧中间 增加降速抬刀标志 + absItem.attr |= 0x10; + } + num++; + cutData.append((char*)(&absItem), sizeof(DsAbsItem)); + + i++; + + if ((fabs(lastx-posX2) <= 1) && (fabs(lasty-posY2) <= 1)) + { + ex = posX2; + ey = posY2; + + memcpy(&absItem,&item,sizeof(DsAbsItem)); + absItem.ax = ex; + absItem.ay = ey; + + num++; + cutData.append((char*)(&absItem), sizeof(DsAbsItem)); + break; + } + } while(i < n); + + return num; +} + +// 偏心刀平板切割机补偿算法 +// 增加对比数据 +int EmbData::setCutcontrastData( ) +{ + int cutLineMaxStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMaxStp").toInt(); + if (cutLineMaxStp == 0) + { + cutLineMaxStp = 100; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double begX; // 起始点 + double begY; + + // 数据区 + { + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + // memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + // newstepnum++; + // cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + absDataPtr++; + } + } + + // 参考数据 + if (1) + { + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_OFFSET; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + {// 分割针步 + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_OFFSET; + newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay, + cutLineMaxStp, cutLineMaxStp, + cutAbsData, absItem); // 分割直线 + } + + begX = absDataPtr->ax; + begY = absDataPtr->ay; + } + absDataPtr++; + } + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 增加拐点数据 +int EmbData::setCutCornerStep() +{ + int cutRoudAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRoudAng").toInt(); + cutRoudAng = cutRoudAng * 10000 * PI / 18000; // 角度->10000弧度 + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double nf1r = 0; // 切刀1角度 + double nf2r = 0; // 切刀2角度 + + // 将数据中最后一段的角度赋值给起始角度 + for (int j = 0; j < stepsize; j++) + { + if (absDataPtr->ctrl == DATA_EKNIFE1) + {// 切刀1 角度 + nf1r= absDataPtr->ar; + } + else if (absDataPtr->ctrl == DATA_EKNIFE2) + {// 切刀2 角度 + nf2r= absDataPtr->ar; + } + absDataPtr++; + } + + absDataPtr = pData; //中间数据针步 + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absDataPtr->ctrl == DATA_EKNIFE1) + {// 切刀1 补偿 + double dr = abs(absDataPtr->ar - nf1r); + if (dr >= cutRoudAng) + {// 判断夹角 + absDataPtr--; // 前一针的位置(圆心) + double x = absDataPtr->ax; + double y = absDataPtr->ay; + + absDataPtr++; // 当前针 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ax = x; + absItem.ay = y; + absItem.attr |= 0x20; // 临时增加拐点标志 + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + nf1r = absDataPtr->ar; + } + else if (absDataPtr->ctrl == DATA_EKNIFE2) + {// 切刀2 补偿 + double dr = abs(absDataPtr->ar - nf2r); + if (dr >= cutRoudAng) + {// 判断夹角 + absDataPtr--; // 前一针的位置(圆心) + double x = absDataPtr->ax; + double y = absDataPtr->ay; + + absDataPtr++; // 当前针 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ax = x; + absItem.ay = y; + absItem.attr |= 0x20; // 临时增加拐点标志 + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + nf2r = absDataPtr->ar; + } + else + {// + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 保存当前针信息 + } + } + absDataPtr++; + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 偏心刀刀尖补偿(裁床专用代码) +int EmbData::setCutEccentricCompensation() +{ + int cut1Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut1Radius").toInt(); + int cut2Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut2Radius").toInt(); + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + // 数据区 + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absDataPtr->ctrl == DATA_EKNIFE1) + {// 切刀1 补偿 + double crt = cut1Radius*1.0; // 分割量 + double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + double cosr = (double)qCos(r); + double sinr = (double)qSin(r); + double tx = cosr * (crt*1.0); + double ty = sinr * (crt*1.0); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ax += tx; + absItem.ay += ty; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absDataPtr->ctrl == DATA_EKNIFE2) + {// 切刀2 补偿 + double crt = cut2Radius*1.0; // 分割量 + double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + double cosr = (double)qCos(r); + double sinr = (double)qSin(r); + double tx = cosr * (crt*1.0); + double ty = sinr * (crt*1.0); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ax += tx; + absItem.ay += ty; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + {// + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + } + absDataPtr++; + } + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 增加两端补偿 +// 输入 +int EmbData:: setCutAddCutterComption() +{ + //int cutRnf1Comp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnf1Comp").toInt(); + int cutRnf2Comp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnf2Comp").toInt(); + + if (cutRnf2Comp == 0) + { + return 0; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"3 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + + int begFlg = 0; + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + { + absDataPtr = pData; //中间数据针步 + for (int j = 0; j < stepsize;j++) + { + if ((j == 0) || + (absDataPtr->ctrl == DATA_OFFSET) || // 偏移 + (absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_DRAWING) || // 画笔 + 0 ) + {// 找到起点 + begFlg = 0; + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else + { + if (begFlg == 0) + {// 增加起始补偿数据 + begFlg = 1; // 起始点标志 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else + { + absDataPtr++; + if ((absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_OFFSET) || // 偏移 + (absDataPtr->ctrl == DATA_DRAWING) || // 画笔 + 0 ) + {// 增加收尾补偿数据 + absDataPtr--; + + double crt = cutRnf2Comp*1.0; // 补偿量 + double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + double cosr = (double)qCos(r); + double sinr = (double)qSin(r); + double tx = cosr * (crt*1.0); + double ty = sinr * (crt*1.0); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + absItem.ax += tx; + absItem.ay += ty; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + } + else + { + absDataPtr--; + // 复制当前针步 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + + } + } + } + absDataPtr++; + } + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < newstepnum;j++) + { + qDebug()<<"4 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + return 0; +} + +// 增加转刀数据(裁床专用代码) +int EmbData::setCutRotaryCutterData() +{ + int cutRoudStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRoudStp").toInt(); + int cut1Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut1Radius").toInt(); + int cut2Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut2Radius").toInt(); + + if (cutRoudStp == 0) + { + cutRoudStp = 10; + } + if (cut1Radius == 0) + { + return 0; + } + if (cut2Radius == 0) + { + return 0; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double nf1r = 0; // 切刀1角度 + double nf2r = 0; // 切刀2角度 + + // 将数据中最后一段的角度赋值给起始角度 + for (int j = 0; j < stepsize; j++) + { + if (absDataPtr->ctrl == DATA_EKNIFE1) + {// 切刀1 角度 + nf1r= absDataPtr->ar; + } + else if (absDataPtr->ctrl == DATA_EKNIFE2) + {// 切刀2 角度 + nf2r= absDataPtr->ar; + } + absDataPtr++; + } + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < 100;j++) + { + qDebug()<<"5 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + + + double crt; // 分割量 + double r; // 角度(弧度制) + double tx; + double ty; + + double posX1,posY1; // 起点 + double posX2,posY2; // 终点 + double xc,yc,rc; // 圆心半径 + double dr1,dr2; // 起始,终止角度 + int step; // 针步 + int num; // 增加针数 + u8 ctrlold; // + + absDataPtr = pData; //中间数据针步 + // 数据区 + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absDataPtr->ctrl == DATA_EKNIFE1) + {// 切刀1 补偿 + if ((absDataPtr->attr & 0x20) == 0x20) + {// 拐点位置针步 + crt = cut1Radius*1.0; // + posX2 = absDataPtr->ax; // 终点 + posY2 = absDataPtr->ay; + + r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + tx = (double)qCos(r) * (crt*1.0); + ty = (double)qSin(r) * (crt*1.0); + + xc = absDataPtr->ax - tx; // 圆心 + yc = absDataPtr->ay - ty; + + r = (nf1r) / 10000.0; // 角度(弧度制) + tx = (double)qCos(r) * (crt*1.0); + ty = (double)qSin(r) * (crt*1.0); + + posX1 = xc + tx; // 起点 + posY1 = yc + ty; + + rc = cut1Radius*1.0; // 半径 + dr1 = nf1r; // 起始角度 + dr2 = absDataPtr->ar; // 终止角度 + step = cutRoudStp*1.0; // 步长 + + if (ctrlold != DATA_EKNIFE1) + {// 在起点增加偏移数据 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_OFFSET; + absItem.attr = 0; + absItem.ax = posX1; + absItem.ay = posY1; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + num = splittingArc(posX1, posY1, posX2, posY2, + xc, yc, rc, dr1, dr2, step, + cutAbsData, absItem); + + newstepnum += num; + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + nf1r = absDataPtr->ar; + } + else if (absDataPtr->ctrl == DATA_EKNIFE2) + {// 切刀2 补偿 + if ((absDataPtr->attr & 0x20) == 0x20) + {// 拐点位置针步 + crt = cut2Radius*1.0; // + posX2 = absDataPtr->ax; // 终点 + posY2 = absDataPtr->ay; + + r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + tx = (double)qCos(r) * (crt*1.0); + ty = (double)qSin(r) * (crt*1.0); + + xc = absDataPtr->ax - tx; // 圆心 + yc = absDataPtr->ay - ty; + + r = (nf2r) / 10000.0; // 角度(弧度制) + tx = (double)qCos(r) * (crt*1.0); + ty = (double)qSin(r) * (crt*1.0); + + posX1 = xc + tx; // 起点 + posY1 = yc + ty; + + rc = cut2Radius*1.0; // 半径 + dr1 = nf2r; // 起始角度 + dr2 = absDataPtr->ar; // 终止角度 + step = cutRoudStp*1.0; // 步长 + + if (ctrlold != DATA_EKNIFE2) + {// 在起点增加偏移数据 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_OFFSET; + absItem.attr = 0; + absItem.ax = posX1; + absItem.ay = posY1; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + num = splittingArc(posX1, posY1, posX2, posY2, + xc, yc, rc, dr1, dr2, step, + cutAbsData, absItem); + + newstepnum += num; + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + nf2r = absDataPtr->ar; + } + else + {// + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + } + + ctrlold = absDataPtr->ctrl; + absDataPtr++; + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < 100;j++) + { + qDebug()<<"6 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + return 0; +} + +// 去掉拐点数据 +int EmbData::setCutDecCornerStep() +{ + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"7 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + + absDataPtr = pData; //中间数据针步 + } + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (1)// ((absDataPtr->ax != 0) || (absDataPtr->ay != 0)) // 不是第一针 + { + if (absDataPtr->ctrl != DATA_EKNIFE1) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + absDataPtr++; + if ((absDataPtr->ctrl == DATA_EKNIFE1) && + ((absDataPtr->attr & 0x20) == 0x20) && + 1 ) + {// 当前针是偏移,下一针是转刀补偿数据,将偏移数据的位置指向转刀补偿数据的起点 + absItem.ax = absDataPtr->ax; + absItem.ay = absDataPtr->ay; + } + absDataPtr--; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absDataPtr->ctrl != DATA_EKNIFE2) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + absDataPtr++; + if ((absDataPtr->ctrl == DATA_EKNIFE2) && + ((absDataPtr->attr & 0x20) == 0x20) && + 1 ) + {// 当前针是偏移,下一针是转刀补偿数据,将偏移数据的位置指向转刀补偿数据的起点 + absItem.ax = absDataPtr->ax; + absItem.ay = absDataPtr->ay; + } + absDataPtr--; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + } + } + + absDataPtr++; + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < newstepnum;j++) + { + qDebug()<<"8 idx:"<ctrl + <<" attr:"<attr + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + return 0; +} + +// 分割切刀数据 +int EmbData::setCutFitSplitStep() +{ + int cutLineMinStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMinStp").toInt(); + int cutLineMaxStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMaxStp").toInt(); + if (cutLineMinStp == 0) + { + cutLineMinStp = 10; + } + + if (cutLineMaxStp == 0) + { + cutLineMaxStp = 10; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double begX; // 起始点 + double begY; + + // 数据区 + { + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + {// 分割针步 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay, + cutLineMaxStp, cutLineMaxStp, + cutAbsData, absItem); // 分割直线 + } + + begX = absDataPtr->ax; + begY = absDataPtr->ay; + } + absDataPtr++; + } + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 拟合切刀数据(过滤小针步) +int EmbData::setCutFitStepData() +{ + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + DsAbsItem absItemOld; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + // 数据区 + { + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.attr &= ~0x20; // 删除拐点标志 + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + memcpy(&absItemOld,absDataPtr,sizeof(DsAbsItem)); + } + else + {// 分割针步 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + // 线段长 + double len = sqrt((absItem.ax-absItemOld.ax)*(absItem.ax-absItemOld.ax)+ + (absItem.ay-absItemOld.ay)*(absItem.ay-absItemOld.ay)); + + if ((len <= CUT_MINST_STP) && + (absItem.ctrl == absItemOld.ctrl ) && + //(absItem.action == absItemOld.action ) && + //(absItem.attr == absItemOld.attr ) && + 1) + {// 滤掉小针步 + } + else + { + absItem.attr &= ~0x20; // 删除拐点标志 + newstepnum++; + + double tar = atan2(absItem.ay,absItem.ax); + absItem.ar = (tar * 10000+0.5*(tar>0?1:-1)); + + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + memcpy(&absItemOld,absDataPtr,sizeof(DsAbsItem)); + } + } + } + absDataPtr++; + } + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + + +// 飞行切割平板切割机补偿算法 coco +//#define CUT_CRUTCH_ANG (ANGLECORR) // 拐点转角判断度数,单位:10000弧度 +//#define CUT_LINE_STP (3000) // 分割数据步长,单位0.01mm +//#define CUT_X_LENGH (500000) // X向可切割长度,单位0.01mm +//#define CUT_X_WINDOW (CUT_X_LENGH*3/10) // X向过窗长度:3/10 +//#define CUT_X_EDGE (CUT_X_LENGH/10) // X向过窗边缘 1/10 +//#define CUT_RNF_COMP (10.00) // 圆刀退刀补偿 ,单位0.01mm + +#define CUT_OFFSET_SPD (80000) // 偏移速度 ,单位0.01mm/s +#define CUT_DRAWING_SPD (60000) // 画笔速度 ,单位0.01mm/s +#define CUT_CUTTING_SPD (40000) // 切割速度 ,单位0.01mm/s +#define CUT_LEFT_TIME (1) // 升降机头时间 ,单位s +#define CUT_SPD_ADJ (100) // 行进速度校准 ,范围50%~200% 单位% +#define CUT_SPD_MAX (30000) // 最大行进速度 ,单位0.01mm/s (1~65500) +// + +// 增加拐点数据 +int EmbData:: setCut2CornerStep() +{ + int cutCrutchAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutCrutchAng").toInt(); + if (cutCrutchAng == 0) + { + cutCrutchAng = 60; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + DsAbsItem lastItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + for (int j = 0; j < stepsize; j++) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + if ((j == 0) || + (absItem.ctrl == DATA_NULL) || + (absItem.ctrl == DATA_END) || + 0 ) + { + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absItem.ctrl == DATA_OFFSET) + {// 偏移数据 + memcpy(&lastItem,&absItem,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + else + { +#if(0) + double dr = abs(absItem.ar - lastItem.ar); + if ((dr >= CUT_CRUTCH_ANG) || //改成dr >= (31415/180*cutCrutchAng) + (absItem.ctrl != lastItem.ctrl) || + 0 ) + {// 当两种控制字交替时,生成一个新数据(线迹起点) + if ((absItem.ctrl != DATA_OFFSET) && + (lastItem.ctrl != DATA_OFFSET) && + 1 ) + {// 如果前后两个控制字都不是偏移数据,插入一个偏移数据 + absItem.ctrl = DATA_ANGLE_OLD; + absItem.ax = lastItem.ax; + absItem.ay = lastItem.ay; + absItem.ar = lastItem.ar; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + {// 新数据段起点 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ax = lastItem.ax; + absItem.ay = lastItem.ay; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + {// 新数据段 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + memcpy(&lastItem,&absItem,sizeof(DsAbsItem)); + } + } + else +#endif + { + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + memcpy(&lastItem,&absItem,sizeof(DsAbsItem)); + } + } + + absDataPtr++; + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 修改数据方向 +int EmbData:: setCut2ModifyDataDir() +{ + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + DsAbsItem * absDataPtrBuf = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double begX = 0.0 ,endX = 0.0; // 起始点/终止点X坐标 + int begIdx,endIdx = 0; // 单个图元起始/终止点 + + // 数据区 + { + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;) + { + qDebug()<<"idx:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<ay ; + + if ((absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + 0 ) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + + j++; + absDataPtr++; + } + else if (absDataPtr->ctrl == DATA_ANGLE_OLD) + {// 找到起点拐点 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + j++; + absDataPtr++; + + {//判断下一个数据 + begIdx = j; + begX = absDataPtr->ax; + absDataPtrBuf = absDataPtr; + for (int i = j; i < stepsize;i++) + { + if ((absDataPtrBuf->ctrl == DATA_ANGLE_OLD) || + (absDataPtrBuf->ctrl == DATA_NULL) || + (absDataPtrBuf->ctrl == DATA_END) || + 0 ) + { + i--; + endIdx = i; + absDataPtrBuf--; + endX = absDataPtrBuf->ax; + break; + } + absDataPtrBuf++; + } + + if ((begIdx != endIdx) && + (endX < begX) && + 1 ) + {// 反转数据 + for (int i = endIdx; i >= begIdx;i--) + { + memcpy(&absItem,absDataPtrBuf,sizeof(DsAbsItem)); + absItem.attr |= 0x01; // 反向标志 + absItem.ar += PI10000; // 方向反向 + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + qDebug()<<"idx:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<ay ; + + j++; + absDataPtr++; + + absDataPtrBuf--; + } + } + } + } + else + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + j++; + absDataPtr++; + } + } + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"end idx:"<ctrl + <<" r:"<ar + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + return 0; +} + +// 分割切刀数据 +int EmbData:: setCut2FitSplitStep() +{ + int cutLineStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineStp").toInt(); + if(cutLineStp == 0) + { + cutLineStp = 3000; + } + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + double begX; // 起始点 + double begY; + + // 数据区 + { + for (int j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END)) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + if (j == 0) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + {// 分割针步 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay, + cutLineStp, cutLineStp, + cutAbsData, absItem); // 分割直线 + } + + begX = absDataPtr->ax; + begY = absDataPtr->ay; + } + absDataPtr++; + } + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"end idx:"<ctrl + <<" r:"<ar + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + + return 0; +} + + +// 判断区间 +// 输入 +//#define CUT_X_LENGH (500000) // X向可切割长度 +//#define CUT_X_WINDOW (CUT_X_LENGH*4/10) // X向过窗长度:4/10 +//#define CUT_X_EDGE (CUT_X_LENGH/10) // X向过窗边缘 1/10 +int EmbData:: setCut2JudgInterval() +{ + int cutXWindow = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutXLengh").toInt(); + if(cutXWindow == 0) + { + cutXWindow = 500000; + } + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + // 求花样X范围 + double maxX = S32_MIN; + double minX = S32_MAX; + + absDataPtr = pData; //中间数据针步 + for (int j = 0; j < stepsize; j++) + { + if (//(j == 0) || + (absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_ANGLE_OLD) || + (absDataPtr->ctrl == DATA_OFFSET) || + 0 ) + { + } + else + {// + if(absDataPtr->ax > maxX) + { + maxX = absDataPtr->ax; + } + if(absDataPtr->ax < minX) + { + minX = absDataPtr->ax; + } + } + absDataPtr++; + } + + // 分割窗口数量 + int winNum,curWin,begFlg; + + int maxWinX = 0; // 当前窗口最大值 + int minWinX = 0; // 当前窗口最小值 + + curWin = 1; + begFlg = 0; + winNum = floor((maxX - minX) / (cutXWindow*3/10)) + 1; + + qDebug()<<"maxx:"<ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + 0 ) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else if ((absDataPtr->ctrl == DATA_ANGLE_OLD) || + (absDataPtr->ctrl == DATA_OFFSET) || + 0 ) + {// 找到起点拐点 + begFlg = 0; + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else + { + double dtx = absDataPtr->ax - minX; + + if (begFlg == 0) + { + begFlg = 1; // 起始点标志 + curWin = floor(dtx / (cutXWindow*3/10)); + + maxWinX = (cutXWindow*3/10) * (curWin + 1) + (cutXWindow/10); // 当前窗口最大值 + minWinX = (cutXWindow*3/10) * (curWin) - (cutXWindow/10); // 当前窗口最小值 + if (0) + { + qDebug()<<"curWin:"<ax - minX) + <<" Win:"<<(cutXWindow*3/10) + <<" maxWinX:"<= minWinX)) + {// 当前窗口 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.action = curWin; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (dtx >= maxWinX) + {// 下一个窗口 + curWin++; + begFlg = 0; + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_ANGLE_OLD; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 增加一个拐点 + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.action = curWin; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (dtx < minWinX) + {// 上一个窗口 + curWin--; + begFlg = 0; + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.ctrl = DATA_ANGLE_OLD; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 增加一个拐点 + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + absItem.action = curWin; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + } + absDataPtr++; + } + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < newstepnum;j++) + { + qDebug()<<"end idx:"<ctrl + <<" action:"<action + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + return 0; +} + +// 增加圆刀数据两端补偿 +// 输入 +//#define CUT_RNF_COMP (1000) // 圆刀退刀补偿 ,单位0.01mm +int EmbData:: setCut2AddCutterComption() +{ + int cutRnfComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnfComp").toInt(); + if(cutRnfComp == 0) + { + return -1; + } + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + if (0) + { + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"123 idx:"<ctrl + <<" x:"<ax + <<" y:"<ay + ; + absDataPtr++; + } + } + + bool isCuttingData = false;//上一针是切割数据 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + + absDataPtr = pData; //中间数据针步 + for (int j = 0; j < stepsize;j++) + { + if ((j == 0) || + (absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_ANGLE_OLD) || // 拐点 + (absDataPtr->ctrl == DATA_OFFSET) || // 偏移 + (absDataPtr->ctrl == DATA_DRAWING) ) // 画笔 + {// 找到起点 + isCuttingData = false; + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + } + else + { + if (!isCuttingData)//上一针不是切割数据 + {// 增加起始补偿数据 + isCuttingData = true; // 起始点标志 + + double crt = cutRnfComp*1.0; // 补偿量 + double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + double cosr = (double)qCos(r); + double sinr = (double)qSin(r); + double tx = cosr * (crt*1.0); + double ty = sinr * (crt*1.0); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + absItem.ax -= tx; + absItem.ay -= ty; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + // 复制当前针步 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + newstepnum++; + cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem)); + + if (isCuttingData) //上一针是切割数据 + {// 增加收尾补偿数据 + absDataPtr++; + if ((absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_ANGLE_OLD) || // 拐点 + (absDataPtr->ctrl == DATA_OFFSET) || // 偏移 + (absDataPtr->ctrl == DATA_DRAWING)) // 画笔 + { + absDataPtr--; + + double crt = cutRnfComp*1.0; // 补偿量 + double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制) + double cosr = (double)qCos(r); + double sinr = (double)qSin(r); + double tx = cosr * (crt*1.0); + double ty = sinr * (crt*1.0); + + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + absItem.ax += tx; + absItem.ay += ty; + + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + } + else + { + absDataPtr--; + } + } + } + absDataPtr++; + } + + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +//yct实现 +int EmbData::setCut2AddCutterComption2() +{ + qDebug()<<__FUNCTION__; + //补偿长度 + int cutRnfComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnfComp").toInt(); + double comDistance = cutRnfComp*1.0 ; // 补偿量 + + //垂直补偿 + int cutVertComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutVertComp").toInt(); + double comDistanceVert = cutVertComp*1.0 ; // 补偿量 + + //补偿最大角度 + int cutCrutchAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutCrutchAng").toInt(); + double cutMaxAng = (cutCrutchAng * PI / 180) * 10000; //转换为弧度 + + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + +#if 0 + pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + absDataPtr = pData; //中间数据针步 + qDebug() << __FUNCTION__ << "PreCompensation Ptr stepsize+++++++++++++++++++++++++++++" << stepsize; + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"idx:"<< j <<" x:"<ax <<" y:"<ay << "ar:" << absDataPtr->ar <<" ctrl:"<< QString::number(absDataPtr->ctrl,16);; + absDataPtr++; + } +#endif + + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + absDataPtr = pData; //中间数据针步 + + DsAbsItem preAbsItem;//前一针 + int firstCutData = 0; //第一帧数据 + + for (int j = 0; j < stepsize; j++) + { + // 复制当前针步 + DsAbsItem curAbsItem; + memcpy(&curAbsItem,absDataPtr,sizeof(DsAbsItem)); + + if((firstCutData == 0) && (curAbsItem.ctrl == DATA_RKNIFE || curAbsItem.ctrl == DATA_SKNIFE)){ + firstCutData = 1; + } + + DsAbsItem * nextItemPtr = absDataPtr + 1; + DsAbsItem nextItem; + memcpy((char*)&nextItem,(char *)nextItemPtr,sizeof(DsAbsItem)); + double dr = qAbs(nextItem.ar) - qAbs(curAbsItem.ar); //偏转角度 + dr = qAbs(dr); + + //倒数第一针 //结尾补偿 + if((j == stepsize - 1) && isCutCtrl(curAbsItem.ctrl)){ + cutDataEndCompensate(curAbsItem,preAbsItem,comDistance); + cutDataVertCut(curAbsItem, comDistanceVert, cutAbsData,newstepnum); + } + else if(j == 0){//第一针不处理 + + } + //结尾补偿 + else if( isCutCtrl(curAbsItem.ctrl) + && (nextItem.ctrl == DATA_NULL || nextItem.ctrl == DATA_END + || nextItem.ctrl == DATA_ANGLE_OLD || nextItem.ctrl == DATA_OFFSET ) + && 1) + { + cutDataEndCompensate(curAbsItem,preAbsItem,comDistance); + cutDataVertCut(curAbsItem, comDistanceVert, cutAbsData,newstepnum); + } + //开头补偿 + else if (isCutCtrl(nextItem.ctrl) + && (curAbsItem.ctrl == DATA_NULL || curAbsItem.ctrl == DATA_END + || curAbsItem.ctrl == DATA_ANGLE_OLD || curAbsItem.ctrl == DATA_OFFSET ) + && 1) + { + cutDataStartCompensate(curAbsItem,preAbsItem,nextItem,comDistance); + } + //切割数据中大角度分割 + else if((isCutCtrl(preAbsItem.ctrl)) + && (isCutCtrl(curAbsItem.ctrl)) + && (dr > cutMaxAng) + && (comDistance > 0.0) + && ((curAbsItem.ay != nextItem.ay) || (curAbsItem.ax != nextItem.ax)) + && 1) + { + // qDebug()<< " cur double end :" << j << "x :" << curAbsItem.ax << "y :" << curAbsItem.ay << "dr:" << dr << "cutMaxAng :" <dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + return 0; +} + +// 排序&组成新数据 +int EmbData:: setCut2SortNewData() +{ + qDebug()<<__FUNCTION__; + //是否启用画笔 + //bool enableBrush = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutEnableBrush").toBool(); + bool enableBrush = true; + int i,j; + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + + int winNum = 0; // 窗口个数范围 + int begFlg = 0; + DsAbsItem * absDataPtrWin = pData; //中间数据针步 + for (j = 0; j < stepsize; j++) + { + if (winNum < absDataPtrWin->action) + { + winNum = absDataPtrWin->action; + } + absDataPtrWin++; + } + winNum++; + + // 数据分类 + QVector > penVisited(winNum, QVector(0)); // 画笔数据 + QVector > cutShakeVisited(winNum, QVector(0)); // 震刀数据 + QVector > cutRountVisited(winNum, QVector(0)); // 圆刀数据 + +#if 0 + DsAbsItem * pData1 = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr1 = pData1; //中间数据针步 + qDebug() << __FUNCTION__ << "stepsize+++++++++++++++++++++++++++++" << stepsize; + for (int j = 0; j < stepsize;j++) + { + qDebug()<<"idx:"<< j <<" x:"<ax <<" y:"<ay << "ar:" << absDataPtr1->ar <<" ctrl:"<< QString::number(absDataPtr1->ctrl,16);; + absDataPtr1++; + } +#endif + QByteArray ary; + DsAbsItem absItem; + DsAbsItem * preDataPtr; //前一步指针 + DsAbsItem * absDataPtr = pData; //中间数据针步 + //偏移数据和拐角数据的赋值策略不一样 + double preAxData = absDataPtr->ax; //上一个切割数据X + double preAyData = absDataPtr->ay; //上一个切割数据Y + double preAxAngleOld = absDataPtr->ax; //上一个切割数据X + double preAyAngleOld = absDataPtr->ay; //上一个切割数据Y + bool offsetFlg = false;//偏移数据标志位 + + for (j = 0; j < stepsize; j++) + { + if ((absDataPtr->ctrl == DATA_NULL) || + (absDataPtr->ctrl == DATA_END) || + (absDataPtr->ctrl == DATA_ANGLE_OLD) || + (absDataPtr->ctrl == DATA_OFFSET)) + { + begFlg = 0; + //如果是偏移数据 则记录最后一针位置, + //然后赋值给拐角数据,这样在偏移的时候不会少第一针 + if(absDataPtr->ctrl == DATA_OFFSET){ + preAxAngleOld = absDataPtr->ax; + preAyAngleOld = absDataPtr->ay; + offsetFlg = true; + } + } + else if (begFlg == 0) + { + // 增加拐点 + begFlg = 1; // 起始点标志 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + + if(offsetFlg) //偏移数据 赋值上一拐角数据位置 + { + absItem.ax = preAxAngleOld; + absItem.ay = preAyAngleOld; + offsetFlg = false; + }else{ //拐角数据 赋值上一针切割数据位置 + absItem.ax = preAxData; + absItem.ay = preAyData; + } + + absItem.ctrl = DATA_ANGLE_OLD; + ary.clear(); + ary.append((char*)&absItem, sizeof(DsAbsItem)); + if (absDataPtr->ctrl == DATA_DRAWING) + {// 画笔数据 + penVisited[absItem.action].append(ary); + } + else if(absDataPtr->ctrl == DATA_SKNIFE) + { + cutShakeVisited[absItem.action].append(ary); + } + else if(absDataPtr->ctrl == DATA_RKNIFE) + { + cutRountVisited[absItem.action].append(ary); + } + } + + //记录切割数据 拐角数据分割区域的时候需要赋值 + if(absDataPtr->ctrl == DATA_DRAWING + || absDataPtr->ctrl == DATA_SKNIFE + ||absDataPtr->ctrl == DATA_RKNIFE) + { + preAxData = absDataPtr->ax; + preAyData = absDataPtr->ay; + } + + if( (j!=0) //绝对位置没变化角度也要同前一个 + &&(preDataPtr->ax == absDataPtr->ax) + && (preDataPtr->ay == absDataPtr->ay) + &&(preDataPtr->ctrl == absDataPtr->ctrl)) + { + absDataPtr->ar = preDataPtr->ar; + } + + // 增加数据 + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + ary.clear(); + ary.append((char*)&absItem, sizeof(DsAbsItem)); + + if (absDataPtr->ctrl == DATA_DRAWING) + {// 画笔数据 + penVisited[absItem.action].append(ary); + } + else if(absDataPtr->ctrl == DATA_SKNIFE) + { + cutShakeVisited[absItem.action].append(ary); + } + else if(absDataPtr->ctrl == DATA_RKNIFE) + { + cutRountVisited[absItem.action].append(ary); + } + preDataPtr = absDataPtr; + absDataPtr++; + } + + //optimizationOrder(penVisited,absItem,winNum,DATA_DRAWING);//画笔不排序-注释 + optimizationOrder(cutShakeVisited,absItem,winNum,DATA_SKNIFE); + optimizationOrder(cutRountVisited,absItem,winNum,DATA_RKNIFE); + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + // 合并数据 + cutAbsData.clear(); + s16 penFlag = 0; + + for (i = 0; i 0) + { + newstepnum += stepnumPen; + for (j = 0;j 0) + { + //画笔与切刀数据转换之间增加偏移属性 + if(penFlag == 1) + { + DsAbsItem item; + memcpy(&item,cutShakeVisited[i][0].data(),sizeof(DsAbsItem)); + if(item.ctrl != DATA_OFFSET) + { + item.ctrl = DATA_OFFSET; + } + cutAbsData.append((char*)&item,sizeof(DsAbsItem)); + penFlag = 0; + } + newstepnum += stepCutShake; + for (j = 0;j < stepCutShake;j++) + { + cutAbsData.append(cutShakeVisited[i][j]); + memcpy((char*)&absItem, (char *)cutShakeVisited[i][j].data(), sizeof(DsAbsItem)); + } + } + + int stepCutRound = cutRountVisited[i].size(); // 圆刀数据 + qDebug() << "stepCutRound" << stepCutRound; + if (stepCutRound > 0) + { + //画笔与切刀数据转换之间增加偏移属性 + if(penFlag == 1) + { + DsAbsItem item; + memcpy(&item,cutRountVisited[i][0].data(),sizeof(DsAbsItem)); + if(item.ctrl != DATA_OFFSET) + { + item.ctrl = DATA_OFFSET; + } + cutAbsData.append((char*)&item,sizeof(DsAbsItem)); + penFlag = 0; + } + newstepnum += stepCutRound; + for (j = 0;j < stepCutRound;j++) + { + cutAbsData.append(cutRountVisited[i][j]); + memcpy((char*)&absItem, (char *)cutRountVisited[i][j].data(), sizeof(DsAbsItem)); + } + } + + } + + //重新计算角度,因为线条进行了排序,所以要重新计算角度 + DsAbsItem * ptr = (DsAbsItem *)(cutAbsData.data()); + + double prex = 0; + double prey = 0; + double curx = 0; + double cury = 0; + double ddx = 0; + double ddy = 0; + for(int i = 0; i < newstepnum; i++) + { + curx = ptr->ax; + cury = ptr->ay; + ddx = curx - prex; + ddy = cury - prey; + if(ddx == 0 && ddy == 0 && i > 0) + { + DsAbsItem * ptrPre = ptr; + ptrPre--; + ptr->ar = ptrPre->ar; + } + else + { + double tar = atan2(ddy,ddx); + ptr->ar = (tar * 10000+0.5*(tar>0?1:-1)); + } + prex = curx; + prey = cury; + ptr++; + } + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + +#if 0 + DsAbsItem * cutAbsPtr = (DsAbsItem *)cutAbsData.data(); + qDebug()<< "cutAbsData stepsize" << newstepnum; + for(int i = 0 ; i< newstepnum;i++){ + qDebug()<<"cutAbsData printPtr:"<< "Index :" << i << " ax" << cutAbsPtr->ax << " ay" << cutAbsPtr->ay <<" ctrl" <ctrl,16); + cutAbsPtr++; + } +#endif + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + + +// 增加偏移数据,结束码 +int EmbData:: setCut2AddOffsetData() +{ + qDebug()<<__FUNCTION__; + int cutLineStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineStp").toInt(); + if(cutLineStp == 0) + { + cutLineStp = 3000; + } + int size = m_embAbsData.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + + DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data()); + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + DsAbsItem absItem; + + int newstepnum = 0; + QByteArray cutAbsData; // 切割临时数据 + cutAbsData.clear(); + +#if 0 + DsAbsItem * cutAbsPtr = absDataPtr; + qDebug()<< "Pre AddOffsetData stepsize+++++++++++++++++++++++++++++" << stepsize; + for(int i = 0 ; i< stepsize;i++){ + qDebug()<<"AddOffsetDataAndEnd Ptr:"<< "Index :" << i << " ax" << cutAbsPtr->ax << " ay" << cutAbsPtr->ay <<" ctrl" <ctrl,16) << "winNum" <action; + if(cutAbsPtr->ctrl == DATA_ANGLE_OLD) + qDebug()<<" == "; + cutAbsPtr++; + } +#endif + + // 数据区 + double begX = 0;// 起始点 + double begY = 0; + for (int j = 0; j < stepsize; j++) + { + memcpy(&absItem,absDataPtr,sizeof(DsAbsItem)); + if (j == 0) + { + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + else if (absItem.ctrl == DATA_ANGLE_OLD) + {// 分割偏移数据 + absItem.ctrl = DATA_OFFSET; + absItem.attr = 0; + if ((begX != absDataPtr->ax) || (begY != absDataPtr->ay)) + { + newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay, + cutLineStp, cutLineStp, + cutAbsData, absItem); // 分割直线 + } + } + else + { + absItem.attr = 0; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + } + + begX = absItem.ax; + begY = absItem.ay; + absDataPtr++; + } + + + + //结束码 + absItem.ctrl = DATA_NULL; + newstepnum++; + cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); + + pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + pHead->itemNums = newstepnum; // 数据项个数 + + cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头 + + m_embAbsData.clear(); + m_embAbsData = cutAbsData; + m_editedflag = 1; + + return 0; +} + +// 计算最大行进速度 (返回值单位: 0.01mm/s) +// 输入 +//#define CUT_OFFSET_SPD (100) // 偏移速度 ,单位0.01mm/s +//#define CUT_DRAWING_SPD (100) // 画笔速度 ,单位mm/s +//#define CUT_CUTTING_SPD (100) // 切割速度 ,单位mm/s +//#define CUT_LEFT_TIME (1) // 升降机头时间 ,单位s +//#define CUT_SPD_ADJ (100) // 行进速度校准 ,范围50%~200% 单位% + +int EmbData:: setCut2CalMaxSpd() +{ + int cutXWindow = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutXLengh").toInt(); + if(cutXWindow == 0) + { + cutXWindow = 500000; + } + + int j; + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + else + { + qDebug()<<"stepsize"<action[0],curDataPtr->action[1]); + if (winNum < curWin) + { + winNum = curWin; + } + curDataPtr++; + } + winNum++; + + double winSpd[winNum]; // 窗口速度 + double penlen[winNum]; // 画笔长度 + double cutlen[winNum]; // 裁切长度 + double ofstlen[winNum]; // 偏移长度 + u32 leftTim[winNum]; // 升降次数 + + for (j = 0; j < winNum; j++) + { + winSpd[j] = 0; // 窗口速度 + penlen[j] = 0; // 画笔长度 + cutlen[j] = 0; // 裁切长度 + ofstlen[j] = 0; // 偏移长度 + leftTim[j] = 0; // 升降次数 + } + + // 数据区 + { + double lastX = 0; + double lastY = 0; + double curX = 0; + double curY = 0; + double len = 0; + u8 laetCtrl = DATA_OFFSET; + + curDataPtr = embDataPtr; + for (j = 0; j < stepsize; j++) + { + if (j == 0) + { + } + else if (curDataPtr->ctrl == DATA_OFFSET) + {// 偏移数据 + curX = curDataPtr->dx; + curY = curDataPtr->dy; + len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY)); + curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]); + ofstlen[curWin] += len; + } + else if (curDataPtr->ctrl == DATA_DRAWING) + {// 画笔数据 + curX = curDataPtr->dx; + curY = curDataPtr->dy; + len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY)); + curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]); + penlen[curWin] += len; + } + else + {// 裁切数据 + curX = curDataPtr->dx; + curY = curDataPtr->dy; + len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY)); + cutlen[curDataPtr->action[0]] += len; + } + + if (laetCtrl != curDataPtr->ctrl) + { + laetCtrl = curDataPtr->ctrl; + curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]); + leftTim[curWin] += 2; // 升降次数+2 + } + + lastX = curDataPtr->dx; + lastY = curDataPtr->dy; + curDataPtr++; + } + + for (j = 0; j < winNum; j++) + {// 计算过窗传送电机最大行进速度 + double time = 0; + + time += cutlen[j] / CUT_CUTTING_SPD; // 裁切时间(单位:s) + time += penlen[j] / CUT_DRAWING_SPD; // 画笔时间(单位:s) + time += ofstlen[j] / CUT_OFFSET_SPD; // 偏移时间(单位:s) + time += leftTim[j] * CUT_LEFT_TIME; // 升降时间(单位:s) + + if (time == 0) + { + winSpd[j] = CUT_SPD_MAX; + } + else + { + winSpd[j] = ((cutXWindow*3/10) * CUT_SPD_ADJ / 100 / time); + } + + if (winSpd[j] > CUT_SPD_MAX) + { + winSpd[j] = CUT_SPD_MAX; + } + + if (winSpd[j] == 0) + { + winSpd[j] = 1; + } + qDebug()<<"winSpd["<action[0],curDataPtr->action[1]); + curmaxpps.buf32 = (u32)(winSpd[curWin]); + memcpy(&embDataPtr->rev,&curmaxpps.buf32,4); + embDataPtr++; + } + } + } + + } + return 0; +} + +void EmbData::recalculateAngles() +{ + qDebug()<<__FUNCTION__; + u32 size = m_embAbsData.size(); + if (size < sizeof(DataDs16FileHead)) + { + return ; + } + + DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + int stepsize = (size - sizeof(DataDs16FileHead))/sizeof(DsAbsItem); + + DsAbsItem * lastItem; + memset(&lastItem,0,sizeof(DsAbsItem)); + + qDebug() <<__FUNCTION__<< "stepsize:" <ax << "ay" << absDataPtr->ay << "ctrl" <ctrl,16); +#endif + if (j == 0) + { + lastItem->ax = 0; + lastItem->ay = 0; + } + s32 ar = calculateAngles(absDataPtr->ax, absDataPtr->ay, lastItem->ax, lastItem->ay); + absDataPtr->ar = ar; + //先赋值再递增 + lastItem = absDataPtr++; + } + +} + +s32 EmbData::calculateAngles(double endX, double endY, double beginX, double beginY) +{ + double Dx = endX - beginX ; + double Dy = endY - beginY ; + + double tar = atan2(Dy,Dx); + s32 ar = (tar * 10000+0.5*(tar>0?1:-1)); + return ar; +} + +//切割数据结尾的补偿 移动结尾切割点的方法 +void EmbData::cutDataEndCompensate(DsAbsItem &curItem,DsAbsItem &preItem, double comDistance) +{ + if(comDistance <= 0.0) + return; + // curItem.ar = calculateAngles(curItem.ax,curItem.ay,preItem.ax,preItem.ay); + double preR = curItem.ar / 10000.0; + double comDisX = qCos(preR) * comDistance; + double comDisY = qSin(preR) * comDistance; + //切割数据正向移动 + curItem.ax += comDisX; + curItem.ay += comDisY; + + if(preItem.ctrl == 0){}//为了去掉警告 +} + +//添加切割数据结尾 垂直补偿 +void EmbData::cutDataVertCut(DsAbsItem &curItem, double comDistance, QByteArray &cutAbsData,int &newstepnum) +{ + if(comDistance <= 0.0) + return; + + //添加原始切割终点 + newstepnum++; + cutAbsData.append((char*)(&curItem), sizeof(DsAbsItem)); + qDebug()<<"CrossCut ADD Point:" <<" x:"< > &visited, DsAbsItem &absItem,int winNum,u8 ctrl) +{ + if(winNum <= 1) + { + return; + } + + if(absItem.ctrl == 0){}//为了去掉警告 + int stepnum = 0; + + QVector > cpvisited; + cpvisited = visited; + + int flag = 0; + double ax,ay; + ax = ay = 0; + + for (int i=0;ictrl == DATA_ANGLE_OLD) + { + duan++; + } + } + // qDebug()<< "optimizationOrder :duan :" < > duanData(duan, QVector(0)); // 临时数据 (正向) + + // qDebug()<< "optimizationOrder :stepnum :" <ctrl == DATA_ANGLE_OLD) + { + k++; + tmpDataPtr->ctrl = ctrl; + duanData[k].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 保存正向数据 + } + else + { + duanData[k].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 保存正向数据 + } + } + + //重组数据 + cpvisited[i].clear(); + + QVector > cpduanData; + cpduanData = duanData; + + for (k=0;kctrl != DATA_SKNIFE && tmpDataPtr->ctrl != DATA_RKNIFE) + { + cpvisited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加数据 + } + else + { + if(flag == 0) + { + ax = tmpDataPtr->ax; + ay = tmpDataPtr->ay;//终点坐标 + cpvisited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加数据 + } + else + { + int idx = -1;//索引 + QList dirList;//方向,0为正向 + dirList.clear(); + u32 len = U32_MAX; + int dir = 0; + //扫描哪个段的起点离上个段的终点最近 + for(int p=0;pax-ax)*(tmpDataPtr1->ax-ax)+(tmpDataPtr1->ay-ay)*(tmpDataPtr1->ay-ay)); + u32 len2 = sqrt((tmpDataPtr2->ax-ax)*(tmpDataPtr2->ax-ax)+(tmpDataPtr2->ay-ay)*(tmpDataPtr2->ay-ay)); + + if(len1 > len2) + { + dir = 1;//反向 + } + dirList.append(dir); + + if(len > len1) + { + idx = p; + len = len1; + } + if(len > len2) + { + idx = p; + len = len2; + } + } + } + //将idx的段加入到cpvisited中 + if(idx < dirList.size() && idx >= 0) + { + dir = dirList[idx]; + if(dir == 0) + { + for(int p=0;pctrl = DATA_OFFSET; + cpvisited[i].append(QByteArray((char*)oftTmpPtr, sizeof(DsAbsItem))); // 增加偏移 + } + cpvisited[i].append(QByteArray((char*)tmpPtr, sizeof(DsAbsItem))); // 增加数据 + if(p == cpduanData[idx].size()-1) + { + ax = tmpPtr->ax; + ay = tmpPtr->ay; + } + } + } + else + { + for(int p=cpduanData[idx].size()-1;p>=0;p--) + { + DsAbsItem *tmpPtr = (DsAbsItem *)(cpduanData[idx][p].data()); + //添加偏移 + if(p == cpduanData[idx].size()-1) + { + DsAbsItem *oftTmpPtr = (DsAbsItem *)(cpduanData[idx][p].data()); + oftTmpPtr->ctrl = DATA_OFFSET; + cpvisited[i].append(QByteArray((char*)oftTmpPtr, sizeof(DsAbsItem))); // 增加偏移 + } + cpvisited[i].append(QByteArray((char*)tmpPtr, sizeof(DsAbsItem))); // 增加数据 + if(p == 0) + { + ax = tmpPtr->ax; + ay = tmpPtr->ay; + } + } + } + cpduanData.remove(idx); + break; + } + else + { + break; + } + } + } + } + if(flag == 0) + { + cpduanData.remove(k); + } + flag = 1; + } + } + +#if(0) //dr 出的问题 coco + double lastX,lastY,curX,curY,len,minlen; + lastX = 0; + lastY = 0; + + {// 重组数据 + int nearDuan; // 最近的段 + visited[i].clear(); + + for (int j=0;jax; + curY = tmpDataPtr->ay; + len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY)); + if (minlen >= len) + { + minlen = len; + nearDuan = (k+1); // 最近的段 + } + + // 终点距离 + tmpDataPtr = (DsAbsItem *)(duanData[k][duanData[k].size()-1].data()); + curX = tmpDataPtr->ax; + curY = tmpDataPtr->ay; + len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY)); + if (minlen >= len) + { + minlen = len; + nearDuan = (k+1)*(-1); // 最近的段 + } + } + } + qDebug()<< "nearDuan " < 0) + {// 正向赋值 + nearDuan--; + + tmpDataPtr = (DsAbsItem *)(duanData[nearDuan][0].data()); + absItem.ctrl = DATA_ANGLE_OLD; + visited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加拐点数据 + + for (int k=0;k= 0) + { + absItem.ar -= PI10000; + } + else + { + absItem.ar += PI10000; + } + visited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加拐点数据 + } + lastX = absItem.ax; + lastY = absItem.ay; + duanData[nearDuan].clear(); + } + } + } +#endif + } + visited.clear(); + visited = cpvisited; +} + + + + +// 主控参数(与主板参数同步更改) +//#define CUT_SPD_MINPPS (10) // 最小切割速度, 范围 1--100,单位mm/s,默认 10 +//#define CUT_SPD_MAXPPS (600) // 最大切割速度, 范围 1--1200,单位mm/s,默认 1000 +//#define CUT_ADD_PPSG (1000) // 切割加速度, 范围 1--4000,单位mm/s2,默认 500 +//#define CUT_SLOW_ANGLE (6000) // 切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 +//#define CUT_WORK_MINADD (1) // 工作最小加速度 + +#define CUTTINGVX_MUTI (5) // 切割虚轴脉冲倍数 +#define PULSE_PER_MM (100) // 每毫米脉冲数 +#define RADIAN_ACCURACY (10000) // 万分之一弧度 +#define N1_FPGA_CLK (72000000L) // N1主板FPGA主频 +#define DEG_PER_CIRCLE (360) // 每圈的度数(单位 度) +#define DEG001_PER_DEG (100) +#define DEG001_PER_CIRCLE (DEG_PER_CIRCLE*DEG001_PER_DEG) // 每圈的度数(单位 0.01度) + +#define MMPS_TO_PPS(mmps) ((mmps)*PULSE_PER_MM) // 单位转换,由“毫米每秒”转换为“脉冲个数每秒” +#define MMPSS_TO_PPSG(mmpss) (N1_FPGA_CLK/(PULSE_PER_MM)/(mmpss)) // 单位转换,由“毫米每秒平方”转换为“脉冲个数每秒间隔”,间隔单位为1/72000000秒 + +#define ROT_001DEG_TO_PITK(deg) ((double)(deg)*2*PI*RADIAN_ACCURACY/DEG001_PER_CIRCLE) // 单位转换,由“0.01度”转换为“万分之一弧度” +#define VAxisMMPSToPPS(mmps) (MMPS_TO_PPS(mmps) * CUTTINGVX_MUTI) // 虚轴速度加快 +#define VAxisMMPSSToPPSG(mmpss) (MMPSS_TO_PPSG(mmpss) / CUTTINGVX_MUTI) // 加速度增大 + + +//fillctrl.minchgpps = VAxisMMPSToPPS(g_pCuttingMcPara->workMinAdd*1.0); + +u32 EmbData::CalcDisplacement(u32 pps1, u32 pps2, u32 calcTime) +{ + double temp; + if (pps1 < pps2) + { + temp = (pps2-pps1); + } + else + { + temp = (pps1-pps2); + } + temp *= (pps1+pps2); + temp *= calcTime; + temp /= (2*N1_FPGA_CLK); + return (u32)(temp+0.5); +} + +s16 EmbData::Rot001ToPitk(s32 ang001) +{ + double temp = ang001; + temp = ROT_001DEG_TO_PITK(temp); + return (s16)temp; +} + +// 计算切刀运动参数 +// 输入:m_embDs16Data +// 输出:m_embDs16Data (在保留数据中增加最大速度) +int EmbData::setCutMoveParameters() +{ + int cutSpdMinpps = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSpdMinpps").toInt(); + int cutSpdMaxpps = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSpdMaxpps").toInt(); + int cutAddPpsg = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutAddPpsg").toInt(); + int cutSlowAngle = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSlowAngle").toInt(); + int cutWorkMinadd = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutWorkMinadd").toInt(); + + int size = m_embDs16Data.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + else + { + qDebug()<<"stepsize"<ctrl == DATA_NULL) || (embDataPtr->ctrl == DATA_END)) + { + break; + } + else + { + curDataPtr = embDataPtr; + for (i=j; ictrl == DATA_NULL) || (curDataPtr->ctrl == DATA_END)) + { + mintpps = minpps; // 简化处理,直接降速到最低 + break; + } + + temp = mintpps; + + // 得到当前数据需要的速度 + if (curDataPtr->ctrl == embDataPtr->ctrl) // 数据类型相同 + { + if (abs(curDataPtr->dr) > slowAngle) // 角度差大于降速角度,需要降速 + { + temp = minpps; // 简化处理,直接降速到最低 + } + else + { + // 计算本针步最大允许速度 + // 用XY的速度变化差值限制 + if (curDataPtr->len != 0) + { + if (geted != 0) + { + odx = dx; + ody = dy; + olen = len; + } + + dx = curDataPtr->dx; + dy = curDataPtr->dy; + len = curDataPtr->len; + + if (geted == 0) + { + odx = dx; + ody = dy; + olen = len; + geted = 1; + } + + mdx = abs(dx*olen - odx*len); + mdy = abs(dy*olen - ody*len); + mdxy = mdx; + if (mdxy < mdy) + { + mdxy = mdy; + } + + if (mdxy != 0) + { + temp = minchgpps * len * olen / mdxy; + } + } + } + } + else + { + // 不同类型,直接降速到最低 + mintpps = minpps; // 目标速度 + break; + } + + if (mintpps > temp) // 最小速度大于当前计算速度 + { + mintpps = temp; // 开始降速 + } + if (mintpps < minpps) + { + mintpps = minpps; + break; + } + + if (decCount > curDataPtr->len) + { + decCount -= curDataPtr->len; + } + else + { + decCount = 0; + break; + } + + curDataPtr++; + } + } + + curmaxpps.buf32 = mintpps; + memcpy(&embDataPtr->rev,&curmaxpps.buf32,4); + embDataPtr++; + } + return 0; +} + +//----------------------------------------------------- + +int EmbData::setRotate(int dr) +{ + double rr = (dr * PI / 180) * 10000; //转换为弧度 + + if (dr == 0 || dr == 360) + { + return 0; + } + + double angle, sina, cosa; + +#if (1) + // 因为计算三角函数有问题,现在只支持 1度,10度,90度 + switch(dr) + { + case 1: + sina = 0.01745240643728351281941897851632; + cosa = 0.99984769515639123915701155881391; + break; + case 10: + sina = 0.17364817766693034885171662676931; + cosa = 0.98480775301220805936674302458952; + break; + case 90: + sina = 1; + cosa = 0; + break; + case -1: + sina = -0.01745240643728351281941897851632; + cosa = 0.99984769515639123915701155881391; + break; + case -10: + sina = -0.17364817766693034885171662676931; + cosa = 0.98480775301220805936674302458952; + break; + case -90: + sina = -1; + cosa = 0; + break; + default: + angle = (dr * PI) / 180.0; + sina = (double)qSin(angle); + cosa = (double)qCos(angle); + break; + } + +#else + + angle = (dr * PI) / 180.0; + sina = (double)qSin(angle); + cosa = (double)qCos(angle); +#endif + + // 文件头 + const QByteArray & ary = m_embAbsData; + int size = ary.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + + int datasize = size - sizeof(DataDs16FileHead); + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("dat data size err"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data()); + + //beginR的旋转 + double br = pDsHead->beginR + rr; + while (br > 2*PI * 10000) + { + br -= 2*PI * 10000; + } + while (br < -2*PI * 10000) + { + br += 2*PI * 10000; + } + pDsHead->beginR = br; + + DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + + // 数据旋转 + for (int j = 0; j < stepsize; j++) + { + // 变换前点坐标 + double ax = absDataPtr->ax; + double ay = absDataPtr->ay; + double ar = absDataPtr->ar + rr; + + while (ar > 2*PI * 10000) + { + ar -= 2*PI * 10000; + } + while (ar < -2*PI * 10000) + { + ar += 2*PI * 10000; + } + // 变换后点的坐标 + double rax = (ax*cosa - ay*sina); + double ray = (ax*sina + ay*cosa); + + absDataPtr->ax = rax; + absDataPtr->ay = ray; + absDataPtr->ar = ar; + absDataPtr++; + } + + m_editedflag = 1; + + return 1; +} + +//此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距 +void EmbData::convertAbsDat(QByteArray &dat, int mirror) +{ + //无镜像、xy间距、角度旋转、缩放比例都为0时数据无需转换 + if(mirror == 0 && + m_spaceX == 0 && + m_spaceY == 0 ) + { + return; + } + + int size = dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("data less then head size"); + return; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(dat.data()); + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("dat data size err"); + return; + } + DsAbsItem * pData = (DsAbsItem *)(dat.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; + //-------- + + //镜像数值不为0---开始 + // mirror 0, 无镜像; 1, 水平镜像; 2, 垂直镜像; 3, 水平和垂直镜像 + int mirrorx = 1; + int mirrory = 1; + int mirrorr = 1; + + if(mirror == 1 || mirror == 3) + { + mirrorx = -1; + mirrorr = -1; + } + if(mirror == 2 || mirror == 3) + { + mirrory = -1; + mirrorr = -1; + } + + // 镜像文件头转换 + if(mirror != 0) + { + pDsHead->beginX = pDsHead->beginX * mirrorx; + pDsHead->beginY = pDsHead->beginY * mirrory; + } + + // 镜像或列表间距不为0 + if(mirror != 0 || m_spaceX != 0 || m_spaceY != 0) + { + //图形先居中,起始点在加上偏移 + int centerx = (m_maxX + m_minX)/2; + int centery = (m_maxY + m_minY)/2; + + int rx = (pDsHead->beginX - centerx) * mirrorx; + int ry = (pDsHead->beginY - centery) * mirrory; + + int beginx = rx + centerx; + int beginy = ry + centery; + + //用下面两行代码,否则反复方式为Y轴对称或XY对称时不对 + pDsHead->beginX = beginx + m_spaceX; + pDsHead->beginY = beginy + m_spaceY; + } + //镜像数值不为0---结束 + + absDataPtr = pData; + + //镜像有变换时运动步才转换 + double dx, dy, dr; + + if(mirror != 0) + { + for (int i = 0; i < stepsize; i++) + { + // 读入一个针步数据 + dx = absDataPtr->ax; + dy = absDataPtr->ay; + dr = absDataPtr->ar; + + //镜像不为0 + if(mirror != 0) + { + dx = dx * mirrorx; + dy = dy * mirrory; + dr = dr * mirrorr; + } + + absDataPtr->ax = dx; + absDataPtr->ay = dy; + absDataPtr->ar = dr; + + absDataPtr++; + } + } + + return; +} + +int EmbData::calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, DsAbsItem item) +{ + DsAbsItem absItem; + memcpy(&absItem,&item,sizeof(DsAbsItem)); + + s32 dx, dy; + double length; + double tmp; + int count; + int i; + double stepx, stepy; + double sx, sy; + int actx, acty; + double k; + + if(x0 == x1 && y0 == y1) + { + return 0; + } + + if(x0 > x1) + { + sx = -1.0; // x反向 + } + else + { + sx = 1.0; + } + + if(y0 > y1) + { + sy = -1.0; // y反向 + } + else + { + sy = 1.0; + } + + // 开始分割针步 + length = sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)); + + tmp = length/step; /* 实际针步数 */ + count = floor(tmp); /* 最少整针步数 */ + + if (tmp - count > 0.01) + { + count += 1; + } + + if (count == 0 && length > 0) // 短直线 + { + count = 1; + } + + tmp = 0; + actx = x0; + acty = y0; + + if (x1 != x0 && y1 == y0) // 横直线 + { + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count)*sx+x0; // 实际针步 + + stepx = tmp - actx; + dx = (s32)(stepx+0.5*sx); + dy = 0; + actx += dx; + + absItem.ax = actx; + absItem.ay = y0; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else if (x1 == x0 && y1 != y0) // 竖直线 + { + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count)*sy + y0; // 实际针步 + + stepy = tmp - acty; + + dx = 0; + dy = (s32)(stepy+0.5*sy); + acty += dy; + + absItem.ax = x0; + absItem.ay = acty; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else if(x1 != x0 && y1 != y0) // 任意斜线 + { + k = (y1-y0)/(x1-x0); + for (i = 0; i < count; i++) + { + tmp = ((i+1)*(length)/count); + + stepx = fabs(tmp*cos(atan(k)))*sx + x0; // 实际针步x + stepy = fabs(tmp*sin(atan(k)))*sy + y0; // 实际针步y + + dx = (s32)(stepx-actx+0.5*sx); + dy = (s32)(stepy-acty+0.5*sy); + + actx += dx; + acty += dy; + + absItem.ax = actx; + absItem.ay = acty; + absAry.append((char*)&absItem,sizeof(DsAbsItem)); + } + } + else + { + printf("what's this?\n"); + } + + return count; +} + +//花版的定位点为绝对坐标数据点,起始点为相对于定位点的相对坐标点,第一针为相对于起始点的坐标点 +//有的花版起始点有偏移量,第一针偏移量为0,有的花版起始点偏移量为0,第一针有偏移量 +//所以ds16文件头定位点坐标就是花版中的定位点,起始点坐标为花版中的定位点坐标+起始点坐标+第一针的坐标,同时ds16数据的第一针坐标偏移应置为0 +//生成DS16数据 +int EmbData::createEmbDs16FromAbs() +{ + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + createEmbDs16FromAbsDoubleHeadComb(); + return 0; + } + + if (m_editedflag != 0) + { + m_minX = S32_MAX; + m_maxX = S32_MIN; + m_minY = S32_MAX; + m_maxY = S32_MIN; + + m_embDs16Data.clear(); + + char fileName[32]; + memset(fileName,0,sizeof(fileName)); + QByteArray tgtdsdat; + tgtdsdat.clear(); + + int colornum = 1; + int jumpNeedleNum = 0;//跳针数 + int totalstepsize = 0; + memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead)); + + const QByteArray & ary = m_embAbsData; + int size = ary.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data()); + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + // 文件名称 + QString str = QString::fromLocal8Bit(pDsHead->fileName); + QTextCodec * gbkCodec = QTextCodec::codecForName("GBK"); + QByteArray name; + if (gbkCodec != NULL) + { + name = gbkCodec->fromUnicode(str); + } + else + { + name = str.toLocal8Bit(); + } + //memcpy(fileName,pDsHead->fileName,sizeof(pDsHead->fileName)); + memcpy(fileName,name,name.size()); + + int minx = absDataPtr->ax; + int maxx = absDataPtr->ax; + int miny = absDataPtr->ay; + int maxy = absDataPtr->ay; + + int actx = 0; + int acty = 0; + int actr = 0; + int beginx = 0; + int beginy = 0; + int beginr = 0; + double absAr = 0; + + // 数据区 + qDebug()<<"stepsize:"<ctrl; + u8 attrByte = absDataPtr->attr;//绝对数据的属性字节 + + WORD actionWord = absDataPtr->action; + + double ax = absDataPtr->ax;//绝对数据的X位置 + double ay = absDataPtr->ay; + double ar = absDataPtr->ar; + + // qDebug()<< " index(absDataPtr->ar j ) : " << j << " : "<< absDataPtr->ar; + + // 轮廓 + if (minx > ax) { minx = ax; } + if (maxx < ax) { maxx = ax; } + if (miny > ay) { miny = ay; } + if (maxy < ay) { maxy = ay; } + + if (j == 0)//第一针 + { + beginx = ax; + beginy = ay; + beginr = ar; + absAr += beginr; + //qDebug()<<"absAr"<ar - pDsHead->beginR + //如果beginR等于第一针的角度,那么第一针的ddr就应该是0 + ddr = 0; + + //过滤掉空针 +// if(ddx == 0 && ddy == 0 && ddr == 0) +// { +// absDataPtr++; +// continue; +// } + } + else + { + ddx = ax - actx; + ddy = ay - acty; + ddr = ar - actr; + + //起始角度,因为切刀的最初角度是0,如果第一个数据有坐标值变化,要算起始角度 +// if(firstXYFlag == 0 && (ddx != 0 || ddy != 0) && g_emMacType == MACHINE_CUTTINGWALK) +// { +// double tar = atan2(ddy,ddx); +// beginr = (tar * 10000+0.5*(tar>0?1:-1)); +// firstXYFlag = 1; +// } + } + + if( ctrlByte == DATA_END || + ctrlByte == DATA_PAUSE || + ctrlByte == DATA_CHGND || + ctrlByte == DATA_CUTTRD || + ctrlByte == DATA_ANGLE || + ctrlByte == DATA_SYNCOFST || + 0 ) + { + ddx = 0; + ddy = 0; + ddr = 0; + } + + s32 dx = ddx; + s32 dy = ddy; + s32 dr = ddr; + + actx += ddx; + acty += ddy; + actr += ddr; + + while (dr < -PI10000) + { + dr += PI20000; + } + while (dr > PI10000) + { + dr -= PI20000; + } + + //剪线码必须有 + if (ctrlByte == DATA_END || ctrlByte == DATA_NULL) + { + dx = dy = dr = len = 0; + // 增加剪线 + ds16Item.ctrl = DATA_CUTTRD; + ds16Item.attr = 0; + ds16Item.action[0] = 0; + ds16Item.action[1] = 0; + ds16Item.dx = 0; + ds16Item.dy = 0; + ds16Item.dr = 0; + ds16Item.len = 0; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item)); + totalstepsize++; + + absAr += ds16Item.dr; + //qDebug()<<"absAr"< 0) + { + maxStep = m_ritStepSize + 100.0; + } + } + + //如果dx或dy数值太大时,平方会超出double范围,所以先都除以100再乘以10000 + double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0); + //if( 0 && xyLen > maxStep && ctrlByte == DATA_SEWING) + if(xyLen > maxStep) + { + int addx{0},addy{0}; + + //分割针步 + double splitVal = 400.0;//分割针步为400 + if(m_ritStepSize > 0) + { + splitVal = m_ritStepSize; + } + + s32 stepNum = xyLen / splitVal;//拆分几步 + + double lastStep = (double)((int)xyLen % (int)splitVal); + + if(lastStep != 0) + { + stepNum += 1; + splitVal = xyLen / stepNum; + } + + for(int m = 0; m < stepNum; m++) + { + double stepX = 0; + double stepY = 0; + double stepDr = 0; + memset(&ds16Item,0,sizeof(Ds16Item));//初始化结构体 + + stepX = dx * splitVal / xyLen; + stepY = dy * splitVal / xyLen; + + if(m == 0) + { + stepDr = dr; + } + + ds16Item.dx = qRound(stepX);//四舍五入 + ds16Item.dy = qRound(stepY); + + if (m == stepNum-1) + {// 最后一针,消除累计误差 + ds16Item.dx = dx - addx; + ds16Item.dy = dy - addy; + } + + addx += ds16Item.dx; + addy += ds16Item.dy; + + ds16Item.ctrl = ctrlByte; + len = sqrt(ds16Item.dx*ds16Item.dx + ds16Item.dy*ds16Item.dy); + ds16Item.attr = attrByte; + ds16Item.action[0] = 0; + ds16Item.action[1] = 0; + ds16Item.dr = stepDr; + ds16Item.len = len; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item)); + totalstepsize++; + + absAr += ds16Item.dr; + //qDebug()<<"absAr"< minx) { m_minX = minx; } + if (m_minX > maxx) { m_minX = maxx; } + if (m_maxX < minx) { m_maxX = minx; } + if (m_maxX < maxx) { m_maxX = maxx; } + if (m_minY > miny) { m_minY = miny; } + if (m_minY > maxy) { m_minY = maxy; } + if (m_maxY < miny) { m_maxY = miny; } + if (m_maxY < maxy) { m_maxY = maxy; } + + // 针数 + int newstepnum = tgtdsdat.size() / sizeof(Ds16Item); + + if (newstepnum > 0) + { + // 修改文件头 +// int namelen = name.size(); +// if (namelen > HEAD_NAME_STR_LEN) +// { +// namelen = HEAD_NAME_STR_LEN; +// } + +// QByteArray array = name.toLocal8Bit().data(); +// int asize = array.length(); + memcpy(m_pEmbDs16Head->fileName, fileName, sizeof(m_pEmbDs16Head->fileName)); // 文件名称 + m_pEmbDs16Head->dataSize = newstepnum*sizeof(Ds16Item); // 数据字节数 + m_pEmbDs16Head->itemNums = newstepnum; // 数据项个数 + m_pEmbDs16Head->bytesPerItem = sizeof(Ds16Item); // 每项占的字节数 + m_pEmbDs16Head->bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(tgtdsdat.data()) , m_pEmbDs16Head->dataSize); // 数据累加校验和 + m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + m_pEmbDs16Head->fileid = m_pEmbDs16Head->checkCrc; + + m_pEmbDs16Head->anchorX = pDsHead->anchorX; // 定位点坐标X + m_pEmbDs16Head->anchorY = pDsHead->anchorY; // 定位点坐标Y, 设置为0,作为基准 + m_pEmbDs16Head->beginX = beginx; // 数据起点坐标X + m_pEmbDs16Head->beginY = beginy; // 数据起点坐标Y + m_pEmbDs16Head->beginR = beginr; // 数据起点坐标R //-rq + m_pEmbDs16Head->minX = minx; + m_pEmbDs16Head->maxX = maxx; + m_pEmbDs16Head->minY = miny; + m_pEmbDs16Head->maxY = maxy; // 轮廓范围,使用重新计算之后的值 + qDebug() << "m_pEmbDs16Head->beginR " << m_pEmbDs16Head->beginR ; + + qDebug() << "--------m_pEmbDs16Head->beginX = beginx " << m_pEmbDs16Head->beginX ; + qDebug() << "--------m_pEmbDs16Head->beginY = beginy " << m_pEmbDs16Head->beginY ; + qDebug() << "--------m_pEmbDs16Head->minX = minx; " << m_pEmbDs16Head->minX ; + qDebug() << "--------m_pEmbDs16Head->maxX = maxx; " << m_pEmbDs16Head->maxX ; + qDebug() << "--------m_pEmbDs16Head->minY = miny; " << m_pEmbDs16Head->minY ; + qDebug() << "--------m_pEmbDs16Head->maxY = maxy; " << m_pEmbDs16Head->maxY ; + //中间数据的文件头 + + // 添加文件头 + m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中 + // 添加文件数据 + m_embDs16Data.append(tgtdsdat); + } + +#if(1) + if(m_filePath.length() > 0) + { + //保存成ds16文件 + QString ds16FilePath = m_filePath + ".ds16"; + QFile file(ds16FilePath); + + if(file.exists())//存在ds16文件 + { + QFile::remove(ds16FilePath); + } + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << m_filePath; + return -1; + } + else + { + file.write(m_embDs16Data); + file.close(); + } + } +#endif + } + + m_editedflag = 0; + + return 0; +} + +int EmbData::createEmbDs16FromAbsDoubleHeadComb() +{ + if (m_editedflag != 0) + { + m_embDs16Data.clear(); + + QByteArray tgtdsdat; + tgtdsdat.clear(); + + int colornum = 1; + int jumpNeedleNum = 0;//跳针数 + int totalstepsize = 0; + memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead)); + + const QByteArray & ary = m_embAbsData; + int size = ary.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data()); + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("absdat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("absdat data size err"); + return -1; + } + DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead)); + DsAbsItem * absDataPtr = pData; //中间数据针步 + + // 文件名称 + QString name = QString::fromLocal8Bit(pDsHead->fileName); + + //机头2与机头1的偏差 + double secOftX = pDsHead->beginX2 - pDsHead->beginX; + double secOftY = pDsHead->beginY2 - pDsHead->beginY; + + int actx = 0; + int acty = 0; + int actr = 0; + + int actx2 = 0; + int acty2 = 0; + + u8 preCtrlLeft,preCtrlRight; + preCtrlLeft = preCtrlRight = 0; + + // 数据区 + qDebug()<<"stepsize:"<ctrl; + u8 attrByte = absDataPtr->attr;//绝对数据的属性字节 + + WORD actionWord = absDataPtr->action; + + double ax = absDataPtr->ax;//绝对数据的X位置 + double ay = absDataPtr->ay; + double ar = absDataPtr->ar; + +#if(0) + if(j >= 1150) + { + int a = 0; + a = 1; + } +#endif + +#if(0) + if(ctrlByte == DATA_CUTTRD || ctrlByte == DATA_CUTTER_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_MIRROR_OFT_SEC) + { + int a = 0; + a = 1; + } +#endif + +#if(0) + if(totalstepsize >= 2960) + { + int a = 0; + a = 1; + } +#endif + + if (j == 0)//第一针 + { + //起始为第二机头数据 + if(ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SEWING_R) + { + actx2 = ax; + acty2 = ay; + + actx = ax - secOftX;//反着来 + acty = ay + secOftY; + } + else + { + actx = ax; + acty = ay; + + actx2 = ax + secOftX; + acty2 = ay - secOftY;//因为双头组合机型Y数据方向取反了,所以这里用减 + } + + actr = ar; + + ddx = 0; + ddy = 0; + //让ddr等于0,因为在datafiledsr中将beginR置为0而非第一针的角度,所以不应该用 absDataPtr->ar - pDsHead->beginR + //如果beginR等于第一针的角度,那么第一针的ddr就应该是0 + ddr = 0; + + //过滤掉空针 + if(ddx == 0 && ddy == 0) + { + absDataPtr++; + actr = absDataPtr->ar; + continue; + } + } + else + { + ddx = ax - actx; + ddy = ay - acty; + ddr = ar - actr; + } + + int flag = 0; + //左机头当前针步属性不为缝纫,且上一针步属性为缝纫时插入剪线码 + if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC) + { + if(preCtrlLeft == DATA_SEWING || preCtrlLeft == DATA_SYNCSEW || preCtrlLeft == DATA_MIRROR_SEC) + { + Ds16Item *firstDs16Ptr = (Ds16Item*)(tgtdsdat.data()); + Ds16Item *ds16Ptr = (Ds16Item*)(tgtdsdat.data() + tgtdsdat.size() - sizeof(Ds16Item)); + int idx = 0; + while(1) + { + if(ds16Ptr <= firstDs16Ptr) + { + break; + } + if(ds16Ptr->ctrl == DATA_CUTTRD) + { + break; + } + if(ds16Ptr->ctrl == DATA_SEWING || ds16Ptr->ctrl == DATA_SYNCSEW || ds16Ptr->ctrl == DATA_MIRROR_SEC) + { + Ds16Item item; + memset(&item,0,sizeof(Ds16Item)); + item.ctrl = DATA_CUTTRD; + tgtdsdat.insert(tgtdsdat.size()-idx*sizeof(Ds16Item),(char*)&item,sizeof(Ds16Item)); + totalstepsize++; + flag |= 0x01; + break; + } + ds16Ptr--; + idx++; + } + } + } + + //右机头当前针步属性不为缝纫,且上一针步属性为缝纫时插入剪线码 + if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC) + { + if(preCtrlRight == DATA_SEWING_R || preCtrlRight == DATA_SYNCSEW || preCtrlRight == DATA_MIRROR_SEC) + { + Ds16Item *firstDs16Ptr = (Ds16Item*)(tgtdsdat.data()); + Ds16Item *ds16Ptr = (Ds16Item*)(tgtdsdat.data() + tgtdsdat.size() - sizeof(Ds16Item)); + int idx = 0; + while(1) + { + if(ds16Ptr <= firstDs16Ptr) + { + break; + } + if(ds16Ptr->ctrl == DATA_CUTTER_SEC) + { + break; + } + if(ds16Ptr->ctrl == DATA_SEWING_R || ds16Ptr->ctrl == DATA_SYNCSEW || ds16Ptr->ctrl == DATA_MIRROR_SEC) + { + flag |= 0x02; + + //都插入了剪线码 + if(flag == 0x03) + { + Ds16Item *item = (Ds16Item *)(tgtdsdat.data() + tgtdsdat.size()-sizeof(Ds16Item)); + while(1) + { + if(item <= firstDs16Ptr) + { + break; + } + if(item->ctrl == DATA_SYNC_CUTTER) + { + break; + } + if(item->ctrl == DATA_CUTTRD) + { + item->ctrl = DATA_SYNC_CUTTER; + preCtrlLeft = DATA_SYNC_CUTTER; + preCtrlRight = DATA_SYNC_CUTTER; + break; + } + item--; + } + } + else + { + Ds16Item item; + memset(&item,0,sizeof(Ds16Item)); + item.ctrl = DATA_CUTTER_SEC; + tgtdsdat.insert(tgtdsdat.size()-idx*sizeof(Ds16Item),(char*)&item,sizeof(Ds16Item)); + totalstepsize++; + } + + break; + } + ds16Ptr--; + idx++; + } + } + } + + //第一机头偏移 + if(ctrlByte == DATA_OFFSET) + { + ddx = ax - actx; + ddy = ay - acty; + } + + //第一机头缝纫 + if(ctrlByte == DATA_SEWING) + { + ddx = ax - actx; + ddy = ay - acty; + } + + //第二机头偏移 + if(ctrlByte == DATA_OFFSET_SEC) + { + // actx2 = ax; + // acty2 = ay; + + ddx = ax - actx2; + ddy = ay - acty2; + } + + //第二机头缝纫 + if(ctrlByte == DATA_SEWING_R) + { + ddx = ax - actx2; + ddy = ay - acty2; + } + + ddr = ar - actr; + + if( ctrlByte == DATA_END || + ctrlByte == DATA_PAUSE || + ctrlByte == DATA_CHGND || + ctrlByte == DATA_CUTTRD || + ctrlByte == DATA_SYNC_CUTTER || + ctrlByte == DATA_CUTTER_SEC || + ctrlByte == DATA_ANGLE || + 0 ) + { + if( ctrlByte == DATA_CUTTRD || + ctrlByte == DATA_SYNC_CUTTER || + ctrlByte == DATA_CUTTER_SEC || + 0 ) + { +#if(0) + //这段代码要注意,因为可能打版就打了剪线码,则这个剪线码就不能去掉 + int rmFlag = 0; + DsAbsItem * tempPtr = absDataPtr; + while(1) + { + if(tempPtr->ctrl != DATA_CUTTRD && tempPtr->ctrl != DATA_SYNC_CUTTER && tempPtr->ctrl != DATA_CUTTER_SEC) + { + tempPtr++; + if(tempPtr->ctrl != DATA_OFFSET && tempPtr->ctrl != DATA_SECF_OFST && + tempPtr->ctrl != DATA_SYNCOFST && tempPtr->ctrl != DATA_MIRROR_OFT_SEC) + { + rmFlag = 1; + } + break; + } + tempPtr++; + } + if(rmFlag == 1) + { + //如果为剪线码,判断距离上一个点是否很接近,如果很接近,就不要把这个剪线码添加到ds16数据中, + //因为打版时会有左右机头打断的操作,就会插入剪线码,其实这个地方不需要剪线 + double xyLen = sqrt((ddx/100.0*ddx/100.0)*10000.0+ (ddy/100.0*ddy/100.0)*10000.0); + if(xyLen <= 100)//小于等于1mm + { + absDataPtr++; + continue; + } + } +#endif + } + + ddx = 0; + ddy = 0; + ddr = 0; + } + + s32 dx = ddx; + s32 dy = ddy; + s32 dr = ddr; + + if(ctrlByte != DATA_OFFSET_SEC && ctrlByte != DATA_SEWING_R) + // if(ctrlByte == DATA_SEWING || ctrlByte == DATA_OFFSET || + // ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_SEC || + // ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNCSEW)//左机头 + { + actx += ddx; + acty += ddy; + actr += ddr; + } + + if(ctrlByte != DATA_OFFSET && ctrlByte != DATA_SEWING) + // if(ctrlByte == DATA_SEWING_R || ctrlByte == DATA_OFFSET_SEC || + // ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_SEC || + // ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNCSEW)//右机头 + { + if(ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC) + { + actx2 -= ddx; + } + else + { + actx2 += ddx; + } + acty2 += ddy; + } + + while (dr < -PI10000) + { + dr += PI20000; + } + while (dr > PI10000) + { + dr -= PI20000; + } + + //如果为偏移针步,dx和dy都接近于0,则ds16数据不添加此针步 + if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC) + { + double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0); + if(xyLen <= m_oftNeedleSize)//小于等于 + { + absDataPtr++; + continue; + } + } + + //剪线码必须有-判断前一针不为剪线码时才加剪线码 + if (ctrlByte == DATA_END || ctrlByte == DATA_NULL) + { + absDataPtr--; + u8 preCtrlByte = absDataPtr->ctrl; + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + if(preCtrlByte != DATA_SYNC_CUTTER) + { + dx = dy = dr = len = 0; + // 增加剪线 + ds16Item.ctrl = DATA_SYNC_CUTTER; + ds16Item.attr = 0; + ds16Item.action[0] = 0; + ds16Item.action[1] = 0; + ds16Item.dx = 0; + ds16Item.dy = 0; + ds16Item.dr = 0; + ds16Item.len = 0; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item)); + totalstepsize++; + } + } + else + { + if(preCtrlByte != DATA_CUTTRD) + { + dx = dy = dr = len = 0; + // 增加剪线 + ds16Item.ctrl = DATA_CUTTRD; + ds16Item.attr = 0; + ds16Item.action[0] = 0; + ds16Item.action[1] = 0; + ds16Item.dx = 0; + ds16Item.dy = 0; + ds16Item.dr = 0; + ds16Item.len = 0; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item)); + totalstepsize++; + } + } + absDataPtr++; + } + + //分割针步 + double maxStep = 800.0; + //如果dx或dy数值太大时,平方会超出double范围,所以先都除以100再乘以10000 + double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0); + //if( 0 && xyLen > maxStep && ctrlByte == DATA_SEWING) + if(xyLen > maxStep) + { + int addx{0},addy{0}; + + //分割针步 + double splitVal = 400.0;//分割针步为400 + + s32 stepNum = xyLen / splitVal;//拆分几步 + double lastStep = (double)((int)xyLen % (int)splitVal); + double addStep = lastStep / stepNum; + + for(int m = 0; m < stepNum; m++) + { + double stepX = 0; + double stepY = 0; + double stepDr = 0; + memset(&ds16Item,0,sizeof(Ds16Item));//初始化结构体 + + stepX = dx * splitVal / xyLen + dx * addStep / xyLen; + stepY = dy * splitVal / xyLen + dy * addStep / xyLen; + + if(m == 0) + { + stepDr = dr; + } + + ds16Item.dx = qRound(stepX);//四舍五入 + ds16Item.dy = qRound(stepY); + + if (m == stepNum-1) + {// 最后一针,消除累计误差 + ds16Item.dx = dx - addx; + ds16Item.dy = dy - addy; + } + + addx += ds16Item.dx; + addy += ds16Item.dy; + + ds16Item.ctrl = ctrlByte; + len = sqrt(ds16Item.dx*ds16Item.dx + ds16Item.dy*ds16Item.dy); + ds16Item.attr = attrByte; + ds16Item.action[0] = 0; + ds16Item.action[1] = 0; + ds16Item.dr = stepDr; + ds16Item.len = len; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item)); + totalstepsize++; + } + } + else + { + len = sqrt(dx*dx + dy*dy); + ds16Item.ctrl = ctrlByte; + ds16Item.attr = attrByte; + + memcpy(ds16Item.action,&actionWord,sizeof(actionWord)); + + ds16Item.dx = dx; + ds16Item.dy = dy; + ds16Item.dr = dr; + ds16Item.len = len; + memset(ds16Item.rev,0,sizeof(ds16Item.rev)); + + if(dx == 0 && dy == 0 && ctrlByte == DATA_MILLING) + { + + } + else + { + tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));//ds16针步 + totalstepsize++; + } + } + + if (ctrlByte == DATA_CHGND) + { + colornum++; + } + + if (ctrlByte == DATA_OFFSET || ctrlByte == DATA_SYNCOFST) + { + jumpNeedleNum++;//跨步总数加1 + } + + //第一机头的属性 + if(ctrlByte == DATA_SEWING || ctrlByte == DATA_OFFSET + || ctrlByte == DATA_SYNCSEW || ctrlByte == DATA_SYNCOFST || + ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_CUTTRD) + { + preCtrlLeft = ctrlByte; + } + + //第二机头的属性 + if(ctrlByte == DATA_SEWING_R || ctrlByte == DATA_OFFSET_SEC + || ctrlByte == DATA_SYNCSEW || ctrlByte == DATA_SYNCOFST || + ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_CUTTER_SEC) + { + preCtrlRight = ctrlByte; + } + + absDataPtr++; + } + + // 针数 + int newstepnum = tgtdsdat.size() / sizeof(Ds16Item); + + if (newstepnum > 0) + { + // 修改文件头 + int namelen = name.size(); + if (namelen > HEAD_NAME_STR_LEN) + { + namelen = HEAD_NAME_STR_LEN; + } + + QByteArray array = name.toLocal8Bit().data(); + int asize = array.length(); + memcpy(m_pEmbDs16Head->fileName, array, asize); // 文件名称 + m_pEmbDs16Head->dataSize = newstepnum*sizeof(Ds16Item); // 数据字节数 + m_pEmbDs16Head->itemNums = newstepnum; // 数据项个数 + m_pEmbDs16Head->bytesPerItem = sizeof(Ds16Item); // 每项占的字节数 + m_pEmbDs16Head->bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(tgtdsdat.data()) , m_pEmbDs16Head->dataSize); // 数据累加校验和 + m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + m_pEmbDs16Head->fileid = m_pEmbDs16Head->checkCrc; + + m_pEmbDs16Head->anchorX = pDsHead->anchorX; // 定位点坐标X + m_pEmbDs16Head->anchorY = pDsHead->anchorY; // 定位点坐标Y, 设置为0,作为基准 + m_pEmbDs16Head->beginX = pDsHead->beginX; // 数据起点坐标X + m_pEmbDs16Head->beginY = pDsHead->beginY; // 数据起点坐标Y + m_pEmbDs16Head->beginR = pDsHead->beginR; // 数据起点坐标R + m_pEmbDs16Head->beginX2 = pDsHead->beginX2; // 数据起点坐标X + m_pEmbDs16Head->beginY2 = pDsHead->beginY2; // 数据起点坐标Y + m_pEmbDs16Head->beginR2 = pDsHead->beginR2; // 数据起点坐标R + + // 添加文件头 + m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中 + // 添加文件数据 + m_embDs16Data.append(tgtdsdat); + } + + //求边界范围 + calRange(); + + //重新计算角度 + //求dr + Ds16Item * ds16DataPtr; + Ds16Item * pDsData = (Ds16Item *)(tgtdsdat.data()); + ds16DataPtr = pDsData; + int dx,dy; + double tar,ar; + ar = 0; + QList arList; + arList.clear(); + for (int i = 0; i < newstepnum; i++) + { + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + + if(dx == 0 && dy == 0) + { + arList.append(ar); + } + else + { + tar = atan2(dy,dx); + ar = (tar*10000+0.5*(tar>0?1:-1)); + arList.append(ar); + } + + ds16DataPtr++; + } + + double ar2,ar1; + ar2 = ar1 = 0; + ds16DataPtr = pDsData; + for (int i = 0; i < newstepnum; i++) + { + ar2 = arList[i]; + if(i >= 1) + { + ar1 = arList[i-1]; + } + + if(i == 0) + { + ds16DataPtr->dr = ar2; + } + else + { + ds16DataPtr->dr = ar2-ar1; + } + + if(ds16DataPtr->dx == 0 && ds16DataPtr->dy == 0) + { + ds16DataPtr->dr = 0; + } + + while (ds16DataPtr->dr < -PI10000) + { + ds16DataPtr->dr += PI20000; + } + while (ds16DataPtr->dr > PI10000) + { + ds16DataPtr->dr -= PI20000; + } + + ds16DataPtr++; + } + + m_pEmbDs16Head->maxX = m_maxX; + m_pEmbDs16Head->minX = m_minX; + m_pEmbDs16Head->maxY = m_maxY; + m_pEmbDs16Head->minY = m_minY; + m_embDs16Data.clear(); + m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中 + m_embDs16Data.append(tgtdsdat); + +#if(1) + if(m_filePath.length() > 0) + { + //保存成ds16文件 + QString ds16FilePath = m_filePath + ".ds16"; + QFile file(ds16FilePath); + + if(file.exists())//存在ds16文件 + { + QFile::remove(ds16FilePath); + } + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << m_filePath; + return -1; + } + else + { + file.write(m_embDs16Data); + file.close(); + } + } +#endif + } + + m_editedflag = 0; + + return 0; +} + +void EmbData::calRange() +{ + //求最大最小值范围 + m_minX = S32_MAX; + m_maxX = S32_MIN; + m_minY = S32_MAX; + m_maxY = S32_MIN; + + const QByteArray & arry = m_embDs16Data; + int size = arry.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return; + } + DataDs16FileHead *pDsHead = (DataDs16FileHead *)(arry.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pDsData = (Ds16Item *)(arry.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pDsData; + + int secOftX = pDsHead->beginX2 - pDsHead->beginX; + int secOftY = pDsHead->beginY2 - pDsHead->beginY; + + u8 ctrl = 0; + double ax,ay,ax2,ay2; + ax = ay = 0; + ax2 = secOftX; + ay2 = 0 - secOftY;//因为双头组合机型Y数据方向取反了,所以这里用减 + + for (int i = 0; i < stepsize; i++) + { + ctrl = ds16DataPtr->ctrl; + + if(ctrl == DATA_NULL) + { + break; + } + + if(ctrl != DATA_OFFSET_SEC && ctrl != DATA_SEWING_R) + { + ax += ds16DataPtr->dx; + ay += ds16DataPtr->dy; + } + + if(ctrl != DATA_OFFSET && ctrl != DATA_SEWING) + { + if(ctrl == DATA_MIRROR_SEC || ctrl == DATA_MIRROR_OFT_SEC) + { + ax2 = ax2 + (ds16DataPtr->dx * -1); + ay2 += ds16DataPtr->dy; + } + else + { + ax2 += ds16DataPtr->dx; + ay2 += ds16DataPtr->dy; + } + } + + if (m_minX > ax) { m_minX = ax; } + if (m_maxX < ax) { m_maxX = ax; } + if (m_minX > ax2) { m_minX = ax2; } + if (m_maxX < ax2) { m_maxX = ax2; } + + if (m_minY > ay) { m_minY = ay; } + if (m_maxY < ay) { m_maxY = ay; } + if (m_minY > ay2) { m_minY = ay2; } + if (m_maxY < ay2) { m_maxY = ay2; } + + ds16DataPtr++; + } +} + +int EmbData::reCalcDataChecksum() +{ + return 0; +} + +//绘制针数索引的跟踪笔 +void EmbData::drawNeedleIdxPen(int x, int y, QPainter &painter) +{ + //贴图的xy和画笔的xy值相同 + m_penX = x; + m_penY = y; + + m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像 + + QPen pen; + QColor color; + + //绘制深灰色画笔 + pen.setWidth(2); + color.setRgb(60,60,60);//深灰色 + pen.setColor(color); + painter.setPen(pen); + + painter.drawLine(x-4, y-28, x-4, y-8);//画左"|" + painter.drawLine(x+4, y-28, x+4, y-8); //画右"|" + painter.drawEllipse(x-1, y-10, 2, 2);//画中心"°" + painter.drawLine(x-4, y-8, x, y);//画左"\"(笔尖) + painter.drawLine(x+4, y-8, x, y); //画右"/"(笔尖) + + //绘制深红色画笔 + pen.setWidth(1); + color.setRgb(174,60,64);//深红色 + pen.setColor(color); + painter.setPen(pen); + + painter.drawLine(x-3, y-28, x-3, y-8);//画左"|" + painter.drawLine(x+5, y-28, x+5, y-8); //画右"|" + painter.drawEllipse(x-2, y-12, 3, 3);//画中心"°" + painter.drawLine(x-3, y-8, x, y);//画左"\"(笔尖) + painter.drawLine(x+5, y-8, x, y); //画右"/"(笔尖) +} + +void EmbData::drawFork(int x, int y, QPainter &painter) +{ + //贴图的xy和画笔的xy值相同 + m_penX = x; + m_penY = y; + + m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像 + + QPen pen; + QColor color; + + //绘制深灰色画笔 + pen.setWidth(2); + color.setRgb(228,42,48); + pen.setColor(color); + painter.setPen(pen); + + painter.drawLine(x-8, y-8, x-3, y-3);// \上一半 + painter.drawLine(x+8, y-8, x+3, y-3);// /上一半 + + painter.drawLine(x+3, y+3, x+8, y+8); + painter.drawLine(x-3, y+3, x-8, y+8); +} + +/** + * @brief 绘制多头机的跟踪标致 + */ +void EmbData::drawFork(int x, int y, QPainter &painter, int index) +{ + m_penPoint[index].setX(x); + m_penPoint[index].setY(y); + + m_penHeadPix[index] = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像 + + QPen pen; + QColor color; + + //绘制深灰色画笔 + pen.setWidth(2); + color.setRgb(228,42,48); + pen.setColor(color); + painter.setPen(pen); + + painter.drawLine(x-8, y-8, x-3, y-3);// \上一半 + painter.drawLine(x+8, y-8, x+3, y-3);// /上一半 + + painter.drawLine(x+3, y+3, x+8, y+8); + painter.drawLine(x-3, y+3, x-8, y+8); +} + +void EmbData::drawForkDoubleHead(int x, int y, int x2, int y2, QPainter &painter) +{ + //贴图的xy和画笔的xy值相同 + m_penX = x; + m_penY = y; + + m_penXY2.setX(x2); + m_penXY2.setY(y2); + + m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像 + m_penPix2 = m_canvas.copy(x2-20,y2-30,40,40);//复制画笔区域未绘制笔之前的图像 + + QPen pen; + QColor color; + + //绘制深灰色画笔 + pen.setWidth(2); + color.setRgb(228,42,48); + pen.setColor(color); + painter.setPen(pen); + + painter.drawLine(x-8, y-8, x-3, y-3);// \上一半 + painter.drawLine(x+8, y-8, x+3, y-3);// /上一半 + + painter.drawLine(x+3, y+3, x+8, y+8); + painter.drawLine(x-3, y+3, x-8, y+8); + + painter.drawLine(x2-8, y2-8, x2-3, y2-3);// \上一半 + painter.drawLine(x2+8, y2-8, x2+3, y2-3);// /上一半 + + painter.drawLine(x2+3, y2+3, x2+8, y2+8); + painter.drawLine(x2-3, y2+3, x2-8, y2+8); +} + +//擦除针数索引的跟踪笔 +void EmbData::eraseNeedleIdxPen(QPainter &painter) +{ + //贴图的xy和画笔的xy值相同 + painter.drawPixmap(m_penX-20,m_penY-30,m_penPix); +} + +void EmbData::eraseNeedleIdxPen(QPainter &painter, int index) +{ + painter.drawPixmap(m_penPoint[index].x()-20,m_penPoint[index].y()-30,m_penHeadPix[index]); +} + +void EmbData::eraseNeedleIdxPenDoubleHead(QPainter &painter) +{ + //贴图的xy和画笔的xy值相同 + painter.drawPixmap(m_penX-20,m_penY-30,m_penPix); + painter.drawPixmap(m_penXY2.x()-20,m_penXY2.y()-30,m_penPix2); +} + +bool EmbData::isFlipDispYMac() +{ + if(g_emMacType == MACHINE_THICK_WIRING || + g_emMacType == MACHINE_FLYSHUTTLE || + g_emMacType == MACHINE_GLASSFIBRE || + g_emMacType == MACHINE_DOUBLE_LAYERED || + g_emMacType == MACHINE_L2000_MULTI || + g_emMacType == MACHINE_AutoDoubleDoor || + g_emMacType == MACHINE_FULLYAUTOMATIC || + g_emMacType == MACHINE_HIGHSPEEDSINGLEQUI || + g_emMacType == MACHINE_DOUBLEHEADQUI || + g_emMacType == MACHINE_CUTTINGWALK || + g_emMacType == MACHINE_FOURHEADQUI) + return true; + else + return false; +} + +bool EmbData::isFlipDispXMac() +{ + return false; +} + +void EmbData::getCurvePointFillLine(QList &inList, double indRunLen, QList &outList) +{ + DsAbsItem dPoint1, dPoint2, dPoint3; + double dTatol, dLen1, dLen2, dSpace; + long lSum, lCount; + + //计算总的线段长 + int iCountPoint = inList.size(); + if(iCountPoint <= 0) + { + return; + } + + getTotalDistanceFillLine(&inList, dTatol); + if(dTatol == 0) + return; + + lSum = (long)round(dTatol / indRunLen + 0.1667); + dSpace = dTatol / (double)lSum; + if(lSum == 0) + lSum = 1; + + dPoint1 = inList[0]; + outList.append(dPoint1);//添加第一个点 + dPoint2 = dPoint1; + + dLen1 = dSpace; + dLen2 = 0; + int i = 0; + for(lCount = 0; lCount < lSum; lCount++) + { + while(i < inList.size()-1 && dLen2 < dLen1) + { + dLen1 -= dLen2; + dPoint1 = dPoint2; + i++; + dPoint2 = inList[i]; + dLen2 = sqrt((dPoint1.ax - dPoint2.ax) * (dPoint1.ax - dPoint2.ax) + (dPoint1.ay - dPoint2.ay) * (dPoint1.ay - dPoint2.ay)); + if(dPoint2.ctrl == DATA_CUTTRD || dPoint2.ctrl == DATA_SYNC_CUTTER || dPoint2.ctrl == DATA_CUTTER_SEC) + { + //为剪线码时退出并添加此针步 + break; + } + } + if(dLen1 < dLen2) + { + getPointInSectFillLine(dPoint1, dPoint2, dLen1, dPoint3); + } + else + { + dPoint3 = dPoint2; + } + outList.append(dPoint3); + dLen2 -= dLen1; + dLen1 = dSpace; + dPoint1 = dPoint3; + } +} + +int EmbData::getTotalDistanceFillLine(QList *pPointList, double &dTotal) +{ + DsAbsItem dPoint, dNext; + double d; + dTotal = 0; + int i = 0; + long lSum = (long)pPointList->count(); + if(lSum > 1) + { + while(i < pPointList->size()) + { + dPoint = pPointList->at(i); + i++; + if(i < pPointList->size()) + { + dNext = pPointList->at(i); + d = sqrt((dPoint.ax - dNext.ax) * (dPoint.ax - dNext.ax) + (dPoint.ay- dNext.ay) * (dPoint.ay- dNext.ay)); + dTotal += d; + } + else + { + break; + } + } + } + return 0; +} + +bool EmbData::getPointInSectFillLine(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp) +{ + bool bRes; + DsAbsItem dpoint[3]; + + dpoint[0] = p1; + dpoint[1] = p2; + dpoint[2] = outp; + outp = dpoint[1]; + + bRes = getPointAtSect(dpoint[0], dpoint[1], d, dpoint[2]); + outp.ax = dpoint[2].ax; + outp.ay = dpoint[2].ay; + + return bRes; +} + +bool EmbData::getPointAtSect(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp) +{ + double s = sqrt((p1.ax - p2.ax) * (p1.ax - p2.ax) + (p1.ay - p2.ay) * (p1.ay - p2.ay)); + if(fabs(s) < ZERO) + { + if(d < ZERO) + { + outp.ax = p1.ax; + outp.ay = p1.ay; + } + return false; + } + outp.ax = (p2.ax - p1.ax) * d / s + p1.ax; + outp.ay = (p2.ay - p1.ay) * d / s + p1.ay; + + return true; +} + +bool EmbData::checkData(int size) +{ + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("ary data less then head size"); + return false; + } + int datasize = size - sizeof(DataDs16FileHead); + int stepsize = datasize/sizeof(DsAbsItem); + if (stepsize <= 0) + { + qDebug("dat data size err"); + return false; + } + return true; +} + +//设置视图尺寸(透明背景) +int EmbData::setViewInfo(int width, int height) +{ + // if (m_viewWidth != width || + // m_viewHight != height) + { + if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2) + { + return -1; + } + m_viewWidth = width; + m_viewHight = height; + m_canvas = QPixmap(m_viewWidth, m_viewHight); + m_canvas.fill(Qt::transparent);//用透明色填充 + //memset(m_canvas.bits(), 0x00, m_canvas.byteCount()); + } + return 0; +} + +//设置视图(带背景图片背景) +void EmbData::setViewInfo(QPixmap pix) +{ + m_canvas = pix; +} + +//重置数据 +void EmbData::setEmbData(int type, int redraw) +{ + m_type = type; + createDispFromEmbDs16Dat(m_embDs16Data); + if (redraw != 0) + { + drawImageByDispFile(); + } +} + +void EmbData::setDispMode(EmbData::DISP_MODE dispmode, int redraw) +{ + m_dispMode = dispmode; + if(redraw != 0) + { + drawImageByDispFile(); + } +} + +void EmbData::setDrawMode(EmbData::DRAW_MODE drawmode) +{ + m_drawMode = drawmode; +} + +//设置进度显示数据 +void EmbData::setExecIndex(int index) +{ + m_stitchIndex = index; + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + //实时刷新最后一个图形 + int num = m_dispDat.size() / sizeof(DispItem); + num -= m_pEmbDs16Head->itemNums; + num += index; + m_stitchIndex = num; + } + + if (m_dispMode == DISP_EXECING) + { + drawImageByDispFile(); + } +} + +void EmbData::reDraw() +{ + drawImageByDispFile(); +} + +//创建显示用的数据(为了快速显示) +int EmbData::createDispFromEmbDs16Dat(QByteArray &ds16dat) +{ + if(m_type == MACHINE_FIVEHEADPRECISIONSEWING) + return createDispFromEmbDs16DatForHeadInfo(ds16dat); + + if(m_type == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + return createDispFromEmbDs16DatDoubleHeadComb(ds16dat); + + DispItem dispItem; + m_dispDat.clear();//显示绘图用的数据(需要转换) + + // DsAbsItem absItem;//用于轮廓提取的绝对坐标值 + // m_ds16ToAbsDat.clear();//用于轮廓提取的绝对坐标值 + + m_stitchIndex = 0; + m_dispIndex = 0; + + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + // 图形显示区域 + int width = m_canvas.width();//留4个像素的边 + int height = m_canvas.height();//留4个像素的边 + + if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2) + { + qDebug("preview img too small"); + return -1; + } + + //留边(否则实时跟踪笔会画出界) + int viewSide = EMB_PREVIEW_SIDE; + if(m_drawMode == DRAW_PREVIEW) + { + viewSide = 20;//预览模式时整区域留20像素绘制(原色显示) + } + int dpminx = viewSide; + int dpmaxx = width - viewSide; + int dpminy = viewSide; + int dpmaxy = height - viewSide; + + //1:1显示无需留边 + // int dpminx = 0; + // int dpmaxx = width; + // int dpminy = 0; + // int dpmaxy = height; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数 + temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + m_factor = factor; + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + // 显示花样图形 + u8 ctrlByte; + u8 attrByte; + int dx; + int dy; + int dr; + + double datposx, datposy, datposr; + int curx, cury, curr, prex, prey; + curx = cury = curr = prex = prey = 0; + + datposx = pDsHead->beginX; + datposy = pDsHead->beginY; + datposr = pDsHead->beginR; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if(isFlipDispYMac()) + { + emb_showDirY = -1; + } + + if(isFlipDispXMac()) + { + emb_showDirX = -1; + } + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + for (int i = 0; i < stepsize; i++) + { + prex = curx; + prey = cury; + + // 读入一个针步数据 + ctrlByte = ds16DataPtr->ctrl; + attrByte = ds16DataPtr->attr; + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + dr = ds16DataPtr->dr; + + datposx += dx; + datposy += dy; + datposr += dr; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + while(datposr >= PI10000) + { + datposr -= (PI20000-1); + } + while(datposr <= -PI10000) + { + datposr += (PI20000-1); + } + + dispItem.ctrl = ctrlByte; + dispItem.attr = attrByte; + dispItem.bx = prex; + dispItem.by = prey; + dispItem.ex = curx; + dispItem.ey = cury; + dispItem.ar = curr; + + if(g_emMacType == MACHINE_CUTTINGWALK) + { + //边走边裁 + if(ctrlByte ==DATA_OFFSET) //跨步(偏移)针步另一种颜色显示 + dispItem.rgb = Qt::transparent; + if(ctrlByte ==DATA_DRAWING) //画笔 + dispItem.rgb = qRgb(240,155,89); + else if(ctrlByte ==DATA_RKNIFE)//圆刀 + dispItem.rgb = qRgb(0,128,255); + else if(ctrlByte ==DATA_SKNIFE)//震刀 + dispItem.rgb = qRgb(0x35,0xC0,0x5C); + } + else + { + if(ctrlByte == DATA_OFFSET) //跨步(偏移)针步另一种颜色显示 + dispItem.rgb = getJumpedColour(); + else + dispItem.rgb = getSewedColour(); + } + + memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action)); + + m_dispDat.append((char*)(&dispItem), sizeof(DispItem)); + + ds16DataPtr++; + } + + qDebug("CreateDispFromEmbDs16, stepsize=%d", m_dispDat.size() / sizeof(DispItem)); + + return 0; +} + +/** + * @brief EmbData::五头机创建绘图数据 + * @param ds16dat + * @return + */ +int EmbData::createDispFromEmbDs16DatForHeadInfo(QByteArray &ds16dat) +{ + m_headDispDate.clear(); + + DataFileDsr dsr;//可能引起栈内存溢出的问题 + dsr.initFile(m_filePath); + dsr.convertDataToEmbAbs(); + DsrHeadEx62 head = dsr.get62ExHead(); + int StepNum = dsr.getStepNums(); + int maxHSP = findMaxSpHead(head,StepNum); + + Disp_HeadItem dispItem; + m_dispDat.clear();//显示绘图用的数据(需要转换) + + m_stitchIndex = 0; + m_dispIndex = 0; + + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + // 图形显示区域 + int width = m_canvas.width();//留4个像素的边 + int height = m_canvas.height();//留4个像素的边 + if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2) + { + qDebug("preview img too small"); + return -1; + } + + //留边(否则实时跟踪笔会画出界) + int viewSide = EMB_PREVIEW_SIDE; + if(m_drawMode == DRAW_PREVIEW) + { + viewSide = 20;//预览模式时整区域留20像素绘制(原色显示) + } + int dpminx = viewSide; + int dpmaxx = width - viewSide; + int dpminy = viewSide; + int dpmaxy = height - viewSide; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX+(maxHSP*10)-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数 五头机加上一个最大值保证绘图不越界 + temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数 + // 使用较大的缩放系数 + factor = temp >= factor?temp:factor; + m_factor = factor; + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX+(maxHSP*10))/factor)/2);//最大x需要 五头机加上一个最大值保证绘图不越界 + int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + // 显示花样图形 + + double datposx = pDsHead->beginX; + double datposy = pDsHead->beginY; + + int curx = (datposx) / factor + dpx; + int cury = (datposy) / factor + dpy; + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + for (int i = 0; i < stepsize; i++) + { + int prex = curx; + int prey = cury; + + // 读入一个针步数据 + int dx = ds16DataPtr->dx; + int dy = ds16DataPtr->dy; + unsigned short int headSpHndex = ds16DataPtr->action[1] & 0xFF; + + datposx += dx; + datposy += dy; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + + dispItem.ctrl = ds16DataPtr->ctrl; + dispItem.attr = ds16DataPtr->attr; + dispItem.bx = prex; + dispItem.by = prey; + dispItem.ex = curx; + dispItem.ey = cury; + dispItem.ar = ds16DataPtr->dr; + memcpy(&dispItem.action,ds16DataPtr->action,2); + dispItem.headtable.iswork = head.headEnableSpacing[headSpHndex].iswork; + dispItem.headtable.distance1_2 = head.headEnableSpacing[headSpHndex].distance1_2; + dispItem.headtable.distance1_3 = head.headEnableSpacing[headSpHndex].distance1_3; + dispItem.headtable.distance1_4 = head.headEnableSpacing[headSpHndex].distance1_4; + dispItem.headtable.distance1_5 = head.headEnableSpacing[headSpHndex].distance1_5; + dispItem.headtable.distance1_6 = head.headEnableSpacing[headSpHndex].distance1_6; + dispItem.headtable.distance1_7 = head.headEnableSpacing[headSpHndex].distance1_7; + dispItem.headtable.distance1_8 = head.headEnableSpacing[headSpHndex].distance1_8; + if(ds16DataPtr->ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示 + dispItem.rgb = getNoJumpColour(); + else + dispItem.rgb = getNoSewColour(); + + m_headDispDate.append(dispItem); + + ds16DataPtr++; + } + + qDebug() << "createDispFromEmbDs16DatForHeadInfo"<< "CreateDispFromEmbDs16, stepsize="<< m_headDispDate.size(); + + return 0; +} + +int EmbData::createDispFromEmbDs16DatDoubleHeadComb(QByteArray &ds16dat) +{ + DispItem dispItem; + m_dispDat.clear();//显示绘图用的数据(需要转换) + + // DsAbsItem absItem;//用于轮廓提取的绝对坐标值 + // m_ds16ToAbsDat.clear();//用于轮廓提取的绝对坐标值 + + m_stitchIndex = 0; + m_dispIndex = 0; + + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return -1; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return -1; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return -1; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + // 图形显示区域 + int width = m_canvas.width();//留4个像素的边 + int height = m_canvas.height();//留4个像素的边 + + if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2) + { + qDebug("preview img too small"); + return -1; + } + + //留边(否则实时跟踪笔会画出界) + int viewSide = EMB_PREVIEW_SIDE; + if(m_drawMode == DRAW_PREVIEW) + { + viewSide = 20;//预览模式时整区域留20像素绘制(原色显示) + } + int dpminx = viewSide; + int dpmaxx = width - viewSide; + int dpminy = viewSide; + int dpmaxy = height - viewSide; + + //1:1显示无需留边 + // int dpminx = 0; + // int dpmaxx = width; + // int dpminy = 0; + // int dpmaxy = height; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_maxX-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数 + temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + m_factor = factor; + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + if(isFlipDispYMac()) + { + emb_showDirY = -1; + } + + if(isFlipDispXMac()) + { + emb_showDirX = -1; + } + + double secOftX = pDsHead->beginX2 - pDsHead->beginX; + double secOftY = pDsHead->beginY2 - pDsHead->beginY; + + qDebug()<<"secOftX"<ctrl; + attrByte = ds16DataPtr->attr; + dr = ds16DataPtr->dr; + + if(ctrlByte != DATA_OFFSET_SEC && ctrlByte != DATA_SEWING_R)//非右机头偏移和缝纫 + { + prex = curx; + prey = cury; + + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + + datposx += dx; + datposy += dy; + datposr += dr; + + curx = (datposx) / factor + dpx; + cury = (datposy) / factor + dpy; + + if (emb_showDirX == -1) + { + curx = width - curx; + } + if (emb_showDirY == -1) + { + cury = height - cury; + } + } + + if(ctrlByte != DATA_OFFSET && ctrlByte != DATA_SEWING)//非左机头偏移 + { + prex2 = curx2; + prey2 = cury2; + + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + + if(ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC) + { + datposx2 = datposx2 + dx*-1; + datposy2 += dy; + } + else + { + datposx2 += dx; + datposy2 += dy; + } + + curx2 = (datposx2) / factor + dpx; + cury2 = (datposy2) / factor + dpy; + + if (emb_showDirX == -1) + { + curx2 = width - curx2; + } + if (emb_showDirY == -1) + { + cury2 = height - cury2; + } + } + +#if(0) + while(datposr >= PI10000) + { + datposr -= (PI20000-1); + } + while(datposr <= -PI10000) + { + datposr += (PI20000-1); + } +#endif + + dispItem.ctrl = ctrlByte; + dispItem.attr = attrByte; + dispItem.bx = prex; + dispItem.by = prey; + dispItem.ex = curx; + dispItem.ey = cury; + dispItem.bx2 = prex2; + dispItem.by2 = prey2; + dispItem.ex2 = curx2; + dispItem.ey2 = cury2; + dispItem.ar = curr; + + if(dispItem.ctrl == DATA_NULL) + { + dispItem.ex = dispItem.bx; + dispItem.ey = dispItem.by; + dispItem.ex2 = dispItem.bx2; + dispItem.ey2 = dispItem.by2; + } + + if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC) //跨步(偏移)针步另一钟颜色显示 + dispItem.rgb = getJumpedColour(); + else + dispItem.rgb = getSewedColour(); + + memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action)); + m_dispDat.append((char*)(&dispItem), sizeof(DispItem)); + + ds16DataPtr++; + } + + qDebug("CreateDispFromEmbDs16, stepsize=%d", m_dispDat.size() / sizeof(DispItem)); + + return 0; +} + +void EmbData::resetLayoutDispDat(unsigned char *arrayNeedle1, unsigned char *arrayNeedle2, unsigned char *arrayNeedle3, int leftRightNeedleSpace,int needlesSpace,int needleLayoutSpace12,int needleLayoutSpace23,int reDat) +{ + m_dispDat.clear();//显示绘图用的数据(需要转换) + int stepsize = m_oneDispDat.size() / sizeof(DispItem); + + s16 lastNum = 6;//最后一排的循环次数 + int circleNum = 0;//循环次数 + circleNum = (needleLayoutSpace12+needleLayoutSpace23+ (m_maxY - m_minY)*(lastNum+1)) / (m_maxY - m_minY); + + int circleNumMiddle = 0;//循环次数 + circleNumMiddle = (needleLayoutSpace23 + (m_maxY - m_minY)*(lastNum+1)) / (m_maxY - m_minY); + + //根据前中后排的设置,再添加绘制数据 + if(reDat == 0 || reDat == 1) + { + //根据前中后排的设置,重置前排数据 + char frontSet[LAYOUTNEEDLENUM*2]; + memset((char*)frontSet,0,sizeof(frontSet)); + for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + unsigned char val = *(arrayNeedle1+i); + if(val == NEEDLELEFT) + { + frontSet[0+2*i] = 1; + frontSet[1+2*i] = 0; + } + else if(val == NEEDLERIGHT) + { + frontSet[0+2*i] = 0; + frontSet[1+2*i] = 1; + } + else if(val == NEEDLEDOUBLE) + { + frontSet[0+2*i] = 1; + frontSet[1+2*i] = 1; + } + else if(val == NEEDLENONE) + { + frontSet[0+2*i] = 0; + frontSet[1+2*i] = 0; + } + } + + m_dispDatFront.clear(); + DispItem dispItemFront; + double frontSpace = 0; + double frontYSpace = 0; + for(unsigned int i = 0; i < sizeof(frontSet); i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + char val = frontSet[i]; + + if(val == 1) + { + for (int j = 0; j < stepsize; j++) + { + dispItemFront = *pData; + dispItemFront.bx += frontSpace; + dispItemFront.ex += frontSpace; + + if (m_dispMinX > dispItemFront.bx) { m_dispMinX = dispItemFront.bx; } + if (m_dispMinX > dispItemFront.ex) { m_dispMinX = dispItemFront.ex; } + if (m_dispMaxX < dispItemFront.bx) { m_dispMaxX = dispItemFront.bx; } + if (m_dispMaxX < dispItemFront.ex) { m_dispMaxX = dispItemFront.ex; } + //中排和后排无数据时 + if(m_dispDatMiddle.size() <= 0 && m_dispDatBehind.size() <= 0) + { + if (m_dispMinY > dispItemFront.by) { m_dispMinY = dispItemFront.by; } + if (m_dispMinY > dispItemFront.ey) { m_dispMinY = dispItemFront.ey; } + if (m_dispMaxY < dispItemFront.by) { m_dispMaxY = dispItemFront.by; } + if (m_dispMaxY < dispItemFront.ey) { m_dispMaxY = dispItemFront.ey; } + } + + m_dispDatFront.append((char*)(&dispItemFront), sizeof(DispItem)); + pData++; + } + + //Y方向再循环多次 + for(int m = 0; m < circleNum; m++) + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + frontYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY); + for (int j = 0; j < stepsize; j++) + { + dispItemFront = *pData; + dispItemFront.bx += frontSpace; + dispItemFront.ex += frontSpace; + dispItemFront.by -= frontYSpace; + dispItemFront.ey -= frontYSpace; + + if (m_dispMinX > dispItemFront.bx) { m_dispMinX = dispItemFront.bx; } + if (m_dispMinX > dispItemFront.ex) { m_dispMinX = dispItemFront.ex; } + if (m_dispMaxX < dispItemFront.bx) { m_dispMaxX = dispItemFront.bx; } + if (m_dispMaxX < dispItemFront.ex) { m_dispMaxX = dispItemFront.ex; } + //中排和后排无数据时 + if(m_dispDatMiddle.size() <= 0 && m_dispDatBehind.size() <= 0) + { + if (m_dispMinY > dispItemFront.by) { m_dispMinY = dispItemFront.by; } + if (m_dispMinY > dispItemFront.ey) { m_dispMinY = dispItemFront.ey; } + if (m_dispMaxY < dispItemFront.by) { m_dispMaxY = dispItemFront.by; } + if (m_dispMaxY < dispItemFront.ey) { m_dispMaxY = dispItemFront.ey; } + } + + m_dispDatFront.append((char*)(&dispItemFront), sizeof(DispItem)); + pData++; + } + } + } + if(i % 2 == 0) + { + frontSpace += leftRightNeedleSpace; + } + else + { + //frontSpace += leftRightNeedleSpace*3; + frontSpace = (i-i/2)*needlesSpace; + } + } + } + + if(reDat == 0 || reDat == 2) + { + double dispMinY = S32_MAX; + double dispMaxY = S32_MIN; + + //根据前中后排的设置,重置中排数据 + char middleSet[LAYOUTNEEDLENUM*2]; + memset((char*)middleSet,0,sizeof(middleSet)); + for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + unsigned char val = *(arrayNeedle2+i); + if(val == NEEDLELEFT) + { + middleSet[0+2*i] = 1; + middleSet[1+2*i] = 0; + } + else if(val == NEEDLERIGHT) + { + middleSet[0+2*i] = 0; + middleSet[1+2*i] = 1; + } + else if(val == NEEDLEDOUBLE) + { + middleSet[0+2*i] = 1; + middleSet[1+2*i] = 1; + } + else if(val == NEEDLENONE) + { + middleSet[0+2*i] = 0; + middleSet[1+2*i] = 0; + } + } + + m_dispDatMiddle.clear(); + DispItem dispItemMiddle; + double middleSpace = 0; + double middleYSpace = 0; + double ySpace = needleLayoutSpace12; + + for(unsigned int i = 0; i < sizeof(middleSet); i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + char val = middleSet[i]; + + if(val == 1) + { + for (int j = 0; j < stepsize; j++) + { + dispItemMiddle = *pData; + dispItemMiddle.bx += middleSpace; + dispItemMiddle.ex += middleSpace; + dispItemMiddle.by -= ySpace; + dispItemMiddle.ey -= ySpace; + + if (m_dispMinX > dispItemMiddle.bx) { m_dispMinX = dispItemMiddle.bx; } + if (m_dispMinX > dispItemMiddle.ex) { m_dispMinX = dispItemMiddle.ex; } + if (m_dispMaxX < dispItemMiddle.bx) { m_dispMaxX = dispItemMiddle.bx; } + if (m_dispMaxX < dispItemMiddle.ex) { m_dispMaxX = dispItemMiddle.ex; } + //后排无数据时 + if(m_dispDatBehind.size() <= 0) + { + if (dispMinY > dispItemMiddle.by) { dispMinY = dispItemMiddle.by; } + if (dispMinY > dispItemMiddle.ey) { dispMinY = dispItemMiddle.ey; } + if (dispMaxY < dispItemMiddle.by) { dispMaxY = dispItemMiddle.by; } + if (dispMaxY < dispItemMiddle.ey) { dispMaxY = dispItemMiddle.ey; } + m_dispMinY = dispMinY; + m_dispMaxY = dispMaxY; + } + + m_dispDatMiddle.append((char*)(&dispItemMiddle), sizeof(DispItem)); + pData++; + } + + //Y方向再循环多次 + for(int m = 0; m < circleNumMiddle; m++) + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + middleYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY); + for (int j = 0; j < stepsize; j++) + { + dispItemMiddle = *pData; + dispItemMiddle.bx += middleSpace; + dispItemMiddle.ex += middleSpace; + dispItemMiddle.by -= (ySpace+middleYSpace); + dispItemMiddle.ey -= (ySpace+middleYSpace); + + if (m_dispMinX > dispItemMiddle.bx) { m_dispMinX = dispItemMiddle.bx; } + if (m_dispMinX > dispItemMiddle.ex) { m_dispMinX = dispItemMiddle.ex; } + if (m_dispMaxX < dispItemMiddle.bx) { m_dispMaxX = dispItemMiddle.bx; } + if (m_dispMaxX < dispItemMiddle.ex) { m_dispMaxX = dispItemMiddle.ex; } + //后排无数据时 + if(m_dispDatBehind.size() <= 0) + { + if (dispMinY > dispItemMiddle.by) { dispMinY = dispItemMiddle.by; } + if (dispMinY > dispItemMiddle.ey) { dispMinY = dispItemMiddle.ey; } + if (dispMaxY < dispItemMiddle.by) { dispMaxY = dispItemMiddle.by; } + if (dispMaxY < dispItemMiddle.ey) { dispMaxY = dispItemMiddle.ey; } + m_dispMinY = dispMinY; + m_dispMaxY = dispMaxY; + } + + m_dispDatMiddle.append((char*)(&dispItemMiddle), sizeof(DispItem)); + pData++; + } + } + } + if(i % 2 == 0) + { + middleSpace += leftRightNeedleSpace; + } + else + { + //middleSpace += leftRightNeedleSpace*3; + middleSpace = (i-i/2)*needlesSpace; + } + } + } + + if(reDat == 0 || reDat == 3) + { + double dispMinY = S32_MAX; + double dispMaxY = S32_MIN; + + //根据前中后排的设置,重置后排数据 + char behindSet[LAYOUTNEEDLENUM*2]; + memset((char*)behindSet,0,sizeof(behindSet)); + for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + unsigned char val = *(arrayNeedle3+i); + if(val == NEEDLELEFT) + { + behindSet[0+2*i] = 1; + behindSet[1+2*i] = 0; + } + else if(val == NEEDLERIGHT) + { + behindSet[0+2*i] = 0; + behindSet[1+2*i] = 1; + } + else if(val == NEEDLEDOUBLE) + { + behindSet[0+2*i] = 1; + behindSet[1+2*i] = 1; + } + else if(val == NEEDLENONE) + { + behindSet[0+2*i] = 0; + behindSet[1+2*i] = 0; + } + } + + m_dispDatBehind.clear(); + DispItem dispItemBehind; + double behindSpace = 0; + double behindYSpace = 0; + double ySpace = needleLayoutSpace12+needleLayoutSpace23; + for(unsigned int i = 0; i < sizeof(behindSet); i++)//12个针位设置,对应24根镇,一个针位上有2根针,每根针之间间距为1/2英寸 + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + char val = behindSet[i]; + + if(val == 1) + { + for (int j = 0; j < stepsize; j++) + { + dispItemBehind = *pData; + dispItemBehind.bx += behindSpace; + dispItemBehind.ex += behindSpace; + dispItemBehind.by -= ySpace; + dispItemBehind.ey -= ySpace; + + if (m_dispMinX > dispItemBehind.bx) { m_dispMinX = dispItemBehind.bx; } + if (m_dispMinX > dispItemBehind.ex) { m_dispMinX = dispItemBehind.ex; } + if (m_dispMaxX < dispItemBehind.bx) { m_dispMaxX = dispItemBehind.bx; } + if (m_dispMaxX < dispItemBehind.ex) { m_dispMaxX = dispItemBehind.ex; } + if (dispMinY > dispItemBehind.by) { dispMinY = dispItemBehind.by; } + if (dispMinY > dispItemBehind.ey) { dispMinY = dispItemBehind.ey; } + if (dispMaxY < dispItemBehind.by) { dispMaxY = dispItemBehind.by; } + if (dispMaxY < dispItemBehind.ey) { dispMaxY = dispItemBehind.ey; } + + m_dispDatBehind.append((char*)(&dispItemBehind), sizeof(DispItem)); + pData++; + } + + //Y方向再循环多次 + for(int m = 0; m < lastNum; m++) + { + DispItem * pData = (DispItem *)(m_oneDispDat.data()); + behindYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY); + for (int j = 0; j < stepsize; j++) + { + dispItemBehind = *pData; + dispItemBehind.bx += behindSpace; + dispItemBehind.ex += behindSpace; + dispItemBehind.by -= (ySpace+behindYSpace); + dispItemBehind.ey -= (ySpace+behindYSpace); + + if (m_dispMinX > dispItemBehind.bx) { m_dispMinX = dispItemBehind.bx; } + if (m_dispMinX > dispItemBehind.ex) { m_dispMinX = dispItemBehind.ex; } + if (m_dispMaxX < dispItemBehind.bx) { m_dispMaxX = dispItemBehind.bx; } + if (m_dispMaxX < dispItemBehind.ex) { m_dispMaxX = dispItemBehind.ex; } + if (dispMinY > dispItemBehind.by) { dispMinY = dispItemBehind.by; } + if (dispMinY > dispItemBehind.ey) { dispMinY = dispItemBehind.ey; } + if (dispMaxY < dispItemBehind.by) { dispMaxY = dispItemBehind.by; } + if (dispMaxY < dispItemBehind.ey) { dispMaxY = dispItemBehind.ey; } + + m_dispDatBehind.append((char*)(&dispItemBehind), sizeof(DispItem)); + pData++; + } + } + m_dispMinY = dispMinY; + m_dispMaxY = dispMaxY; + } + if(i % 2 == 0) + { + behindSpace += leftRightNeedleSpace; + } + else + { + //behindSpace += leftRightNeedleSpace*3; + behindSpace = (i-i/2)*needlesSpace; + } + } + } + + m_dispDat.clear(); + m_dispDat.append(m_dispDatFront); + m_dispDat.append(m_dispDatMiddle); + m_dispDat.append(m_dispDatBehind); + + if(m_dispDat.size() <= 0) + { + m_dispDat.append(m_oneDispDat); + m_dispMaxX = m_maxX; + m_dispMinX = m_minX; + m_dispMaxY = m_maxY; + m_dispMinY = m_minY; + } +} + +int EmbData::createDispFromEmbDs16DatForFlyShuttle(int initFlag) +{ + if(initFlag != 0) + { + if(m_dispDatFront.size() > 0 || m_dispDatMiddle.size() > 0 || m_dispDatBehind.size() > 0) + { + m_dispDat.clear(); + m_dispDat.append(m_dispDatFront); + m_dispDat.append(m_dispDatMiddle); + m_dispDat.append(m_dispDatBehind); + } + else + { + m_dispDat.clear(); + m_dispDat.append(m_oneDispDat); + } + } + + m_stitchIndex = 0; + m_dispIndex = 0; + + // 图形显示区域 + int width = m_canvas.width();//留4个像素的边 + int height = m_canvas.height();//留4个像素的边 + + if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2) + { + qDebug("preview img too small"); + return -1; + } + + //留边(否则实时跟踪笔会画出界) + int viewSide = EMB_PREVIEW_SIDE; + if(m_drawMode == DRAW_PREVIEW) + { + viewSide = 20;//预览模式时整区域留20像素绘制(原色显示) + } + int dpminx = viewSide; + int dpmaxx = width - viewSide; + int dpminy = viewSide; + int dpmaxy = height - viewSide; + + //1:1显示无需留边 + // int dpminx = 0; + // int dpmaxx = width; + // int dpminy = 0; + // int dpmaxy = height; + + // 计算缩放系数 + double factor, temp; + if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) + { + return -1; + } + + factor = (double)(fabs(m_dispMaxX-m_dispMinX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数 + temp = (double)(fabs(m_dispMaxY-m_dispMinY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数 + + if(g_emResolut == resolution1910) + { + temp += 0.1; + } + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + m_factor = factor; + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_dispMaxX+m_dispMinX)/factor)/2); + //int dpy = (int)((dpminy+dpmaxy)/2 - ((m_dispMaxY+m_dispMinY)/factor)/2); + int dpy = (int)((dpmaxy) - ((m_dispMaxY)/factor));//多针机不居中,顶端对齐 + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + emb_showDirY = -1; + } + + int dispstepsize = m_dispDat.size()/sizeof(DispItem); + if (dispstepsize <= 0) + { + return -1; + } + + DispItem * pDispData = (DispItem *)(m_dispDat.data()); + for (int i = 0; i < dispstepsize; i++) + { + pDispData->bx = pDispData->bx / factor + dpx; + pDispData->by = pDispData->by / factor + dpy; + pDispData->ex = pDispData->ex / factor + dpx; + pDispData->ey = pDispData->ey / factor + dpy; + + if (emb_showDirX == -1) + { + pDispData->bx = width - pDispData->bx; + pDispData->ex = width - pDispData->ex; + } + if (emb_showDirY == -1) + { + pDispData->by = height - pDispData->by; + pDispData->ey = height - pDispData->ey; + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + double upSide = (height - dpmaxy); + double dnSide = dpmaxy; + + if ((int)pDispData->by < upSide || (int)pDispData->by > dnSide) + { + pDispData->rgb = qRgba(0,0,0,0);//设置透明色 + } + + if ((int)pDispData->ey < upSide || (int)pDispData->ey > dnSide) + { + pDispData->rgb = qRgba(0,0,0,0);//设置透明色 + } + } + } + + pDispData++; + } + + return 0; +} + +#define DRAWDR 0 + +int EmbData::drawImageByDispFile() +{ + if(m_type == MACHINE_FIVEHEADPRECISIONSEWING) + return drawImageByOneStepLotLine(); + + if(m_type == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + return drawImageByDispFileDoubleHeadComb(); + + double bx, by, ex, ey, ar; + bx = by = ex = ey = ar = 0; + int i; + DispItem * pDispBuff = (DispItem *)m_dispDat.data(); + + int size = m_dispDat.size(); + int stitchCount = size/sizeof(DispItem); + + if (stitchCount <= 0) + { + stitchCount = 0; + } + if (m_stitchIndex >= stitchCount) + { + m_stitchIndex = stitchCount - 1; + } + if (m_stitchIndex < 0) + { + m_stitchIndex = 0; + } + + DISP_MODE dispmode = m_dispMode; + + QPainter painter(&m_canvas); + QPen pen; + + //笔宽 + pen.setWidth(1); + + if (dispmode == DISP_ALL_NORMAL || dispmode == DISP_ALL_EXEC) + { + int tenThousand = 0; + for (i = 0; i < stitchCount; i++) + { + tenThousand++; + if(tenThousand == TENTHOUSANDNEEDLE) + { + tenThousand = 0; + int idx = i / TENTHOUSANDNEEDLE; + //每十万针主界面加载图片的进度条走一格 + emit siDrawNeedleIdx(idx); + } + + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + + // 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行) + if ((dispmode == DISP_ALL_EXEC) && (i >= m_stitchIndex)) + { + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(pDispBuff[i].rgb); + } + } + else + {//排针预览颜色 + pen.setColor(Qt::cyan); + } + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + +#if(DRAWDR) + double len = sqrt((double)(ex-bx)*(double)(ex-bx)+ (double)(ey-by)*(double)(ey-by)); + + int mx = len * cos((PI10000-ar)/10000.0); + int my = len * sin((PI10000-ar)/10000.0); + QColor color = QColor(Qt::green); + QPen pen; + pen.setColor(color); + painter.setPen(pen); + painter.drawLine(bx, by, bx+mx, by+my); + pen.setColor(QColor(Qt::red)); + painter.setPen(pen); + painter.drawEllipse(bx+mx, by+my,2,2); +#endif + } + if (dispmode == DISP_ALL_EXEC && m_stitchIndex < stitchCount) + { + //飞梭机将跟踪笔画到最后一个循环开始处 + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + int num = m_dispDat.size() / sizeof(DispItem); + num -= m_pEmbDs16Head->itemNums; + i = num + m_stitchIndex; + } + else + { + i = m_stitchIndex; + } + + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + drawFork(bx, by, painter);//绘制准星 + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + else if (dispmode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示) + { + if (m_stitchIndex != m_dispIndex) + { + eraseNeedleIdxPen(painter);//擦除跟踪笔 + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + //实时刷新最后一个循环图形 + int num = m_dispDat.size() / sizeof(DispItem); + num -= m_pEmbDs16Head->itemNums; + m_dispIndex += num; + } + + //增加针数 + if (m_stitchIndex > m_dispIndex && m_stitchIndex < stitchCount) + { + i = m_dispIndex; + + while(i < m_stitchIndex) + { + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(Qt::red); + } + + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + i++; + } + } + //减少针数 + else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount) + { + i = m_stitchIndex; + + while(i <= m_dispIndex) // 显示为未缝纫颜色线迹 + { + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(pDispBuff[i].rgb); + } + + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + i++; + } + } + + i = m_stitchIndex; + + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + drawFork(bx, by, painter);//绘制跟踪笔 + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + //实时刷新最后一个循环图形 + int num = m_dispDat.size() / sizeof(DispItem); + num -= m_pEmbDs16Head->itemNums; + m_dispIndex = m_stitchIndex - num; + } + else + { + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + } + return 0; +} + + +using namespace std; +/** + * @brief EmbData::drawImageByOneStepLotLine + * @return + * 五头机绘图函数 根据机头间距表信息单步画多条线 + */ +int EmbData::drawImageByOneStepLotLine() +{ + int stitchCount = m_headDispDate.size(); + //限制针步数 否则访问溢出 + if (stitchCount <= 0) + { + stitchCount = 0; + } + if (m_stitchIndex >= stitchCount) + { + m_stitchIndex = stitchCount - 1; + } + if (m_stitchIndex < 0) + { + m_stitchIndex = 0; + } + + QPainter painter(&m_canvas); + QRgb rgb; + QPen pen; + + //笔宽 + pen.setWidth(1); + + if (m_dispMode == DISP_ALL_NORMAL || // 显示所有线迹(原色显示) + m_dispMode == DISP_ALL_EXEC || // 显示所有线迹(执行过的显示原色,其余显示灰色) + 0) + { + int tenThousand = 0; + for (int i = 0; i < stitchCount; i++) + { + tenThousand++; + if(tenThousand == TENTHOUSANDNEEDLE) + { + tenThousand = 0; + int idx = i / TENTHOUSANDNEEDLE; + //每十万针主界面加载图片的进度条走一格 + emit siDrawNeedleIdx(idx); + } + + // 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行) + rgb = m_headDispDate[i].rgb; + + if ((m_dispMode == DISP_ALL_EXEC) && (i >= m_stitchIndex)) + { + if(m_headDispDate[i].ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示 + rgb = getNoJumpColour(); + else + rgb = getNoSewColour(); + } + + drawMultiLine(painter,pen,rgb,i);///多机头绘线 + } + + if (m_dispMode == DISP_ALL_EXEC && m_stitchIndex < stitchCount) + { + drawMultiTrack(painter);///绘制多机头的跟踪图案 + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + else if (m_dispMode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示)前进回退的时候 + { + //qDebug()<<"m_stitchIndex"< m_dispIndex && m_stitchIndex < stitchCount) + { + /// 从小针步增加到大针步 + int i = m_dispIndex; + + while(i < m_stitchIndex) // 显示为原线迹 + { + if(m_headDispDate[i].ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示 + rgb = getJumpedColour(); + else + rgb = getSewedColour(); + drawMultiLine(painter,pen,rgb,i);///多机头绘线 + i++; + } + } + else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount) + { + /// 从大针步减少到小针步 + int i = m_stitchIndex; + + while(i <= m_dispIndex) // 显示为未缝纫颜色线迹 + { + rgb = m_headDispDate[i].rgb; + drawMultiLine(painter,pen,rgb,i);///多机头绘线 + i++; + } + } + + drawMultiTrack(painter);///绘制多机头的跟踪图案 + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + return 0; +} + +int EmbData::drawImageByDispFileDoubleHeadComb() +{ + double bx, by, bx2, by2, ex, ex2, ey, ey2, ar; + bx = bx2 = by = by2 = ex = ex2 = ey = ey2 = ar = 0; + int i; + DispItem * pDispBuff = (DispItem *)m_dispDat.data(); + + int size = m_dispDat.size(); + int stitchCount = size/sizeof(DispItem); + + if (stitchCount <= 0) + { + stitchCount = 0; + } + if (m_stitchIndex >= stitchCount) + { + m_stitchIndex = stitchCount - 1; + } + if (m_stitchIndex < 0) + { + m_stitchIndex = 0; + } + + DISP_MODE dispmode = m_dispMode; + + QPainter painter(&m_canvas); + QPen pen; + + //笔宽 + pen.setWidth(1); + + if (dispmode == DISP_ALL_NORMAL || dispmode == DISP_ALL_EXEC) + { + int tenThousand = 0; + for (i = 0; i < stitchCount; i++) + { + tenThousand++; + if(tenThousand == TENTHOUSANDNEEDLE) + { + tenThousand = 0; + int idx = i / TENTHOUSANDNEEDLE; + //每十万针主界面加载图片的进度条走一格 + emit siDrawNeedleIdx(idx); + } + + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + + bx2 = pDispBuff[i].bx2; + by2 = pDispBuff[i].by2; + ex2 = pDispBuff[i].ex2; + ey2 = pDispBuff[i].ey2; + + // 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行) + if ((dispmode == DISP_ALL_EXEC) && (i >= m_stitchIndex)) + { + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST || pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(pDispBuff[i].rgb); + } + } + else + {//排针预览颜色 + pen.setColor(Qt::cyan); + } + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + + //第二机头用绿色,非偏移数据 + if(pen.color() != Qt::transparent) + { + pen.setColor(Qt::green); + } + painter.setPen(pen); + painter.drawLine(bx2, by2, ex2, ey2); + } + if (dispmode == DISP_ALL_EXEC && m_stitchIndex < stitchCount) + { + i = m_stitchIndex; + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + bx2 = pDispBuff[i].bx2; + by2 = pDispBuff[i].by2; + drawForkDoubleHead(bx, by, bx2, by2, painter);//绘制准星 + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + else if (dispmode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示) + { + if (m_stitchIndex != m_dispIndex) + { + eraseNeedleIdxPenDoubleHead(painter);//擦除跟踪笔 + + //增加针数 + if (m_stitchIndex > m_dispIndex && m_stitchIndex < stitchCount) + { + i = m_dispIndex; + + while(i < m_stitchIndex) + { + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + + bx2 = pDispBuff[i].bx2; + by2 = pDispBuff[i].by2; + ex2 = pDispBuff[i].ex2; + ey2 = pDispBuff[i].ey2; + + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST|| pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(Qt::red); + } + + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + painter.drawLine(bx2, by2, ex2, ey2); + i++; + } + } + //减少针数 + else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount) + { + i = m_stitchIndex; + + while(i <= m_dispIndex) // 显示为未缝纫颜色线迹 + { + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + + bx2 = pDispBuff[i].bx2; + by2 = pDispBuff[i].by2; + ex2 = pDispBuff[i].ex2; + ey2 = pDispBuff[i].ey2; + + if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST || pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC) + { + pen.setColor(Qt::transparent); + } + else + { + pen.setColor(pDispBuff[i].rgb); + } + + painter.setPen(pen); + painter.drawLine(bx, by, ex, ey); + + //第二机头用绿色,非偏移数据 + if(pen.color() != Qt::transparent) + { + pen.setColor(Qt::green); + } + painter.setPen(pen); + painter.drawLine(bx2, by2, ex2, ey2); + i++; + } + } + + i = m_stitchIndex; + + bx = pDispBuff[i].bx; + by = pDispBuff[i].by; + bx2 = pDispBuff[i].bx2; + by2 = pDispBuff[i].by2; + drawForkDoubleHead(bx, by, bx2, by2, painter);//绘制跟踪笔 + m_dispIndex = m_stitchIndex; // 移动显示指针 + } + } + return 0; +} + +/** + * @brief EmbData::findMaxSpHead + * @param head 机头间距表 + * @param StepNum 跨步数 + * @return 返回机头间距表中用到的最大偏移值 + */ +int EmbData::findMaxSpHead(DsrHeadEx62 &head,int StepNum) +{ + int max = 0; + for(int i = 0 ; i < StepNum;i++){ + bitset<8> iswork(head.headEnableSpacing[i].iswork); + for(int j = 1; j < headNum; j++) + { + if(!iswork.test(j)) // test(i)为0返回false + continue; + unsigned short int* row = (unsigned short int*)&head.headEnableSpacing[i]; + unsigned short int space = *(row + j); //向后偏移得到具体大小 + max = max > space ? max : space; + } + } + return max; +} + +/// +/// \brief 根据机头间距表的iswork字段 选择性的绘制跟踪画笔 +/// +void EmbData::drawMultiTrack(QPainter &painter) +{ + int bx = m_headDispDate[m_stitchIndex].bx; + int by = m_headDispDate[m_stitchIndex].by; + bitset<8> iswork(m_headDispDate[m_stitchIndex].headtable.iswork); + + for(int j = 0; j < headNum; j++){ + if(j==0)//第一个机头不需要偏移 + drawFork(bx, by, painter, j); + else if(iswork.test(j))///不是第一针,需要计算偏移量 + { + unsigned short int* row = (unsigned short int*)&m_headDispDate[m_stitchIndex].headtable; // 取到结构体的初始地址 + unsigned short int space = *(row + j); //向后偏移得到具体大小 + space = (space*10)/m_factor; //从实际距离转换为像素,得到最终的偏移像素 + drawFork(bx + space, by, painter, j); + } + else + { + ///如果下一针不缝了 不需要画跟踪标志,也不需要还原上一针的图像 + ///所以此处将上一针的图像缓存重置,以免把画好的线迹擦除 + m_penHeadPix[j] = QPixmap(); + } + + } +} + +/// +/// \brief 五头机函数,根据机头间距表信息多机头同时画线 +/// \param painter +/// \param pen +/// \param rgb +/// \param index +/// +void EmbData::drawMultiLine(QPainter &painter, QPen &pen, QRgb rgb, int index) +{ + int bx = m_headDispDate[index].bx;//begin + int by = m_headDispDate[index].by; + int ex = m_headDispDate[index].ex;//end + int ey = m_headDispDate[index].ey; + + pen.setColor(rgb); + painter.setPen(pen); + bitset<8> iswork(m_headDispDate[index].headtable.iswork); + + + for(int j = 0; j < headNum; j++){ + if(!iswork.test(j)) // test(i)为0,表示机头不工作,跳过循环 + { + if(j == 0){//如果是一机头不工作,那么使用黄色线段画出 + painter.save(); + painter.setPen(getNoJumpColour()); + painter.drawLine(bx, by, ex, ey); //机头1 缝纫数据 和原数据一致 + painter.restore(); + } + continue; + } + + //缝纫数据 + if(m_headDispDate[index].ctrl ==DATA_SEWING) + { + if(j == 0){//机头1 + painter.drawLine(bx, by, ex, ey); //机头1 缝纫数据 和原数据一致 + } + else + { + unsigned short int* row = (unsigned short int*)&m_headDispDate[index].headtable; // 取到结构体的初始地址 + unsigned short int space = *(row + j); //向后偏移得到具体大小 + space = (space*10)/m_factor; //从实际距离转换为像素 + painter.drawLine(bx+space, by, ex+space, ey); //不是机头1的画线时需要偏移 + } + } + else{ + painter.drawLine(bx, by, ex, ey); + } + + } +} + +void EmbData::getOneDispDat(QByteArray &ds16dat) +{ + DispItem dispItem; + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("16 data less then head size"); + return; + } + DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data()); + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("dat dataBegin err"); + return; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return; + } + + Ds16Item * ds16DataPtr; + Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + ds16DataPtr = pData; + + double datposx, datposy, datposr; + int curx, cury, curr, prex, prey; + curx = cury = curr = prex = prey = 0; + + // 显示花样图形 + u8 ctrlByte; + u8 attrByte; + int dx; + int dy; + int dr; + m_oneDispDat.clear(); + + m_dispMinX = S32_MAX; + m_dispMaxX = S32_MIN; + m_dispMinY = S32_MAX; + m_dispMaxY = S32_MIN; + + datposx = pDsHead->beginX; + datposy = pDsHead->beginY; + datposr = pDsHead->beginR; + + curx = datposx; + cury = datposy; + + //先得到一个完整的绘制数据 + for (int i = 0; i < stepsize; i++) + { + prex = curx; + prey = cury; + + // 读入一个针步数据 + ctrlByte = ds16DataPtr->ctrl; + attrByte = ds16DataPtr->attr; + dx = ds16DataPtr->dx; + dy = ds16DataPtr->dy; + dr = ds16DataPtr->dr; + + datposx += dx; + datposy += dy; + datposr += dr; + + curx = datposx; + cury = datposy; + + while(datposr >= PI10000) + { + datposr -= (PI20000-1); + } + while(datposr <= -PI10000) + { + datposr += (PI20000-1); + } + + dispItem.ctrl = ctrlByte; + dispItem.attr = attrByte; + dispItem.bx = prex; + dispItem.by = prey; + dispItem.ex = curx; + dispItem.ey = cury; + dispItem.ar = curr; + + if (m_dispMinX > dispItem.bx) { m_dispMinX = dispItem.bx; } + if (m_dispMinX > dispItem.ex) { m_dispMinX = dispItem.ex; } + if (m_dispMaxX < dispItem.bx) { m_dispMaxX = dispItem.bx; } + if (m_dispMaxX < dispItem.ex) { m_dispMaxX = dispItem.ex; } + if (m_dispMinY > dispItem.by) { m_dispMinY = dispItem.by; } + if (m_dispMinY > dispItem.ey) { m_dispMinY = dispItem.ey; } + if (m_dispMaxY < dispItem.by) { m_dispMaxY = dispItem.by; } + if (m_dispMaxY < dispItem.ey) { m_dispMaxY = dispItem.ey; } + + if(ctrlByte == DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示 + dispItem.rgb = getJumpedColour(); + else + dispItem.rgb = getSewedColour(); + + memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action)); + m_oneDispDat.append((char*)(&dispItem), sizeof(DispItem)); + + ds16DataPtr++; + } + return; +} + + + diff --git a/datafile/embdata.h b/datafile/embdata.h new file mode 100644 index 0000000..4f40067 --- /dev/null +++ b/datafile/embdata.h @@ -0,0 +1,317 @@ +#ifndef EMBDATA_H +#define EMBDATA_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" +#include +#include "datafile/datafiledsr.h" + +#define ZERO 1e-6 + +#define MAX_EMB_STEP 121//四字节针步最大针步限制 +#define DEFAULT_JUMP 70//默认针步大小 +#define SEW_NEEDLE_NUM 2 //缝纫2个针杆 +#define COLORTABLE_NUM 512//色序表 + +#define EMB_PREVIEW_SIDE (32) // 留边大小 +#define TENTHOUSANDNEEDLE 100000 + +//#define EMB_SHOWDIRX (1) // X向显示坐标和数据坐标的差异 +//#define EMB_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异 +#define OUTLINESTEPFACTOR 100 // 生成轮廓花样针步乘以的系数,单位是0.01,所以乘以100 + +#define PI10000 31416 //180度 +#define PI20000 62832 +#define ANGLECORR 10466 //60度对应的弧度值 + +#define MODE_THICKEN 0 //密针方式 +#define MODE_LOCK 1 //锁针方式 + +#define NEEDLENONE 0 //无针 +#define NEEDLELEFT 1 //左针 +#define NEEDLERIGHT 2 //右针 +#define NEEDLEDOUBLE 3 //双针 +#define NEEDLENOTSET 4 //未设置 +#define LAYOUTNEEDLENUM 24 + +typedef union +{ + u8 buf8[4]; + u32 buf32; +} U32ToU8; + +enum MirrorType { + HorizontalMirror = 1, // 1: 水平镜像 + VerticalMirror, // 2: 垂直镜像 + BothMirror // 3: 水平和垂直镜像 +}; + +class EmbData: public QObject +{ + Q_OBJECT + +public: + EmbData(); + ~EmbData(); + +public: + void clear(); + QByteArray & getDsDat();//得到转换后的ds16数据 + QByteArray getDispDat(double showWidth,double showHeight);//得到转换后的绘图数据 + inline DataDs16FileHead * getDsDatHead(){return m_pEmbDs16Head;}//得到转换后的ds16数据的文件头 + void setDsDatHeadFileID(u32 fileid);//设置数据区文件头的fileid + void getAbsDatRangeXY();//得到绝对坐标的maxXY和minXY + void appendAEmbAbsFile(QString filePath,QByteArray array,int mirror = 0);//附加一个绝对坐标的花样文件 + int addLockStitchs(u8 mode, u8 needles, u8 num); + QByteArray lockReinforce(u8 needles, u8 num, DsAbsItem * absDataPtr, int datasize);//锁针加固方式 + QByteArray thickenReinforce(u8 needles, u8 num, DsAbsItem * absDataPtr, int datasize);//密针加固方式 + void addResew(QByteArray& data, DsAbsItem * ptr, u8 ctrl ,bool resewFlag = true);//加回针或者锁针 + void evenNumberAddLock(QByteArray& data, DsAbsItem * absDataPtr,int lockNeedles, int num);//偶数次添加锁针加固 + void oddNumberAddLock(QByteArray& data, DsAbsItem * absDataPtr,int lockNeedles, int num);//奇数次添加锁针加固 + int angleCorrection(s16 oft);//角度修正 + int angleCorrectionXY(s32 px, s32 nx, s32 py, s32 ny);//角度修正 + void reFitByStep(s32 stepLen);//按固定针步重新拟合(用户可设置的参数,暂未用到) + void reFitLine(s32 stepLen);//按固定针步重新拟合直线(用户可设置的参数) + void reFitLineDoubleHead(s32 stepLen);//按固定针步重新拟合直线(用户可设置的参数),双头组合机型 + int moveStartPoint(short left, short front);//移动起始点,左边,前边 + QByteArray & lolaComp(s16 valuePos, s16 valueNeg, s16 valueZero);//罗拉补偿 + void setLastStepAngle();//设置最后一个针步的角度 + +public: + inline QString getFileName(){return m_pEmbDs16Head->fileName;}//得到花版名称 + inline QString getFilePath(){return m_filePath;}//得到花版路径 + inline u32 getStitchNums(){return m_pEmbDs16Head->itemNums;}//得到数据的针数 + inline int getDatWidth(){return m_pEmbDs16Head->maxX - m_pEmbDs16Head->minX;}//得到数据的图形宽度 + inline int getDatHeight(){return m_pEmbDs16Head->maxY - m_pEmbDs16Head->minY;}//得到数据的图形高度 + inline s32 getMaxX(){return m_pEmbDs16Head->maxX;}//得到数据最大X+ + inline s32 getMinX(){return m_pEmbDs16Head->minX;}//得到数据最小X- + inline s32 getMaxY(){return m_pEmbDs16Head->maxY;}//得到数据最大Y+ + inline s32 getMinY(){return m_pEmbDs16Head->minY;}//得到数据最小Y- + inline s32 getBeginX(){if(m_pEmbDs16Head == NULL){return 0;} return m_pEmbDs16Head->beginX;} + inline s32 getBeginX2(){if(m_pEmbDs16Head == NULL){return 0;} return m_pEmbDs16Head->beginX2;} + inline s32 getBeginY(){if(m_pEmbDs16Head == NULL){return 0;} return m_pEmbDs16Head->beginY;} + inline s32 getBeginY2(){if(m_pEmbDs16Head == NULL){return 0;} return m_pEmbDs16Head->beginY2;} + inline s32 getAnchorX(){return m_pEmbDs16Head->anchorX;}//得到数据定位点 + inline s32 getAnchorY(){return m_pEmbDs16Head->anchorY;}//得到数据定位点 + + inline void setSplitLen(u16 len){m_splitLen = len;}//分割数据长度 +// inline int setSplitLen(u16 len){return len;}//分割数据长度 + inline void setOftNeedleSize(s32 len){m_oftNeedleSize = len;}//双头组合机型去除偏移针步的针步大小 + +public: + void moveDataBeginPonit(s32 left, s32 front); + void setAbsDat(QByteArray & dat); + QByteArray & getAbsDat(void); + int getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & colorIdx, int & dr, int & ar, int & dxV, int & dyV); + void setStartPosition(int x, int y);//设置起始点 + void setStartPositionDoubleHead(int left,int front);//计算并设置起始点-双头组合机型 + void setStartPositionFromLeftFront(int left,int front);//根据左边前边计算并设置起始点 + void reCreatDispDat();//重新计算范围并生成绘制数据 + void setAnchorPosition(int x, int y);//设置定位点 + +public: + double getAngle(double x1, double y1, double x2, double y2); + int setDatSizeChange(int dsx, int dsy);//设置尺寸变化(缩放) + int setMirror(MirrorType mirror);//设置镜像 + + int splittingArc(double posX1, double posY1,double posX2, double posY2,double xc, double yc, double rc,double dr1,double dr2,int step,QByteArray &cutData, DsAbsItem item);// 分割圆弧 + int splittingLine(double posX1, double posY1,double posX2, double posY2,int stepMin, int stepMax,QByteArray &cutData, DsAbsItem item); // 分割直线 + + // 偏心刀平板切割机补偿算法 + int setCutcontrastData(); // 增加对比数据 + int setCutCornerStep(); // 增加拐点数据 + int setCutEccentricCompensation(); // 偏心刀刀尖补偿 + int setCutAddCutterComption(); // 增加两端补偿 + int setCutRotaryCutterData(); // 增加转刀数据 + int setCutDecCornerStep(); // 删除拐点数据 + int setCutFitSplitStep(); // 分割切刀数据 + int setCutFitStepData(); // 拟合切刀数据 + + // 飞行切割平板切割机补偿算法 + int setCut2CornerStep(); // 增加拐点数据 + int setCut2ModifyDataDir(); // 修改数据方向 + int setCut2FitSplitStep(); // 分割切刀数据 + int setCut2JudgInterval(); // 判断区间 + int setCut2AddCutterComption(); // 增加圆刀数据两端补偿 + int setCut2AddCutterComption2(); // 增加圆刀数据两端补偿 yct + int setCut2SortNewData(); // 排序&组成新数据 + int setCut2AddOffsetData(); // 增加偏移数据 + int setCut2CalMaxSpd(); // 计算最大行进速度 + void recalculateAngles(); //重新计算角度 + + //计算角度ar + s32 calculateAngles(double curX, double curY, double lastX, double lastY); //计算绝对角度ar + //切割结尾补偿 移动结尾点 + void cutDataEndCompensate(DsAbsItem &curItem,DsAbsItem &preItem,double comDistance); + //切割结尾小横切 + void cutDataVertCut(DsAbsItem &curItem,double comDistance, QByteArray & cutAbsData,int &newstepnum); + //切割开头的补偿 移动起始点 + void cutDataStartCompensate(DsAbsItem &curItem,DsAbsItem &preItem, DsAbsItem &nextItem, double comDistance); + + bool isCutCtrl(u8 &ctrl); + + void optimizationOrder(QVector > &visited, DsAbsItem &absItem,int winNum,u8 ctrl);//数据优化顺序 + + u32 CalcDisplacement(u32 pps1, u32 pps2, u32 calcTime); + s16 Rot001ToPitk(s32 ang001); + int setCutMoveParameters(); // 计算切刀移动参数 + + int setRotate(int dr);//设置旋转 + int setRotate90(bool flag);//旋转+-90度 flag :true代表顺时针方向 + int getNextElementIndex(int curIndex);//获得下一个图元的第一缝纫针步 + int getPreOrThisElementIndex(int curIndex);//上一个图元(当前为跨步时)或当前图元(当前为缝纫时)的第一缝纫针步 + int createEmbDs16FromAbs();//生成DS16数据 + int createEmbDs16FromAbsDoubleHeadComb();//双头组合机型生成ds16数据 + void calRange();//计算边界范围 + +private: + void splitBorderStitchAndAdd(QByteArray & dat,int bx,int by,int ex,int ey);//分割边框针步并添加 + //此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距 + void convertAbsDat(QByteArray & dat,int mirror = 0); + int calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, DsAbsItem item); + + int reCalcDataChecksum();//重新计算文件CRC + void drawNeedleIdxPen(int x, int y, QPainter &painter);//绘制针数索引的跟踪笔 + void drawFork(int x, int y, QPainter &painter);//绘制针数索引的十字 + void drawFork(int x, int y, QPainter &painter,int index);//绘制针数索引的十字 + void drawForkDoubleHead(int x, int y, int x2, int y2, QPainter &painter);//绘制针数索引的十字(双头组合机型) + void eraseNeedleIdxPen(QPainter &painter);//擦除针数索引的跟踪笔 + void eraseNeedleIdxPen(QPainter &painter,int index);//擦除针数索引的跟踪笔 + void eraseNeedleIdxPenDoubleHead(QPainter &painter);//擦除针数索引的跟踪笔 + bool isFlipDispYMac();//判断是否是Y轴旋转的类型(显示数据) + bool isFlipDispXMac();//判断是否是X轴旋转的类型(显示数据) +private: + void getCurvePointFillLine(QList &inList, double indRunLen,QList &outList); + int getTotalDistanceFillLine(QList *pPointList, double &dTotal); + bool getPointInSectFillLine(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp); + //距p1点距离为d的点 + // d > s : out_p在p2延长线上 + // s >= d >= 0 : out_p在p1、p2线段上 + // d < 0 : out_p在p1延长线上 + bool getPointAtSect(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp); + bool checkData(int size); + +public: + int m_editedflag;//数据被编辑的标志 + int m_spaceX;//横向间隙 + int m_spaceY;//纵向移动距离 + + int m_endPosX;//花样最后点坐标 + int m_endPosY;//花样最后点坐标 + +//用于调节颜色 +#if(1) + QString m_selfilename; +#endif + + double m_minX; + double m_maxX; + double m_minY; + double m_maxY; + +private: + QByteArray m_embAbsData; // 转换后的绝对坐标数据 + QByteArray m_embDs16Data;//发给下位机的ds16数据(需要转换) + QByteArray m_oneDispDat; //飞梭机单个绘制数据 + int m_totalJumpNeedle;//总跳针数 + DataDs16FileHead * m_pEmbDs16Head;//ds16 文件头 //数据转换用的都是DataDs16FileHead + double m_factor;//绘制数据与实际数据的缩放率 + u32 m_fileid; + u16 m_splitLen; + s32 m_oftNeedleSize;//双头组合机型去除偏移针步的针步大小 + s32 m_ritStepSize;//拟合针步大小 + +//图形预览、刷新 +public: + //显示所有线迹(原色显示) + //显示所有线迹(有效区域内的显示原色,其余显示灰色) + //显示所有线迹(执行过的显示原色,其余显示灰色) + //刷新部分线迹(缝纫中进度显示) + enum DISP_MODE {DISP_ALL_NORMAL = 0, DISP_ALL_AREA, DISP_ALL_EXEC, DISP_EXECING}; + enum DRAW_MODE {DRAW_VIEW = 0, DRAW_PREVIEW};//绘制模式(非预览模式、预览模式) + +public: + int setViewInfo(int width, int height);//设置视图尺寸(透明背景) + void setViewInfo(QPixmap pix);//设置视图(带背景图片背景) + void setEmbData(int type,int redraw = 0);//重置数据 + //是否重绘 //是否为渐变 + void setDispMode(DISP_MODE dispmode = DISP_ALL_NORMAL, int redraw = 0);//设置预览模式 + void setDrawMode(DRAW_MODE drawmode = DRAW_VIEW);//设置绘制模式 + + void setExecIndex(int index);//设置进度显示数据 + void reDraw();//重新绘图 + +public: + inline QPixmap& getPreviewImage(){return m_canvas;}//返回预览图片 + +private: + int createDispFromEmbDs16Dat(QByteArray & ds16dat);//创建显示用的数据(为了快速显示) + int createDispFromEmbDs16DatForHeadInfo(QByteArray & ds16dat); + int createDispFromEmbDs16DatDoubleHeadComb(QByteArray & ds16dat);//双头组合机型创建绘制数据 + int drawImageByDispFile();//用显示数据画图(是否渐变显示) + int drawImageByOneStepLotLine(); + int drawImageByDispFileDoubleHeadComb();//双头组合机型绘制预览图 + int findMaxSpHead(DsrHeadEx62 & head,int headCount); + void drawMultiTrack(QPainter &painter); //绘制多机头的跟踪图案 + void drawMultiLine(QPainter &painter, QPen &pen, QRgb rgb, int index); //绘制多机头的线迹 + +public: + void getOneDispDat(QByteArray &ds16dat); //得到一个绘制数据 + void resetLayoutDispDat(unsigned char *arrayNeedle1,unsigned char *arrayNeedle2,unsigned char *arrayNeedle3,int leftRightNeedleSpace,int needlesSpace,int needleLayoutSpace12,int needleLayoutSpace23,int reDat = 0); + int createDispFromEmbDs16DatForFlyShuttle(int initFlag = 0);//飞梭机绘制数据 + + static bool checkFirstEndNeedle(QByteArray ary);//确认起终点的x值是否一致 + QByteArray rotationAngleAdjustment(int flag);//根据flag对数据进行旋转角度调整 +private: + int m_type; //机型 + int m_penX, m_penY;//执行过程中绘制跟踪笔的坐标索引 + QPoint m_penXY2; + + QPixmap m_canvas;//预览图片 + QPixmap m_penPix;//跟踪笔绘制的临时区域 + QPixmap m_penPix2;//跟踪笔绘制的临时区域 + QVector m_penHeadPix; + QVector m_penPoint; + + int m_viewWidth; + int m_viewHight; + + QString m_filePath;//文件路径 + +private: + QByteArray m_dispDat;//绘制图形的绝对数据(进行缩放的) + + QByteArray m_dispDatFront;//飞梭机前排数据 + QByteArray m_dispDatMiddle;//飞梭机中排数据 + QByteArray m_dispDatBehind;//飞梭机后排数据 + + double m_dispMinX; + double m_dispMaxX; + double m_dispMinY; + double m_dispMaxY; + + QVector m_headDispDate; //五头机绘图针步 + int m_stitchIndex; //进度步数 + int m_dispIndex; //当前index + DISP_MODE m_dispMode; + DRAW_MODE m_drawMode; + +signals: + void siDrawNeedleIdx(int idx); + +}; + +#endif // EMBDATA_H diff --git a/datafile/hpgl/importhpgl.cpp b/datafile/hpgl/importhpgl.cpp new file mode 100644 index 0000000..8bb8c45 --- /dev/null +++ b/datafile/hpgl/importhpgl.cpp @@ -0,0 +1,2535 @@ +#include "importhpgl.h" +#include +#include +#include +#include "vectorfont.h" +#include "main.h" + +ImportHPGL::ImportHPGL(QObject *parent) : + QObject(parent) +{ + m_iDPMM = 40; + m_iPenNo = 1; + m_ptCurrentPos = QPoint(0,0); + m_lineType.bDefault = true; + m_bPenUp = true; + + m_pMarker = new Marker(); + m_dScale = (double)1.0; + + m_chTerminator = 3; + m_nTerminatorMode = 1; + + m_listXY.clear(); + + m_penPen.setColor(QColor(0,0,0)); + m_cutPen.setColor(QColor(0,255,0)); + m_halfCutPen.setColor(QColor(0,0,255)); + + m_dTextHeight = 0.375 * 10 * m_iDPMM;//字的高度 + m_dTextWidth = 0.285 * 10 * m_iDPMM;//字的宽度 + m_nLableOrigin = 1;//字符串相对于原点位置 + m_dTextAngle = 0;//指定每行文本输出时相对于设备x轴的角度,其单位为1/10度 + + m_dScaleX = 1; + m_dScaleY = 1; + m_ptOrigin = QPoint(0,0); + m_nLength = 0; + m_bPage = false; + m_bFontItalic = false; + m_iFontSize = 0; + m_strFontName = ""; + + m_pFileBuf = NULL; + + m_embAbsData.clear(); + m_maxX = S32_MIN; + m_maxY = S32_MIN; + m_minY = S32_MAX; + m_minX = S32_MAX; + m_stepCtrl = DATA_SEWING; +} + +ImportHPGL::~ImportHPGL() +{ + if(m_pMarker != NULL) + { + delete m_pMarker; + m_pMarker = NULL; + } + + if (m_pFileBuf != NULL) + { + delete []m_pFileBuf; + m_pFileBuf = NULL; + } +} + +int ImportHPGL::GetQRVesion(int nCount) +{ + int nVesion = 1; + + if (nCount < 17) + { + nVesion = 1; + } + else if ((nCount >= 17) && (nCount < 32)) + { + nVesion = 2; + } + else if ((nCount >= 32) && (nCount < 53)) + { + nVesion = 3; + } + else if ((nCount >= 53) && (nCount < 78)) + { + nVesion = 4; + } + else if ((nCount >= 78) && (nCount < 106)) + { + nVesion = 5; + } + else if ((nCount >= 106) && (nCount < 134)) + { + nVesion = 6; + } + else if ((nCount >= 134) && (nCount < 154)) + { + nVesion = 7; + } + else if ((nCount >= 154) && (nCount < 192)) + { + nVesion = 8; + } + else if ((nCount >= 192) && (nCount < 230)) + { + nVesion = 9; + } + else if ((nCount >= 230) && (nCount < 271)) + { + nVesion = 10; + } + else + { + nVesion = 40; + } + return nVesion; +} + +void ImportHPGL::PointRotate(QPoint &ptPoint, QPoint ptPointO, double dSinBeta, double dCosBeta) +{ + int tx = ptPoint.x() - ptPointO.x(); + int ty = ptPoint.y() - ptPointO.y(); + + int nx = tx*dCosBeta - ty*dSinBeta; + int ny = tx*dSinBeta + ty*dCosBeta; + + ptPoint.setX(nx); + ptPoint.setY(ny); +} + +void ImportHPGL::IniPara() +{ + m_fileFullPathName.clear(); + m_iPenNo = 1; + m_ptCurrentPos = QPoint(0,0); + m_lineType.bDefault = true; + m_bPenUp = true; + + m_pMarker->Initialize(); + m_dScale=(double)1.0; + + m_chTerminator = 3; + m_nTerminatorMode = 1; + + m_listXY.clear(); + + m_dTextHeight = 0.375 * 10 * m_iDPMM;//字的高度 + m_dTextWidth = 0.285 * 10 * m_iDPMM;//字的宽度 + m_nLableOrigin = 1;//字符串相对于原点位置 + m_dTextAngle = 0;//指定每行文本输出时相对于设备x轴的角度,其单位为1/10度 + + m_dScaleX = 1; + m_dScaleY = 1; + m_ptOrigin = QPoint(0,0); + m_nLength = 0; + m_bPage = false; + m_lineType.bDefault = true; + // 创建并初始化 PLT_Head 结构体 + memset(&m_headData, 0, sizeof(PLT_Head)); +} + +bool ImportHPGL::Read(QString strPathName) +{ + m_fileFullPathName = strPathName; + QFile file(strPathName); + char c; + bool bOk; + + if(!file.open(QIODevice::ReadOnly)) + { + qDebug() <<"file open failed"; + return false; + } + + m_dScale=(double)m_pMarker->m_iDPMM / m_iDPMM; + m_listXY.clear(); + m_nFileLength = file.size(); + m_pFileBuf = new char[m_nFileLength]; + file.read(m_pFileBuf,m_nFileLength); + file.close(); + m_nCharCount = 0; + bOk=GetChar(&c); + while (bOk && m_nCharCount < m_nFileLength) + { + switch (c) + { + case 'S': //S命令 + case 's': + bOk=S_Code(); + break; + case 'I': //I命令 + case 'i': + bOk=I_Code(); + break; + case 'P': //P命令 + case 'p': + bOk=P_Code(); + break; + case 'L': //L命令 + case 'l': + bOk=L_Code(); + break; + case 'D': + case 'd': + bOk=D_Code(); + break; + case 'C': + case 'c': + bOk=C_Code(); + break; + case ';': + case ' ': + case 0x0A: + case 0x0D: + break; + case 'H': + bOk = HFD_Code(); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + + if (bOk) + { + bOk=GetChar(&c); + if (m_nCharCount == m_nFileLength) bOk=true; + } + } + + AddPolylineToMarker(); + + if (m_pFileBuf != NULL) + { + delete []m_pFileBuf; + m_pFileBuf = NULL; + } + + return bOk; +} + +#if(0) +void ImportHPGL::creatPolylinePainterPath() +{ + if(m_pMarker == NULL){return;} + + QPainterPath painterPath; + QRect rect = m_pMarker->GetRect(); + int minX = rect.left(); + int minY = rect.top(); + int maxY = rect.bottom(); + + int nLineCount = m_pMarker->m_listPolyline.size(); + // m_polyTextPath = QPainterPath(); + for(int i = 0; i < nLineCount; i++) + { + CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i); + int type = polyLine.m_nDrawingType; + // if(polyLine.m_nDrawingType == 3)//文字 + // { + // CRPText text = polyLine.m_text; + // } + + int nPointCount = polyLine.m_listPoint.size(); + for(int j = 0; j < nPointCount; j++) + { + double x = (polyLine.m_listPoint.at(j).x() - minX)/(double)M_IDPMM*MMPIXELY; + double y = ((0 - (polyLine.m_listPoint.at(j).y() - minY))+(maxY-minY))/(double)M_IDPMM*MMPIXELY; + QPointF point(x,y); + + if(j == 0) + { + painterPath.moveTo(point); + } + else + { + painterPath.lineTo(point); + } + } + } + + m_polylinePainterPath = painterPath; +} +#endif + +//读取一个非空格、非回车、非换行的字符 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// *pChar 读取的字符 +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功取得一个字符 +// false 失败 +bool ImportHPGL::GetChar(char *pChar) +{ + char c; + uint nCount; + bool bOk; + bOk=true; + + nCount = ReadChar(&c); + while ((nCount == 1) && ((c == ' ') || (c == 0x0A) || (c == 0x0D))) + { + nCount = ReadChar(&c); + } + + if (bOk && (nCount == 0)) + { + bOk=false; + } + + if (nCount == 1) + { + *pChar=c; + bOk=true; + } + + return bOk; +} + +uint ImportHPGL::ReadChar(char* lpBuf) +{ + uint nCount = 1; + + if (m_nCharCount < m_nFileLength) + { + *lpBuf = m_pFileBuf[m_nCharCount]; + m_nCharCount = m_nCharCount + 1; + nCount = 1; + } + else + { + nCount = 0; + } + + return nCount; +} + +//判断下一个非空格、非回车、非换行的字符是不是',' +//输入参数: +// pFile 切割数据文件 +//输出参数: +// bEndOfFile =true 已到文件尾 +//返回值: +// true 下一个非空格、非回车、非换行的字符是',', 并且已将','从文件中读出 +// false 下一个非空格、非回车、非换行的字符不是',', 并且该字符没有从文件中读出 +bool ImportHPGL::NextCharIsComma() +{ + char cCh1; + bool bNextCharIsStart; + + bNextCharIsStart=false; + + if (GetChar(&cCh1)) + { + if (cCh1 == ',') + { + bNextCharIsStart=true; + } + else + { + m_nCharCount = m_nCharCount - 1; + } + } + + return bNextCharIsStart; +} + +//取一个整数 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// iValue 取得的整数 +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功取得一个整数iValue +// false 失败 +bool ImportHPGL::GetIntegerData(int &iValue) +{ + QString string1; + char c; + bool bOk,bNum; + + bNum=false; + + bOk=GetChar(&c); + if (bOk && (c == '-')) + { + string1=string1 + c; + bOk=GetChar(&c); + } + while (bOk) + { + if (('0' <= c) && (c <= '9')) + { + string1=string1 + c; + bNum=true; + } + else + { + m_nCharCount = m_nCharCount - 1; + break; + } + + bOk=GetChar(&c); + } + + if (!bOk) + { + if (m_nCharCount == m_nFileLength) + bOk=true; + } + if (!bNum) + bOk=false; + + if (bOk) + iValue=string1.toInt(); + + return bOk; +} + +//取一个双精度浮点数 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// dValue 取得的双精度浮点数 +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功取得一个双精度浮点数dValue +// false 失败 +bool ImportHPGL::GetDoubleData(double &dValue) +{ + QString string1; + char c; + bool bOk,bNum; + + bNum=false; + + bOk=GetChar(&c); + if (bOk && (c == '-')) + { + string1=string1 + c; + bOk=GetChar(&c); + } + while (bOk) + { + if ((('0' <= c) && (c <= '9')) || c == '.') + { + string1=string1 + c; + bNum=true; + } + else + { + m_nCharCount = m_nCharCount - 1; + break; + } + + bOk=GetChar(&c); + } + + if (!bOk) + { + if (m_nCharCount == m_nFileLength) + bOk=true; + } + + if (!bNum) + bOk=false; + + if (bOk) + dValue=string1.toDouble(); + + return bOk; +} + +//取坐标值 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// ptPoint 坐标 +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功 +// false 失败 +bool ImportHPGL::GetCoordinate(QPoint &ptPoint) +{ + bool bOk; + int iX,iY; + double x,y; + QString strInfo; + + ptPoint=m_ptCurrentPos; + //bOk=GetIntegerData(x); + bOk=GetDoubleData(x);//为了兼容Gemini文件,Gemini坐标不是整数,是小数 + if (bOk) + { + iX=(double)(x+m_nLength) * m_dScale * m_dScaleX; + ptPoint.setX(iX); + } + + if (bOk) + { + bOk=SearchChar(',' ,strInfo); + if (bOk) + { + //bOk=GetIntegerData(y); + bOk=GetDoubleData(y);//为了兼容Gemini文件,Gemini坐标不是整数,是小数 + if (bOk) + { + iY=(double)y * m_dScale * m_dScaleY; + ptPoint.setY(iY); + } + + } + } + + return bOk; +} + +//获得线的类型 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// lineType 线型 +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功 +// false 失败 +bool ImportHPGL::GetLineType(LineType &lineType) +{ + bool bOk; + int nLineType, nPatternLength, nMode; + QString strInfo; + lineType = m_lineType; + bOk=GetIntegerData(nLineType); + if (bOk) + { + lineType.bDefault = false; + lineType.nLinetype = nLineType; + bOk=SearchChar( ',' ,strInfo); + if (bOk) + { + bOk=GetIntegerData(nPatternLength); + if (bOk) + { + lineType.nPatternLength = nPatternLength; + } + + bOk=SearchChar( ';' ,strInfo); + if (bOk) + { + bOk=GetIntegerData(nMode); + if (bOk) + { + lineType.nMode = nMode; + } + } + else + { + lineType.nMode = 0; + } + } + else + { + lineType.nPatternLength = 4; + } + } + else + { + lineType.bDefault = true; + } + + return bOk; +} + +//查找一个指定的字符 +//输入参数: +// pFile 切割数据文件 +// cFind 指定的字符 +//输出参数: +// bEndOfFile =true 已到文件尾 +// strInfo 从开始位置到指定字符之前的内容(不包括最后的指定字符) +//返回值: +// true 成功取得一个字符 +// false 失败 +bool ImportHPGL::SearchChar(char cFind,QString &strInfo) +{ + char c; + uint nCount; + bool bOk; + + bOk=true; + strInfo.clear(); + + + nCount = ReadChar(&c); + while ((nCount == 1) && (c != cFind)) + { + strInfo = strInfo + c; + nCount = ReadChar(&c); + } + + + if (bOk && (nCount == 0)) + { + bOk=false; + } + + if (nCount == 1) + { + bOk=true; + } + + return bOk; +} + +//将文件的读取位置移到下一个英文字母(26个英文字母) +//输入参数: +// pFile 切割数据文件 +//输出参数: +// bEndOfFile =true 已到文件尾 +//返回值: +// true 成功将文件的读取位置移到下一个英文字母 +// false 失败 +bool ImportHPGL::MoveToNextEnglishChar() +{ + char c; + uint nCount; + bool bOk, bFind; + + bOk=true; + + bFind = false; + nCount = ReadChar(&c); + while ((nCount == 1) && (!bFind)) + { + if ((('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'))) + { + m_nCharCount = m_nCharCount - 1; + bFind = true; + } + else + { + nCount = ReadChar(&c); + } + } + + return bOk; +} + +//将m_listXY加入到m_pMarker中,并将m_listXY清空 +void ImportHPGL::AddPolylineToMarker() +{ + //长度<0.2mm为钻孔 + CRPPolyline RPPolyline1; + QPoint pt1,pt2; + CDrill drill; + bool bIsdirll = false; + + if (m_listXY.size() >= 2) + { + if (m_listXY.size() == 2 && m_iPenNo == 3) + { + pt1 = m_listXY.at(0); + pt2 = m_listXY.at(1); + if (((pt1.x() - pt2.x())*(pt1.x() - pt2.x())+(pt1.y() - pt2.y())*(pt1.y() - pt2.y()))<=64) + { + bIsdirll = true; + } + } + if (bIsdirll) + { + drill.m_pt = pt1; + drill.m_nDrillType = 0; + drill.m_nAngle = 0; + RPPolyline1.m_nDrawingType = 5; + RPPolyline1.m_drill = drill; + RPPolyline1.m_nPenNo = drill.m_nDrillType; + } + else + { + RPPolyline1.m_nPenNo = m_iPenNo; + RPPolyline1.m_bPgEnd = m_bPage; + RPPolyline1.m_lineType = m_lineType; + RPPolyline1.m_listPoint.clear(); + RPPolyline1.m_listPoint.append(m_listXY); + } + m_pMarker->m_listPolyline.append(RPPolyline1); + } + else + { + if (m_iPenNo == 20 && m_listXY.size() > 0) + { + drill.m_pt = m_listXY.at(0); + drill.m_nDrillType = 0; + drill.m_nAngle = 0; + RPPolyline1.m_nDrawingType = 5; + RPPolyline1.m_drill = drill; + RPPolyline1.m_nPenNo = drill.m_nDrillType; + m_pMarker->m_listPolyline.append(RPPolyline1); + } + } + m_listXY.clear(); +} + +void ImportHPGL::AddPoint2listXY(QPoint ptPoint) +{ + if ((m_listXY.size() == 0) && (m_ptCurrentPos != ptPoint)) + { + m_listXY.append(m_ptCurrentPos); + } + + m_listXY.append(ptPoint); +} + +void ImportHPGL::AddTextPointToLine(bool bUp,QPoint ptPoint) +{ + if (bUp) + { + AddPolylineToMarker(); + m_ptCurrentPos = ptPoint; + m_bPenUp = true; + } + else + { + AddPoint2listXY(ptPoint); + m_ptCurrentPos = ptPoint; + m_bPenUp = false; + } +} + +QPoint ImportHPGL::GetTextOrigin(QPoint pt,QString strText) +{ + int nLen; + double dTextAngle; + double dLength; + int iX; + int iY; + nLen = strText.size(); + dTextAngle = m_dTextAngle/180.0*PI ; + switch(m_nLableOrigin) + { + case 1: + iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 2: + iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 4: + iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle); + iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 5: + iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 6: + iX=pt.x()-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=pt.y()-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 7: + iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle); + iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 8: + iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 9: + iX=pt.x()-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=pt.y()-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 11: + dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)+m_dTextAngle; + dTextAngle=dTextAngle/180.0*PI ; + dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth)); + iX=pt.x()+dLength*qCos(dTextAngle); + iY=pt.y()+dLength*qSin(dTextAngle); + dTextAngle=m_dTextAngle/180.0*PI; + iX=iX-(m_dTextHeight)*qSin(dTextAngle); + iY=iY+(m_dTextHeight)*qCos(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 12: + iX=pt.x()+(0.25*m_dTextWidth)*qCos(dTextAngle); + iY=pt.y()+(0.25*m_dTextWidth)*qSin(dTextAngle); + iX=iX-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=iY+(0.5*m_dTextHeight)*qCos(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 13: + dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)-m_dTextAngle; + dTextAngle=dTextAngle/180.0*PI; + dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth)); + iX=pt.x()+dLength*qCos(dTextAngle); + iY=pt.y()-dLength*qSin(dTextAngle); + dTextAngle=m_dTextAngle/180.0*PI; + pt.setX(iX); + pt.setY(iY); + break; + case 14: + iX=pt.x()-(1.25*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(1.25*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 15: + iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 16: + iX=pt.x()+(0.25*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()-(0.25*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 17: + dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)-m_dTextAngle; + dTextAngle=dTextAngle/180.0*PI; + dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth)); + iX=pt.x()-dLength*qCos(dTextAngle); + iY=pt.y()+dLength*qSin(dTextAngle); + dTextAngle=m_dTextAngle/180.0*PI; + iX=iX-(m_dTextHeight)*qSin(dTextAngle); + iY=iY+(m_dTextHeight)*qCos(dTextAngle); + iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 18: + iX=pt.x()-(0.25*m_dTextWidth)*qCos(dTextAngle); + iY=pt.y()-(0.25*m_dTextWidth)*qSin(dTextAngle); + iX=iX-(0.5*m_dTextHeight)*qSin(dTextAngle); + iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle); + iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + case 19: + dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)+m_dTextAngle; + dTextAngle=dTextAngle/180.0*PI; + dLength=sqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth)); + iX=pt.x()-dLength*qCos(dTextAngle); + iY=pt.y()-dLength*qSin(dTextAngle); + dTextAngle=m_dTextAngle/180.0*PI; + iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle); + iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle); + pt.setX(iX); + pt.setY(iY); + break; + } + return pt; +} + +double ImportHPGL::GetTextAngle(double dX,double dY) +{ + double dAngle = 0; + + if ((dX == 0) && (dY > 0)) + { + dAngle = 90; + } + else if ((dX == 0) && (dY < 0)) + { + dAngle = -90; + } + else if ((dX > 0) && (dY == 0)) + { + dAngle = 0; + } + else if ((dX < 0) && (dY == 0)) + { + dAngle = 180; + } + else if ((dX!=0) && (dY!=0)) + { + dAngle=qAtan2(dY,dX)*180/PI; + } + + double tmp = (dAngle - (int)dAngle); + if(qAbs((int)(tmp*10)) >= 5) + { + double angle = dAngle < 0 ? dAngle += -1 : dAngle+=1; + dAngle = angle; + } + dAngle = (int)dAngle; + + return dAngle; +} + +void ImportHPGL::SetScale() +{ + double dScaleX,dScaleY; + switch(m_sc.nType) + { + case 0://异步 + m_dScaleX=(double)(m_ptP2.x()-m_ptP1.x())/(m_sc.dXMax-m_sc.dXMin); + m_dScaleY=(double)(m_ptP2.y()-m_ptP1.y())/(m_sc.dYMax-m_sc.dYMin); + m_ptOrigin.setX(m_ptP1.x()-m_sc.dXMin*m_dScaleX); + m_ptOrigin.setY(m_ptP1.y()-m_sc.dYMin*m_dScaleY); + break; + case 1://同步 + dScaleX=(double)(m_ptP2.x()-m_ptP1.x())/(m_sc.dXMax-m_sc.dXMin); + dScaleY=(double)(m_ptP2.y()-m_ptP1.y())/(m_sc.dYMax-m_sc.dYMin); + if(dScaleX>dScaleY) //x>y + { + m_dScaleX=dScaleY; + m_dScaleY=dScaleY; + m_ptOrigin.setY(m_ptP1.y()); + m_ptOrigin.setX(((m_ptP2.x()-m_ptP1.x())-(m_sc.dXMax-m_sc.dXMin)*dScaleY)*m_sc.dLeft/100.0); + } + else //x= 22) + { + char cFileBuf[23]; + file.read(&cFileBuf[0],22); + if((cFileBuf[0] == 0x66) && (cFileBuf[1] == 0x53) &&(strncmp(&cFileBuf[3],"GetonAgain plot file",19) == 0)) + { + file.close(); + return true; + } + else + { + file.close(); + return false; + } + } + return false; +} + +int ImportHPGL::BitMapDtat(QString strFileName, QString strSecretFile) +{ + int i,j,k,m,n,nRemainChar; + char cFileBuf[1025]; + char cSecretBuf[256]; + char errRe; + QFile file(strFileName); + int nLength; + BOOL bError = FALSE; + + m=j=0; + nRemainChar = 0; + errRe=0; + QFile hFile(strSecretFile); + + if (!hFile.open(QIODevice::WriteOnly|QIODevice::Truncate)) + { + return 0; + } + + if(!file.open(QIODevice::ReadOnly)) + { + return 0; + } + + nLength = file.size(); + file.read(&cFileBuf[0],22); + i = 22; + + for(;i 0) + { + n = 252 - nRemainChar + 2; + if (j > nRemainChar) + { + m = 254; + j -= nRemainChar; + i += nRemainChar; + } + else + { + m = n + j; + i += j; + j = 0; + } + if ((n < m) && ((nRemainChar & 0x01) != 0)) + { + nRemainChar -= (m - n); + cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[1]; + } + else + nRemainChar -= (m - n); + for (;n 0) + { + if (nLength == i) + { + break; + } + if ((nLength - i) < 256) + { + bError = TRUE; + errRe = 1; + break; + } + file.read(cSecretBuf,256); + i += 256; + cSecretBuf[0] ^= cSecretBuf[254]; + cSecretBuf[1] ^= cSecretBuf[255]; + cSecretBuf[0] ^= 0xac; + cSecretBuf[1] ^= 0xe3; + if (j < 252) + { + m = j + 2; + nRemainChar = 252 - j; + j = 0; + i -= nRemainChar; + } + else + { + m = 254; + j -= 252; + nRemainChar = 0; + } + if ((m & 0x01) != 0) + { + m--; + for (n=2;nm_iDPMM / 40; + m_listXY.clear(); + nSecretFileLength = file.size(); + pSecretFileBuf = new unsigned char[nSecretFileLength]; + if(pSecretFileBuf != NULL) + { + file.read((char*)pSecretFileBuf,nSecretFileLength); + } + file.close(); + + while (i < nSecretFileLength) + { + c = pSecretFileBuf[i++]; + switch (c) + { + case DEFCMD_IN://0x8a://IN + break; + case DEFCMD_PG://0x97://PG + m_nLength = m_pMarker->GetRect().right(); + break; + case DEFCMD_SP://0x7c: + { + AddPolylineToMarker(); + unsigned char cTemp; + cTemp = pSecretFileBuf[i++]; + m_iPenNo = cTemp; + } + break; + case DEFCMD_LT://0xe6: + { + c = pSecretFileBuf[i++]; + c ^= 0xce; + if (c != 0) + { + if (c == 1) + c = 3; + else if (c == 2) + c = 1; + else + c = 8; + } + } + break; + case DEFCMD_SI://0x5d: 字体宽×高 + { + cPin = (unsigned char *)&m_dTextWidth; + for(int nCount=7; nCount>=0; nCount--) + { + *(cPin+nCount) = pSecretFileBuf[i++]; + } + m_dTextWidth = m_dTextWidth * 10 * M_IDPMM; + + cPin = (unsigned char *)&m_dTextHeight; + for(int nCount=7; nCount>=0; nCount--) + { + *(cPin+nCount) = pSecretFileBuf[i++]; + } + m_dTextHeight = m_dTextHeight * 10 * M_IDPMM; + } + break; + case DEFCMD_LB://0x4d: + { + AddPolylineToMarker(); + cPin = (unsigned char *)&nParameter; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + m_ptCurrentPos.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + m_ptCurrentPos.setY(pointy); + + strTemp.clear(); + QByteArray tempArr; + tempArr.clear(); + for(int nCount=0; nCounttoUnicode(tempArr); + + m_ptCurrentPos = GetTextOrigin(m_ptCurrentPos,strTemp); + vectorFont.m_dFontHeight = m_dTextHeight; + vectorFont.m_dFontAngle = m_dTextAngle; + vectorFont.TextOutString(m_ptCurrentPos.x(),m_ptCurrentPos.y(),(const char*)strTemp.data(),strTemp.length()); + } + break; + case DEFCMD_DI://0x5B: + { + cPin = (unsigned char *)&m_dTextAngle; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + m_bFontItalic = pSecretFileBuf[i++]; + + cPin = (unsigned char *)&m_iFontSize; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + } + break; + case DEFCMD_FN://0x4B: + { + m_strFontName = ""; + cPin = (unsigned char *)&iFontNameLenth; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + for (int a = 0; a < iFontNameLenth; a++) + { + char chTemp = pSecretFileBuf[i++]; + m_strFontName = m_strFontName + chTemp; + } + } + break; + case DEFCMD_DRILL://0xD2:冲孔 + { + AddPolylineToMarker(); + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + drill.m_pt.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + drill.m_pt.setY(pointy); + + cPin = (unsigned char *)&drill.m_nDrillType; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + cPin = (unsigned char *)&drill.m_nAngle; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + RPPolyline.m_nDrawingType = 5; + RPPolyline.m_drill = drill; + RPPolyline.m_nPenNo = drill.m_nDrillType; + m_pMarker->m_listPolyline.append(RPPolyline); + } + break; + case DEFCMD_NOTCH://0xD3:剪口 + { + AddPolylineToMarker(); + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + notch.m_ptStart.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + notch.m_ptStart.setY(pointy); + + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + notch.m_ptEnd.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + notch.m_ptEnd.setY(pointy); + + cPin = (unsigned char *)¬ch.m_nWidth; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + cPin = (unsigned char *)¬ch.m_nNotchType; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + + notch.CovertToOutputByOffset(notchOffsetX,notchOffsetY); + RPPolyline.m_nDrawingType = 6; + RPPolyline.m_notch = notch; + RPPolyline.m_nPenNo = notchPenNO; + m_pMarker->m_listPolyline.append(RPPolyline); + } + break; + case DEFCMD_PU://0xb5: + case DEFCMD_LPU://0x5e: + { + AddPolylineToMarker(); + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + ptPoint.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + ptPoint.setY(pointy); + + m_ptCurrentPos = ptPoint; + m_bPenUp = true; + } + break; + case DEFCMD_PD://0x3d: + case DEFCMD_LPD://0x3b: + { + cPin = (unsigned char *)&pointx; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + ptPoint.setX(pointx); + + cPin = (unsigned char *)&pointy; + *(cPin+3) = pSecretFileBuf[i++]; + *(cPin+2) = pSecretFileBuf[i++]; + *(cPin+1) = pSecretFileBuf[i++]; + *cPin = pSecretFileBuf[i++]; + ptPoint.setY(pointy); + + AddPoint2listXY(ptPoint); + m_ptCurrentPos = ptPoint; + } + break; + case DEFCMD_NULL://0x00:空指令 + AddPolylineToMarker(); + break; + default: + qDebug()< sizeof(m_headData.keyStr)) + { + if(fileData[0] == m_headData.keyStr[0] && fileData[1] == m_headData.keyStr[1] && fileData[2] == m_headData.keyStr[2]) + { + fileData.remove(0,sizeof(m_headData)); + } + } + ary.append(fileData); + file.close(); + + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + return false; + } + + // 写入修改后的数据 + file.write(ary); + file.close(); + + return true; +} + +PLT_Head ImportHPGL::getPltHead() +{ + return m_headData; +} + +bool ImportHPGL::C_Code() +{ + char cCh1; + bool bOk; + + bOk=GetChar(&cCh1); + if (bOk) + { + switch (cCh1) + { + case 'I': + case 'i': + bOk = MoveToNextEnglishChar(); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + return bOk; +} + +//分析S指令 +//输入参数: +// pFile 切割数据文件 +//输出参数: +// bEndOfFile =true 已到文件尾 +//返回值: +// true 正确的G指令 +// false 不正确的G指令 +bool ImportHPGL::S_Code() +{ + char cCh1; + bool bOk; + QString strInfo; + + bOk=GetChar(&cCh1); + if (bOk) { + switch (cCh1) { + case 'P': + case 'p': + AddPolylineToMarker(); + GetIntegerData(m_iPenNo); + break; + case 'I': + case 'i': + bOk=GetDoubleData(m_dTextWidth); + m_dTextWidth = m_dTextWidth * 10 * m_iDPMM; + bOk=SearchChar( ',' ,strInfo); + bOk=GetDoubleData(m_dTextHeight); + m_dTextHeight = m_dTextHeight * 10 * m_iDPMM; + break; + case 'C': + case 'c': + SC_Code(); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + return bOk; +} + +bool ImportHPGL::SC_Code() +{ + bool bOk; + QString strInfo; + double dXMin,dXMax,dYMin,dYMax; + int nType; + + bOk = GetDoubleData(dXMin); + bOk=SearchChar(',' ,strInfo); + bOk = GetDoubleData(dXMax); + bOk=SearchChar(',' ,strInfo); + bOk = GetDoubleData(dYMin); + bOk=SearchChar(',',strInfo); + bOk = GetDoubleData(dYMax); + if (NextCharIsComma()) + { + bOk = GetIntegerData(nType); + if (NextCharIsComma()) + { + bOk = GetDoubleData(m_sc.dLeft); + bOk=SearchChar( ',',strInfo); + bOk = GetDoubleData(m_sc.dBottom); + } + } + else + { + nType = 0; + } + if (bOk) + { + m_sc.dXMin = dXMin; + m_sc.dXMax = dXMax; + m_sc.dYMin = dYMin; + m_sc.dYMax = dYMax; + m_sc.nType = nType; + SetScale(); + } + bOk = MoveToNextEnglishChar(); + return bOk; +} + +bool ImportHPGL::I_Code() +{ + char cCh1; + bool bOk; + QString strInfo; + + bOk=GetChar(&cCh1); + if (bOk) + { + switch (cCh1) + { + case 'N': + case 'n': + break; + case 'P': + case 'p': + int nP1X,nP1Y,nP2X,nP2Y; + bOk = GetIntegerData(nP1X); + if (bOk) + { + bOk=SearchChar( ',' , strInfo); + bOk = GetIntegerData(nP1Y); + bOk=SearchChar(',' ,strInfo); + bOk = GetIntegerData(nP2X); + bOk=SearchChar(',' ,strInfo); + bOk = GetIntegerData(nP2Y); + } + if (bOk) + { + m_ptP1.setX(nP1X); + m_ptP1.setY(nP1Y); + m_ptP2.setX(nP2X); + m_ptP2.setY(nP2Y); + } + bOk = MoveToNextEnglishChar(); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + return bOk; +} + +bool ImportHPGL::PU_Code() +{ + bool bOk; + QPoint ptPoint; + + AddPolylineToMarker(); + bOk = GetCoordinate(ptPoint); + if (bOk) + { + m_ptCurrentPos = ptPoint; + } + + m_bPenUp = true; + + bOk=true; + return bOk; +} + +bool ImportHPGL::PD_Code() +{ + bool bOk; + QPoint ptPoint; + + bOk = GetCoordinate(ptPoint); + if (bOk) + { + AddPoint2listXY(ptPoint); + m_ptCurrentPos = ptPoint; + } + while (bOk) + { + if (NextCharIsComma()) + { + bOk = GetCoordinate(ptPoint); + if (bOk) + { + AddPoint2listXY(ptPoint); + m_ptCurrentPos = ptPoint; + } + } + else + { + break; + } + } + m_bPenUp = false; + + bOk=true; + return bOk; +} + +bool ImportHPGL::P_Code() +{ + bool bOk; + char c; + + if (GetChar(&c)) + { + switch (c) + { + case 'U': + case 'u': + PU_Code(); + break; + case 'D': + case 'd': + PD_Code(); + break; + case 'A': + case 'a': + if (m_bPenUp) + { + PU_Code(); + } + else + { + PD_Code(); + } + break; + case 'G': + case 'g': + m_bPage = true; + AddPolylineToMarker(); + m_nLength = m_pMarker->GetRect().right(); + //qDebug()<< "length:" << m_nLength; + //qDebug()<< "line count:" << m_pMarker->m_listPolyline.size(); + m_bPage = false; + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + bOk=true; + return bOk; +} + +bool ImportHPGL::L_Code() +{ + char cCh1; + bool bOk; + QString strText; + VectorFont vectorFont; + connect(&vectorFont, SIGNAL(siLineTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint))); + connect(&vectorFont, SIGNAL(siMoveTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint))); + + CRPPolyline crppolylineTemp; + + bOk=GetChar(&cCh1); + if (bOk) + { + switch (cCh1) + { + case 'T': + case 't': + AddPolylineToMarker(); + GetLineType(m_lineType); + bOk = MoveToNextEnglishChar(); + break; + case 'B': + case 'b': + AddPolylineToMarker(); + bOk = SearchChar(m_chTerminator,strText); + m_ptCurrentPos = GetTextOrigin(m_ptCurrentPos,strText); + + crppolylineTemp.m_nDrawingType = 3; + crppolylineTemp.m_text.m_strText = strText; + crppolylineTemp.m_text.m_ptTextPos = m_ptCurrentPos; + crppolylineTemp.m_text.m_dTextAngle = m_dTextAngle; + crppolylineTemp.m_text.m_nHeight = m_dTextHeight; + crppolylineTemp.m_text.m_nWidth = m_dTextWidth; + crppolylineTemp.m_text.m_ptPostLU = m_ptCurrentPos; + crppolylineTemp.m_text.m_ptPostLD = QPoint(m_ptCurrentPos.x(),m_ptCurrentPos.y()+m_dTextHeight); + crppolylineTemp.m_text.m_ptPostRU = QPoint(m_ptCurrentPos.x()+m_dTextWidth*strText.length(),m_ptCurrentPos.y()); + crppolylineTemp.m_text.m_ptPostRD = QPoint(m_ptCurrentPos.x()+m_dTextWidth*strText.length(),m_ptCurrentPos.y()+m_dTextHeight); + + //用线段方法绘制 +#ifdef Q_OS_WIN + vectorFont.m_dFontHeight = m_dTextHeight; + vectorFont.m_dFontAngle = m_dTextAngle; + vectorFont.TextOutString(m_ptCurrentPos.x(),m_ptCurrentPos.y(),strText.toStdString().c_str(),strText.size()); +#endif + + //qDebug()<m_listPolyline.append(crppolylineTemp);//用文本方法绘制 + + break; + case 'O': + case 'o': + bOk=GetIntegerData(m_nLableOrigin); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + return bOk; +} + + +bool ImportHPGL::D_Code() +{ + char cCh1; + bool bOk; + QString strInfo; + + bOk=GetChar(&cCh1); + if (bOk) { + switch (cCh1) { + case 'F': + case 'f': + break; + case 'I': + case 'i': + double dX,dY; + + bOk = GetDoubleData(dX); + if (bOk) + { + bOk = SearchChar(',' ,strInfo); + bOk = GetDoubleData(dY); + } + else + { + dX = 1; + dY = 0; + } + m_dTextAngle = GetTextAngle(dX,dY); + bOk = MoveToNextEnglishChar(); + break; + case 'T': + case 't': + char chTerminator; + int nTerminatorMode; + bOk = GetChar(&chTerminator); + if (bOk) + { + m_chTerminator = chTerminator; + bOk = GetIntegerData(nTerminatorMode); + if (bOk) + { + m_nTerminatorMode = nTerminatorMode; + } + } + bOk = MoveToNextEnglishChar(); + break; + default: + bOk = MoveToNextEnglishChar(); + break; + } + } + + return bOk; +} + +bool ImportHPGL::Write(QString strPathName,Marker *pMarker) +{ + QFile *writeFile = new QFile(strPathName); + writeFile->open(QIODevice::ReadWrite | QFile::Truncate); + // 如果文件没有被占用可以打开 + // 创建stream + QTextStream txtOutput(writeFile); + + QString strHPGL = "IN;DF;SP0;PU0,0;"; + //int nLength = 0; + int i,j; + int iLineCount,iPointCount; + + QString strTemp; + int nOldPenNo = 0; + + bool bSetLT = false; + + iLineCount = pMarker->m_listPolyline.size(); + for (i = 0; i < iLineCount; i++) + { + CRPPolyline polyLine = pMarker->m_listPolyline.at(i); + + if (polyLine.m_lineType.bDefault == false) + { + bSetLT = true; + strTemp = QString("LT%1,%2,%3;").arg(polyLine.m_lineType.nLinetype).arg(polyLine.m_lineType.nPatternLength).arg(1); + } + else + { + if (bSetLT) + strTemp = "LT;"; + } + strHPGL = strHPGL + strTemp; + + if (polyLine.m_nDrawingType == 0) + { + iPointCount = polyLine.m_listPoint.size(); + //选择画笔 1为笔绘 3为半透切割 其它为切割 + if (nOldPenNo != polyLine.m_nPenNo) + { + if (polyLine.m_nPenNo == 1) + { + strTemp = QString("SP%1;").arg(polyLine.m_nPenNo); + nOldPenNo = polyLine.m_nPenNo; + } + else if (polyLine.m_nPenNo == 3) + { + strTemp = QString("SP%1;").arg(polyLine.m_nPenNo); + nOldPenNo = polyLine.m_nPenNo; + } + else + { + strTemp = QString("SP%1;").arg(polyLine.m_nPenNo); + nOldPenNo = polyLine.m_nPenNo; + } + strHPGL = strHPGL + strTemp; + } + + + for (j = 0; j < iPointCount; j++) + { + + QPoint pt = polyLine.m_listPoint.at(j); + + if (j == 0) + { + strTemp = QString("PU%1,%2;").arg(pt.x()).arg(pt.y()); + + } + else if(j == 1) + { + if (j + 1 == iPointCount) + { + strTemp = QString("PD%1,%2;").arg(pt.x()).arg(pt.y()); + + } + else + { + strTemp = QString("PD%1,%2,").arg(pt.x()).arg(pt.y()); + + } + } + else + { + if (j + 1 == iPointCount) + { + + strTemp = QString("%1,%2;").arg(pt.x()).arg(pt.y()); + } + else + { + strTemp = QString("%1,%2,").arg(pt.x()).arg(pt.y()); + + } + } + strHPGL = strHPGL + strTemp; + } + } + else if (polyLine.m_nDrawingType == 5) + { + strTemp = "SP20;"; + strHPGL = strHPGL + strTemp; + strTemp = QString("PU%1,%2;").arg(polyLine.m_drill.m_pt.x()).arg(polyLine.m_drill.m_pt.y()); + strHPGL = strHPGL + strTemp; + strTemp = QString("PD%1,%2;").arg(polyLine.m_drill.m_pt.x()).arg(polyLine.m_drill.m_pt.y()); + strHPGL = strHPGL + strTemp; + nOldPenNo = 20; + } + + // 在stream追加数据,并换行 + txtOutput << strHPGL << endl; + strHPGL = ""; + + } + strHPGL = strHPGL + "SP0;"; + //nLength = strHPGL.size(); + + // 在stream追加数据,并换行 + txtOutput << strHPGL << endl; + strHPGL = ""; + writeFile->close(); + return true; +} + +// 生成预览图 +int ImportHPGL::createPreviewImage(QImage *pImg, int saveflag, int penwidth, int reDraw) +{ +#if(1) + if(reDraw == 0)//图片存在则不重画 + { + // 图片是否存在,存在则返回 + QString previewPath = getFileFullPathName() + ".preview.png"; + QFile imageFile(previewPath); + if (imageFile.exists()) + { + return 1; + } + } +#endif + + int newimgflag = 0; + QImage * pImage; + int width, height; + if (pImg == NULL) + { + width = PLT_PREVIEW_WIDTH; + height = PLT_PREVIEW_HEIGHT; + pImage = new QImage(width, height, IMAGE_TYPE); + newimgflag = 1; + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + + if (width <= PLT_PREVIEW_SIDE*2 || height <= PLT_PREVIEW_SIDE*2) + { + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + qDebug("preview img too small"); + return -1; + } + + memset(pImage->bits(), 0x00, pImage->byteCount()); + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 0); // 透明背景 + + // 背景 + QPen pen; + pen.setWidth(penwidth); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + if(m_pMarker == NULL) + { + return -1; + } + + //得到XY边界值 + QRect rect = m_pMarker->GetRect(); + int minX = rect.left(); + int maxX = rect.right(); + int minY = rect.top(); + int maxY = rect.bottom(); + + // 图形显示区域 + int dpminx = PLT_PREVIEW_SIDE; + int dpmaxx = width - PLT_PREVIEW_SIDE; + int dpminy = PLT_PREVIEW_SIDE + PLT_PREVIEW_SIDE; + int dpmaxy = height - PLT_PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + factor = (double)(abs(maxX - minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(abs(maxY - minY)) / (dpmaxy - dpminy); // 按轮廓计算,最小能够放下重复次数个图形 + + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((maxX+minX)/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - ((maxY+minY)/factor)/2); + + // 显示花样图形 + QColor sewcolor = QColor(Qt::green); + if(g_emTheme==theme2) + sewcolor = QColor(Qt::blue); + pen.setColor(sewcolor); + painter.setPen(pen); + + CBitmapInfo bitmapInfo; + + int nLineCount = m_pMarker->m_listPolyline.size(); + for(int i = 0; i < nLineCount; i++) + { + QPainterPath painterPath; + CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i); + int type = polyLine.m_nDrawingType; + + //根据笔类型切换颜色 + if(polyLine.m_nPenNo == 1) + pen.setColor(Qt::green); + else if(polyLine.m_nPenNo == 2) + pen.setColor(Qt::blue); + else if(polyLine.m_nPenNo == 3) + pen.setColor(Qt::blue); + else if(polyLine.m_nPenNo == 4) + pen.setColor(Qt::blue); + + if(type == 0)//直线 + { + int nPointCount = polyLine.m_listPoint.size(); + for(int j = 0; j < nPointCount; j++) + { + double x = polyLine.m_listPoint.at(j).x() / factor + dpx; + double y = polyLine.m_listPoint.at(j).y() / factor + dpy; + + if (PLT_SHOWDIRX == -1) + { + x = width - x; + } + if (PLT_SHOWDIRY == -1) + { + y = height - y; + } + + QPointF point(x,y); + if(j == 0) + { + painterPath.moveTo(point); + } + else + { + painterPath.lineTo(point); + } + } + } + else if(type == 1)//位图 + { + bitmapInfo = polyLine.m_bitmapInfo; + int x = bitmapInfo.m_ptAbPostLU.x(); + int y = bitmapInfo.m_ptAbPostLU.y(); + + int nx = x / factor + dpx; + int ny = y / factor + dpy; + + if (PLT_SHOWDIRX == -1) + { + nx = width - nx; + } + if (PLT_SHOWDIRY == -1) + { + ny = height - ny; + } + + bitmapInfo.m_ptAbPostLU.setX(nx); + bitmapInfo.m_ptAbPostLU.setY(ny); + } + painter.setPen(pen); + painter.drawPath(painterPath); + } + + if(bitmapInfo.m_iBytes > 0)//有位图 + { + painter.drawPixmap(bitmapInfo.m_ptAbPostLU.x(),bitmapInfo.m_ptAbPostLU.y(),bitmapInfo.m_pBitmap); + } + + // 保存成文件 + QString preview = getFileFullPathName(); + if (saveflag != 0 && preview.isEmpty() == false) + { +#if (1) + preview += ".preview.png"; + pImage->save(preview, "png"); +#endif + } + + if (pImage != NULL && newimgflag == 1) + { + delete pImage; + } + + return 0; +} + +//转换为中间绝对坐标数据 +void ImportHPGL::convertDataToEmbAbs() +{ + CBitmapInfo bitmapInfo; + m_embAbsData.clear(); + + //得到数据的第一个点 + int firstx = 0, firsty = 0, firstFlag = 0; + int nLineCount = m_pMarker->m_listPolyline.size(); + for(int i = 0; i < nLineCount; i++) + { + if(firstFlag != 0) + { + break; + } + + CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i); + int type = polyLine.m_nDrawingType; + + if(type == 0)//直线 + { + int nPointCount = polyLine.m_listPoint.size(); + for(int j = 0; j < nPointCount; j++) + { + firstx = polyLine.m_listPoint.at(j).x(); + firsty = polyLine.m_listPoint.at(j).y(); + firstFlag = 1; + break; + } + } + else if(type == 1)//位图 + { + bitmapInfo = polyLine.m_bitmapInfo; + firstx = bitmapInfo.m_ptAbPostLU.x(); + firsty = bitmapInfo.m_ptAbPostLU.y(); + firstFlag = 1; + } + } + + //转换为绝对坐标的中间数据 + QByteArray absData;//绝对坐标 + absData.clear(); + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + absItem.ctrl = m_stepCtrl; + + DsAbsItem addabsItem;//拐点item + memset(&addabsItem,0,sizeof(DsAbsItem)); + addabsItem.ctrl = DATA_ANGLE; + + // 绝对坐标数据 + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + double xfactor = (1.0 / (double)M_IDPMM) * PLT_EMB_DATADIRX * PLT_EMB_DATASCALE * g_xCorrectionFactor; + double yfactor = (1.0 / (double)M_IDPMM) * PLT_EMB_DATADIRY * PLT_EMB_DATASCALE * g_yCorrectionFactor; + + if(g_emMacType == MACHINE_GLASSFIBRE || g_emMacType == MACHINE_CUTTINGWALK) + { + yfactor *= -1;//铣切机y取反 + } + + //得到XY边界值 + QRect rect = m_pMarker->GetRect(); + m_minX = (rect.left() - firstx) * xfactor; + m_maxX = (rect.right() - firstx) * xfactor; + m_minY = (rect.top() - firsty) * yfactor; + m_maxY = (rect.bottom() - firsty) * yfactor; + + int stepidx = 0; + double ddx = 0, ddy = 0, prex, prey, ar = 0, x = 0, y = 0; + //前一针初始值 + prex = 0; + prey = 0; + + QList polyLineList = m_pMarker->m_listPolyline; + + for(int i = 0; i < polyLineList.size(); i++) + { + CRPPolyline polyLine = polyLineList.at(i); + int type = polyLine.m_nDrawingType; + + if(type == 0)//直线 + { + int nPointCount = polyLine.m_listPoint.size(); + for(int j = 0; j < nPointCount; j++) + { + x = (polyLine.m_listPoint.at(j).x() - firstx) * xfactor; + y = (polyLine.m_listPoint.at(j).y() - firsty) * yfactor; + + ddx = x - prex; + ddy = y - prey; + double tar = atan2(ddy,ddx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + + //图元之间的连接转换为偏移针步 + if(i != 0 && j == 0) + { + absItem.ctrl = DATA_OFFSET; + } + else + { + if(g_emMacType == MACHINE_GLASSFIBRE || g_emMacType == MACHINE_CUTTINGWALK) + { + if(polyLine.m_nPenNo == 1) + { + absItem.ctrl = DATA_DRAWING;//画笔 + } + else if(polyLine.m_nPenNo == 2) + { + prex = x; + prey = y; + continue; + } + else if(polyLine.m_nPenNo == 3) + { + absItem.ctrl = DATA_SKNIFE; + } + else if(polyLine.m_nPenNo == 4) + { + absItem.ctrl = DATA_RKNIFE; + } + } + else + { + absItem.ctrl = m_stepCtrl; + } + } + + absItem.ax = x; + absItem.ay = y; + absItem.ar = ar; + prex = x; + prey = y; + + absData.append((char*)(&absItem), sizeof(DsAbsItem)); + stepidx++; + } + } + else if(type == 1)//位图 + { + bitmapInfo = polyLine.m_bitmapInfo; + x = (bitmapInfo.m_ptAbPostLU.x() - firstx) * xfactor; + y = (bitmapInfo.m_ptAbPostLU.y() - firsty) * yfactor; + + ddx = x - prex; + ddy = y - prey; + double tar = atan2(ddy,ddx); + ar = (tar * 10000+0.5*(tar>0?1:-1)); + + //图元之间的连接转换为偏移针步 + absItem.ctrl = DATA_OFFSET; + absItem.ax = x; + absItem.ay = y; + absItem.ar = ar; + prex = x; + prey = y; + + absData.append((char*)(&absItem), sizeof(DsAbsItem)); + stepidx++; + } + } + + + //添加结束针步数据 + absItem.ctrl = 0; + absData.append((char*)(&absItem), sizeof(DsAbsItem)); + stepidx++; + + int newstepnum = stepidx; // 转换后的数据长度 + + // 文件头转换 + QString name = getFileFullPathName(); + int namelen = name.size(); + if (namelen > HEAD_NAME_STR_LEN) + { + namelen = HEAD_NAME_STR_LEN; + } + memcpy(dhead.fileName, name.data(), namelen); // 文件名称 + dhead.dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + dhead.itemNums = newstepnum; // 数据项个数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + dhead.dataChecksum = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 原始数据累加校验和 + dhead.fileid = fileID; //中间数据的 fileid = + + dhead.anchorX = 0; // 定位点坐标X + dhead.anchorY = 0; // 定位点坐标Y + dhead.beginX = 0; // 数据起点坐标X + dhead.beginY = 0; // 数据起点坐标Y + dhead.beginR = 0; + dhead.minX = m_minX; + dhead.maxX = m_maxX; + dhead.minY = m_minY; + dhead.maxY = m_maxY; // 轮廓范围,使用重新计算之后的值 + + //dhead.pressureHigh2 = m_headData.pressureHigh2; + //dhead.pressureHigh3 = m_headData.pressureHigh3; + //dhead.pressureHigh5 = m_headData.pressureHigh5; + //dhead.pressureHigh6 = m_headData.pressureHigh6; + //dhead.pressureHigh7 = m_headData.pressureHigh7; + //dhead.pressureHigh8 = m_headData.pressureHigh8; + //dhead.pressureHigh9 = m_headData.pressureHigh9; + + // 保存文件头到数组中 + m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead)); + + // 保存数据到数组中 + m_embAbsData.append(absData); +} + +void ImportHPGL::setStepCtrl(u8 ctrl) +{ + m_stepCtrl = ctrl; +} + +QByteArray ImportHPGL::getEmbAbsData() +{ + return m_embAbsData; +} + +#if(0) +QPainterPath ImportHPGL::GetPolylinePainterPath() +{ + return m_polylinePainterPath; +} +#endif + +#if(0) +int ImportHPGL::CreatePreviewImage(QString saveName,QImage *pImg, int saveflag) +{ + QImage * pImage = NULL; + int width, height; + width = height = 0; + + if (pImg == NULL) + { + width = (m_maxX - m_minX) / M_IDPMM + 2*PREVIEW_SIDE; + height = (m_maxY - m_minY) / M_IDPMM+ 2*PREVIEW_SIDE; + pImage = new QImage(width, height, QImage::Format_ARGB32); // + } + else + { + pImage = pImg; + } + + width = pImage->width(); + height = pImage->height(); + if (width < PREVIEW_SIDE*2 || height < PREVIEW_SIDE*2) + { + if (pImage != NULL) + { + delete pImage; + } + return -1; + } + + QPainter painter(pImage); + QColor backcolor(255, 255, 255, 255); + QColor pencolor(0, 0, 0, 255); + + // 背景 + QPen pen; + pen.setWidth(1); + pen.setColor(backcolor); + painter.setPen(pen); + painter.setBrush(backcolor); + painter.drawRect(0, 0, width, height); + + // 图形显示区域 + int dpminx = PREVIEW_SIDE; + int dpmaxx = width - PREVIEW_SIDE; + int dpminy = PREVIEW_SIDE; + int dpmaxy = height - PREVIEW_SIDE; + + // 计算缩放系数 + double factor, temp; + factor = (double)(abs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 + temp = (double)(abs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按轮廓计算,最小能够放下重复次数个图形 + if (temp >= factor) // 使用较大的缩放系数 + { + factor = temp; + } + + // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) + int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); + int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); + + int curx, cury, prex, prey; + curx = cury = prex = prey = 0; + + curx = dpx; + cury = (height) - dpy; + + pen.setColor(pencolor); + painter.setPen(pen); + + int nLineCount = m_pMarker->m_listPolyline.size(); + for(int i = 0; i < nLineCount; i++) + { + CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i); + int nPointCount = polyLine.m_listPoint.size(); + for(int j = 0; j < nPointCount; j++) + { + prex = curx; + prey = cury; + + curx = polyLine.m_listPoint.at(j).x() / factor+ dpx; + cury = height - (polyLine.m_listPoint.at(j).y() / factor + dpy); + + if(j == 0) + { + continue; + } + + painter.drawLine(prex, prey, curx, cury); + } + } + + // 保存成文件 + if (saveflag != 0) + { + saveName += ".preview.bmp"; + pImage->save(saveName, "bmp"); + } + + if (pImage != NULL) + { + pImage = NULL; + delete pImage; + } + + return 0; +} +#endif diff --git a/datafile/hpgl/importhpgl.h b/datafile/hpgl/importhpgl.h new file mode 100644 index 0000000..5030338 --- /dev/null +++ b/datafile/hpgl/importhpgl.h @@ -0,0 +1,323 @@ +#ifndef IMPORTHPGL_H +#define IMPORTHPGL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "marker.h" +#include "machine/comm/config.h" +#include "machine/comm/datadef.h" +#include "machine/comm/crc16.h" + +#define DEFCMD_IN 0x8A //IN +#define DEFCMD_SP 0x7C //SP +#define DEFCMD_LT 0xE6 //LT 0:PS_SOLID; 1:PS_DASH; 2:PS_DOT; 3:PS_DASHDOT +#define DEFCMD_PG 0x97 //PG +#define DEFCMD_PU 0xB5 //PU 单个PU +#define DEFCMD_PD 0x3D //PD 单个PD +#define DEFCMD_LPU 0x5E //PU 连续PU +#define DEFCMD_LPD 0x3B //PD 连续PD +#define DEFCMD_DI 0x5B //AG 角度 +#define DEFCMD_SI 0x5D //SI 64位双精度浮点 +#define DEFCMD_FN 0x4B //FN 字体名 +#define DEFCMD_LB 0x4D //LB +#define DEFCMD_BT 0x9A //BIT 位图 +#define DEFCMD_CODE 0xE7 //CODE 条形码、二维码 +#define DEFCMD_NULL 0x00 //NUll 空指令 +#define DEFCMD_DRILL 0xD2 //DRILL 冲孔 +#define DEFCMD_NOTCH 0xD3 //NOTCH 剪口 + +#define M_IDPMM 40.0 +#define MMPIXELY 7.936508 + +#define PREVIEW_SIDE (10) +#define PREVIEW_WIDTH (240) +#define PREVIEW_HEIGHT (240) + +#define WIDTHBYTES(bits) (((bits)+31)/32*4) + +#define PixelFormatIndexed 0x00010000 // Indexes into a palette +#define PixelFormatGDI 0x00020000 // Is a GDI-supported format +#define PixelFormat1bppIndexed (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI) + +#define PLT_PREVIEW_SIDE (15) // 留边大小 +#define PLT_PREVIEW_WIDTH (156) // 默认预览图区域宽度 +#define PLT_PREVIEW_HEIGHT (164) // 默认预览图区域高度 + +#define PLT_EMB_DATADIRX (1) // X向数据坐标与下位机坐标系统的差异 +#define PLT_EMB_DATADIRY (-1) // Y向数据坐标与下位机坐标系统的差异 +#define PLT_EMB_DATADIRR (1) // R向数据坐标与下位机坐标系统的差异 +#define PLT_EMB_DATASCALE 100 // plt数据转为下位机数据需要扩大10倍,因为下位机单位为0.01mm + +#define PLT_SHOWDIRX (1) // X向显示坐标和数据坐标的差异 +#define PLT_SHOWDIRY (-1) // Y向显示坐标和数据坐标的差异 + +struct SC +{ + double dXMin; + double dXMax; + double dYMin; + double dYMax; + int nType; + double dLeft; + double dBottom; +}; + +struct PLT_Head +{ + char keyStr[3]; + u16 pressureHigh1; + u16 pressureHigh2; + u16 pressureHigh3; + u16 pressureHigh4; + u16 pressureHigh5; + u16 pressureHigh6; + u16 pressureHigh7; + u16 pressureHigh8; + u16 pressureHigh9; + u16 pressureHigh10; + u16 pressureHigh11; + u16 pressureHigh12; + u16 pressureHigh13; + u16 pressureHigh14; + u16 pressureHigh15; + u16 pressureHigh16; + s32 anchorX; + s32 anchorY; + char endStr; +}; + +class ImportHPGL : public QObject +{ + Q_OBJECT +public: + explicit ImportHPGL(QObject *parent = 0); + virtual ~ImportHPGL(); + +signals: + +public slots: + +private: + inline const QString & getFileFullPathName() const {return m_fileFullPathName;} // 文件路径名称 + + //获得QR二维码版本 + //输入参数:nCount 字符个数 + //返回参数:QR二维码版本 + int GetQRVesion(int nCount); + + //样点旋转 + //输入参数: + // ptPoint被旋转点,ptPointO旋转原点,dSinBeta,dCosBeta逆时针旋转角度的正余弦 + //输出参数: + // ptPoint旋转后的值 + void PointRotate(QPoint &ptPoint,QPoint ptPointO,double dSinBeta,double dCosBeta); + +protected: + + //分析S指令 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // bEndOfFile =true 已到文件尾 + //返回值: + // true 正确的G指令 + // false 不正确的G指令 + bool S_Code(); + bool I_Code(); + bool P_Code(); + bool PU_Code(); + bool PD_Code(); + bool L_Code(); + bool D_Code(); + bool SC_Code(); + bool C_Code(); + + //读取一个字符 + //输出参数: + // *pChar 读取的字符 + //返回值: + // 1 成功取得一个字符 + // 0 失败 + uint ReadChar(char* lpBuf); + + //读取一个非空格、非回车、非换行的字符 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // *pChar 读取的字符 + //返回值: + // true 成功取得一个字符 + // false 失败 + bool GetChar(char *pChar); + //判断下一个非空格、非回车、非换行的字符是不是',' + //输入参数: + // pFile 切割数据文件 + //返回值: + // true 下一个非空格、非回车、非换行的字符是',', 并且已将','从文件中读出 + // false 下一个非空格、非回车、非换行的字符不是',', 并且该字符没有从文件中读出 + bool NextCharIsComma(); + + //取一个双精度浮点数 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // dValue 取得的双精度浮点数 + //返回值: + // true 成功取得一个双精度浮点数dValue + // false 失败 + bool GetDoubleData(double &dValue); + + //取一个整数 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // iValue 取得的整数 + //返回值: + // true 成功取得一个整数iValue + // false 失败 + bool GetIntegerData(int &iValue); + + //取坐标值 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // ptPoint 坐标 + //返回值: + // true 成功 + // false 失败 + bool GetCoordinate(QPoint &ptPoint); + + //获得线的类型 + //输入参数: + // pFile 切割数据文件 + //输出参数: + // lineType 线型 + //返回值: + // true 成功 + // false 失败 + bool GetLineType(LineType &lineType); + + //查找一个指定的字符 + //输入参数: + // pFile 切割数据文件 + // cFind 指定的字符 + //输出参数: + // strInfo 从开始位置到指定字符之前的内容(不包括最后的指定字符) + //返回值: + // true 成功取得一个字符 + // false 失败 + bool SearchChar(char cFind,QString &strInfo); + + //将文件的读取位置移到下一个英文字母(26个英文字母) + //输入参数: + // pFile 切割数据文件 + //输出参数: + // *pChar 读取的字符 + //返回值: + // true 成功将文件的读取位置移到下一个英文字母 + // false 失败 + bool MoveToNextEnglishChar(); + + //将m_listXY加入到m_pMarker中,并将m_listXY清空 + void AddPolylineToMarker(); + + void AddPoint2listXY(QPoint ptPoint); + + QString m_fileFullPathName; //文件名称 + int m_iDPMM; //长度数据单位:m_iDPMM(每毫米点) + int m_iPenNo; //当前的笔号 + QPoint m_ptCurrentPos; //笔的当前位置,单位:(1/CMarker::m_iDPMM)毫米 + LineType m_lineType;//当前线型 + bool m_bPenUp;//当前刀具的状态 true:刀具状态为抬起 false:刀具状态为落下 + bool m_bPage;//是否识别到PG指令 + + Marker *m_pMarker; //当前使用的唛架,仅能在读文件时使用 + double m_dScale; //读入文件时将切割数据文件的单位转换成内部数据单位时的比例 + QPen m_penPen;//笔绘画笔 + QPen m_cutPen;//切割画笔 + QPen m_halfCutPen;//半透切割画笔 + + QList m_listXY; //还没有确定抬落刀的坐标 + //QPainterPath m_polylinePainterPath;//绘图路径-线段 + + unsigned char m_chTerminator;//标志终结符,除了NULL LF ESC及;十进制分别为0,5,27,59;外的所有字符,默认为ETX 十进制3 + int m_nTerminatorMode;//模式0:打印1:不打印 默认值为1 + + double m_dTextHeight;//字的高度 单位cm + double m_dTextWidth;//字的宽度 单位cm + int m_nLableOrigin;//字符串相对于原点位置 + double m_dTextAngle;//指定每行文本输出时相对于设备x轴的角度,其单位为1/10度 + QPoint m_ptP1;//解析IP指令中的坐标点 + QPoint m_ptP2;//解析IP指令中的坐标点 + SC m_sc;//解析SC指令 + double m_dScaleX;//通过 IP和SC指令算出的缩放比例 + double m_dScaleY;//通过 IP和SC指令算出的缩放比例 + QPoint m_ptOrigin;//通过 IP和SC指令算出的原点 + int m_nLength;//用于PG分页,记录累计长度 + char* m_pFileBuf;//存放从文件中读取的全部字符 + int m_nCharCount;//已经读取的字符个数 + int m_nFileLength;//文件长度 + QString m_workPath; + + bool m_bFontItalic; //文字斜体 + int m_iFontSize; //字体榜数 + QString m_strFontName;//字体名称 + + bool HFD_Code();//设置头文件 +private: + QByteArray m_embAbsData; // 转换后的绝对坐标数据 + int m_minX; + int m_maxX; + int m_minY; + int m_maxY; + u8 m_stepCtrl; + PLT_Head m_headData;// 头文件数据 + +public: + //输入参数: + // pFile 需要读入的RS274D文件 + // pMarker 解析到的数据保存到此唛架 + //返回值: + // true 读入文件成功 + // false 读入文件失败 + bool Read(QString strPathName); + bool Write(QString strPathName,Marker *pMarker); + int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件 + void convertDataToEmbAbs(); // 转换为绝对数据 + void setStepCtrl(u8 ctrl);//设置针步属性 + QByteArray getEmbAbsData(); // 得到转换后的数据 + + //void creatPolylinePainterPath();//获得文件图形的范围 + //QPainterPath GetPolylinePainterPath(); + + //初始化参数,读取参数前,需将参数值重置,避免造成参数值读取错误 + void IniPara(); + + QPoint GetTextOrigin(QPoint pt,QString strText); + double GetTextAngle(double dX,double dY); + void SetScale(); + bool IsSecretFile(QString strPatnName); + int BitMapDtat(QString strFileName,QString strSecretFile); + bool ReadSecretFile(QString stePathName); // 打开位图文件 + + bool setPltHead(PLT_Head head, QString path); + PLT_Head getPltHead(); + +private slots: + //输入参数: + // bUp 刀的状态,true:抬起状态 false:落下状态 + // ptPoint 矢量字体中点阵中的一个坐标 + void AddTextPointToLine(bool bUp,QPoint ptPoint); +}; + +#endif // IMPORTHPGL_H diff --git a/datafile/hpgl/marker.cpp b/datafile/hpgl/marker.cpp new file mode 100644 index 0000000..4ab42d8 --- /dev/null +++ b/datafile/hpgl/marker.cpp @@ -0,0 +1,262 @@ +#include "marker.h" + +Marker::Marker(QObject *parent) : + QObject(parent) +{ + m_iDPMM = 40; + m_listPolyline.clear(); + m_nProducts = 0; + m_nActualMatchRegions = 0; + m_nMatchRegions = 0; + m_strProductCode = ""; +} + +Marker::~Marker() +{ +} + +Marker::Marker(const Marker &a): QObject() +{ + m_iDPMM = a.m_iDPMM; + m_listPolyline.clear(); + m_listPolyline.append(a.m_listPolyline); + m_nProducts = a.m_nProducts; + m_nActualMatchRegions = a.m_nActualMatchRegions; + m_nMatchRegions = a.m_nMatchRegions; + m_strProductCode = a.m_strProductCode; +} + +Marker Marker::operator=(const Marker &a) +{ + m_iDPMM = a.m_iDPMM; + m_listPolyline.clear(); + m_listPolyline.append(a.m_listPolyline); + m_nProducts = a.m_nProducts; + m_nActualMatchRegions = a.m_nActualMatchRegions; + m_nMatchRegions = a.m_nMatchRegions; + m_strProductCode = a.m_strProductCode; + return *this; +} + +void Marker::Initialize() +{ + m_iDPMM = 40; + m_listPolyline.clear(); + m_nProducts = 0; + m_nActualMatchRegions = 0; + m_nMatchRegions = 0; + m_strProductCode = ""; +} + +QRect Marker::GetRect() +{ + QRect rect; + + CRPPolyline RPPolyline; + rect.setRect(0,0,0,0); + + for(int i = 0; i < m_listPolyline.size(); i++) + { + RPPolyline = m_listPolyline.at(i); + if (RPPolyline.m_nDrawingType == 0) + { + rect |= RectofPolyline(RPPolyline.m_listPoint); + } + else if (RPPolyline.m_nDrawingType == 3) + { + rect |= QRect(RPPolyline.m_text.m_ptPostLU,RPPolyline.m_text.m_ptPostRD); + } + else if (RPPolyline.m_nDrawingType == 1) + { + rect |= QRect(RPPolyline.m_bitmapInfo.m_ptAbPostLU,RPPolyline.m_bitmapInfo.m_ptAbPostRD); + } + } + + return rect; +} + +QRect Marker::RectofPolyline(const QList &listPoint) +{ + if(listPoint.empty()) + { + return QRect(0,0,0,0); + } + int iXMin = INT_MAX; + int iXMax = INT_MIN; + int iYMin = INT_MAX; + int iYMax = INT_MIN; + + int iValueX; + int iValueY; + + int iPointCount = listPoint.size(); + for(int i = 0 ;i < iPointCount; i++) + { + iValueX = listPoint.at(i).x(); + iValueY = listPoint.at(i).y(); + + if( iValueX > iXMax ) + { + iXMax = iValueX; + } + + if(iValueX < iXMin ) + { + iXMin = iValueX; + } + + if( iValueY > iYMax ) + { + iYMax = iValueY; + } + + if(iValueY < iYMin ) + { + iYMin = iValueY; + } + } + + return QRect(QPoint(iXMin,iYMin),QPoint(iXMax,iYMax)); +} + + +double CNotch::angle_2(int startx, int starty, int endx, int endy) +{ + //直线与X轴之间的夹角 X轴向量OE(1,0) + double dAngle = 0; + if((endx == startx) && (endy == starty)) + { + return dAngle; + } + //求直线的向量坐标 + double dX = endx - startx; + double dY = endy - starty; + dAngle = qAcos((dX)/(qSqrt(dX*dX + dY*dY))); + return dAngle; +} + +void CNotch::CovertToOutputByOffset(int nOffSetX, int nOffsetY) +{ + double a = 0; + double b = 0; + double c = 0; + //范围在[0,2pi)之间 + double dAngle = angle_2(m_ptStart.x(),m_ptStart.y(),m_ptEnd.x(),m_ptEnd.y()); + m_nAngle = dAngle*180.0/CONST_PI*100.0 + 0.5; + //double dX = m_ptEnd.x - m_ptStart.x; + //double dY = m_ptEnd.y - m_ptStart.y; + //double dLen = sqrt(dX*dX + dY*dY); + //m_ptCorrect.x = nOffSetY/dLen * dX + m_ptStart.x; + //m_ptCorrect.y = nOffsetY/dLen * dY + m_ptStart.y; + QPoint ptY; + ptY.setX(nOffsetY*cos(dAngle) + m_ptStart.x() + 0.5); + ptY.setY(nOffsetY*sin(dAngle) + m_ptStart.y() + 0.5); + + if (nOffSetX == 0) + { + m_ptCorrect.setX(ptY.x()); + m_ptCorrect.setY(ptY.y()); + return; + } + + int nX = m_ptEnd.x() - m_ptStart.x(); + int nY = m_ptEnd.y() - m_ptStart.y(); + + if (nX == 0) + { + a = 0; + b = 1; + c = -ptY.y(); + } + if (nY == 0) + { + a = 1; + b = 0; + c = -ptY.x(); + } + + double k = double(m_ptStart.x() - m_ptEnd.x())/double(m_ptEnd.y() - m_ptStart.y()); + c = ptY.y() - k*ptY.x(); + a = k; + b = -1; + int nRadius = abs(nOffSetX); + QPoint ptInter1; + QPoint ptInter2; + if (IntOfLineCircle(a,b,c,ptY.x(),ptY.y(),nRadius,ptInter1,ptInter2) == 2) + { + //向量 + int nYv = ptInter1.y() - ptY.y(); + int nXv = ptInter1.x() - ptY.x(); + //判断该点在起点到终点连线的哪一侧?>0 右侧 + if((nXv*nY -nYv*nX)>0) + { + if (nOffSetX > 0)//右侧 + { + m_ptCorrect.setX(ptInter1.x()); + m_ptCorrect.setY(ptInter1.y()); + } + else + { + m_ptCorrect.setX(ptInter2.x()); + m_ptCorrect.setY(ptInter2.y()); + } + + } + else + { + if (nOffSetX < 0)//左侧 + { + m_ptCorrect.setX(ptInter1.x()); + m_ptCorrect.setY(ptInter1.y()); + } + else + { + m_ptCorrect.setX(ptInter2.x()); + m_ptCorrect.setY(ptInter2.y()); + } + } + } +} + +int CNotch::IntOfLineCircle(double a, double b, double c, int xc, int yc, int nR, QPoint &lpptIntersection1, QPoint &lpptIntersection2) +{ + //点:(x0,y0) + //线:Ax+By+C=0 + //①距离=ABS(A*x0+B*y0+C) / SQRT(A*A+B*B) + double dis = 0; + dis = abs(a*xc+b*yc+c)/sqrt(a*a+b*b); + + int rel = 0; + if(dis < nR) + { + rel = 0; + } + else if(dis == nR) + { + rel = 1; + } + else if(dis > nR) + { + double k = -a/b; + double b1 = 2*xc-2*k*(b-yc); + double sval = (b1/100.0)*(b1/100.0)*10000.0-4*a*c; + if(sval < 0) + { + qDebug()< +#include +#include +#include +#include +#include + +#define CONST_PI 3.14159265359 + +struct LineType +{ + //具体参照HPGL英文版手册216页 当LT没有设置值时,线型为实线 + bool bDefault;//LT是否设置值 + int nLinetype;//线型 取值为-8~8 ,99 =0 实线 =1 虚线 + int nPatternLength;//图案长度 缺省为P1、P2距离的4% + int nMode;//0相对模式 缺省值 解释为P1、P2距离的百分比 1绝对模式,以毫米解释图案长度 +}; + + +class CBitmapInfo +{ +public: + //原始读取的的坐标 + QPoint m_ptPostLU; //位图的左上角在整个图中的XY位置 + QPoint m_ptPostLD; //位图的左下角在整个图中的XY位置 + QPoint m_ptPostRU; //位图的右上角在整个图中的XY位置 + QPoint m_ptPostRD; //位图的右下角在整个图中的XY位置 + + //换算后的坐标 + QPoint m_ptAbPostLU; //位图的左上角在整个图中的XY位置 + QPoint m_ptAbPostLD; //位图的左下角在整个图中的XY位置 + QPoint m_ptAbPostRU; //位图的右上角在整个图中的XY位置 + QPoint m_ptAbPostRD; //位图的右下角在整个图中的XY位置 + + int m_iTransparent;//为1时则为透明显示; 为0则为非透明显示 + int m_iBKColor;//背景颜色(在透明显示时背景颜色的点将不被显示) + + int m_iWidth;// GDI+中BitmapData的Width,单位:像素 + int m_iHeight;//GDI+中BitmapData的Height,单位:像素 + int m_iStride;//GDI+中BitmapData的Stride(每行的字节数) + int m_iPixelFormat;//GDI+中BitmapData的PixelFormat + + int m_iBytes;//int压缩后位图数据大小(字节数) + QBitmap m_pBitmap;//位图数据(压缩后的位图数据) + + CBitmapInfo() + { + m_ptPostLU = QPoint(0,0); + m_ptPostLD = QPoint(0,0); + m_ptPostRU = QPoint(0,0); + m_ptPostRD = QPoint(0,0); + m_ptAbPostLU = QPoint(0,0); + m_ptAbPostLD = QPoint(0,0); + m_ptAbPostRU = QPoint(0,0); + m_ptAbPostRD = QPoint(0,0); + m_iTransparent = 0; + m_iBKColor = 0; + m_iWidth = 0; + m_iHeight = 0; + m_iStride = 0; + m_iPixelFormat = 1; + m_iBytes = 0; + //m_pBitmap = NULL; + + } + ~CBitmapInfo() {} + CBitmapInfo operator=(const CBitmapInfo &a) + { + m_ptPostLU = a.m_ptPostLU; + m_ptPostLD = a.m_ptPostLD; + m_ptPostRU = a.m_ptPostRU; + m_ptPostRD = a.m_ptPostRD; + m_ptAbPostLU = a.m_ptAbPostLU; + m_ptAbPostLD = a.m_ptAbPostLD; + m_ptAbPostRU = a.m_ptAbPostRU; + m_ptAbPostRD = a.m_ptAbPostRD; + m_iTransparent = a.m_iTransparent; + m_iBKColor = a.m_iBKColor; + m_iWidth = a.m_iWidth; + m_iHeight = a.m_iHeight; + m_iStride = a.m_iStride; + m_iPixelFormat = a.m_iPixelFormat; + m_iBytes = a.m_iBytes; + m_pBitmap = a.m_pBitmap; + return *this; + } +}; + +class CRPArc +{ +public: + QPoint m_ptCenter; + int m_nRadius; + bool m_bCircle;//是圆还是圆弧1:圆 0 :圆弧 + QPoint m_ptStart;//圆弧起始点 + QPoint m_ptEnd;//圆弧结束点 + + CRPArc() + { + m_bCircle = true; + } + ~CRPArc() {} + CRPArc(CRPArc &a) + { + m_ptCenter = a.m_ptCenter; + m_nRadius = a.m_nRadius; + m_bCircle = a.m_bCircle; + m_ptStart = a.m_ptStart; + m_ptEnd = a.m_ptEnd; + } + CRPArc operator=(const CRPArc &a) + { + m_ptCenter = a.m_ptCenter; + m_nRadius = a.m_nRadius; + m_bCircle = a.m_bCircle; + m_ptStart = a.m_ptStart; + m_ptEnd = a.m_ptEnd; + return *this; + } +}; + +class CRPText +{ +public: + QString m_strText;//字符串 + QString m_strFontName;//字体名称 + QPoint m_ptTextPos;//文字起点坐标 + double m_dTextAngle;//文字角度 + int m_nHeight;//文字高度 + int m_nWidth;//文字宽度 + int m_nWeight;//加粗 + bool m_bItalic;//斜体 + + //文字坐标 + QPoint m_ptPostLU; //文字的左上角在整个图中的XY位置 + QPoint m_ptPostLD; //文字的左下角在整个图中的XY位置 + QPoint m_ptPostRU; //文字的右上角在整个图中的XY位置 + QPoint m_ptPostRD; //文字的右下角在整个图中的XY位置 + + + CRPText() + { + m_strText = ""; + m_strFontName = ""; + m_ptTextPos = QPoint(0,0); + m_dTextAngle = 0; + m_nHeight = 0; + m_nWidth = 0; + m_nWeight = 0; + m_bItalic = false; + m_ptPostLU = QPoint(0,0); + m_ptPostLD = QPoint(0,0); + m_ptPostRU = QPoint(0,0); + m_ptPostRD = QPoint(0,0); + } + ~CRPText() {} + CRPText(CRPText &a) + { + m_strText = a.m_strText; + m_strFontName = a.m_strFontName; + m_ptTextPos = a.m_ptTextPos; + m_dTextAngle = a.m_dTextAngle; + m_nHeight = a.m_nHeight; + m_nWidth = a.m_nWidth; + m_nWeight = a.m_nWeight; + m_bItalic = a.m_bItalic; + m_ptPostLU = a.m_ptPostLU; + m_ptPostLD = a.m_ptPostLD; + m_ptPostRU = a.m_ptPostRU; + m_ptPostRD = a.m_ptPostRD; + } + CRPText operator=( const CRPText &a) + { + m_strText = a.m_strText; + m_strFontName = a.m_strFontName; + m_ptTextPos = a.m_ptTextPos; + m_dTextAngle = a.m_dTextAngle; + m_nHeight = a.m_nHeight; + m_nWidth = a.m_nWidth; + m_nWeight = a.m_nWeight; + m_bItalic = a.m_bItalic; + m_ptPostLU = a.m_ptPostLU; + m_ptPostLD = a.m_ptPostLD; + m_ptPostRU = a.m_ptPostRU; + m_ptPostRD = a.m_ptPostRD; + return *this; + } +}; + +class CCode +{ +public: + int m_nLX;//左上角X位置 + int m_nLY;//左上角Y位置 + int m_nSizeX;//X方向大小 + int m_nSizeY;//Y方向大小 + int m_nAngle;//角度(逆时针方向为正),单位:0.01度 + int m_nType;//类型(0:条形码,1:二维码) + int m_nCount;//字符串个数(字符串的字节数) + QString m_strCode;//字符串 + QBitmap *m_pBitmap;//生成的位图数据 + + CCode() + { + m_nLX = 0; + m_nLY = 0; + m_nSizeX = 0; + m_nSizeY = 0; + m_nAngle = 0; + m_nType = 0; + m_nCount = 0; + m_strCode = ""; + } + ~CCode() {} + CCode(CCode &a) + { + m_nLX = a.m_nLX; + m_nLY = a.m_nLY; + m_nSizeX = a.m_nSizeX; + m_nSizeY = a.m_nSizeY; + m_nAngle = a.m_nAngle; + m_nType = a.m_nType; + m_nCount = a.m_nCount; + m_strCode = a.m_strCode; + m_pBitmap = a.m_pBitmap; + } + CCode operator=(const CCode &a) + { + m_nLX = a.m_nLX; + m_nLY = a.m_nLY; + m_nSizeX = a.m_nSizeX; + m_nSizeY = a.m_nSizeY; + m_nAngle = a.m_nAngle; + m_nType = a.m_nType; + m_nCount = a.m_nCount; + m_strCode = a.m_strCode; + m_pBitmap = a.m_pBitmap; + return *this; + } +}; + +class CNotch +{ +public: + QPoint m_ptStart;//剪口起点 + QPoint m_ptEnd;//剪口终点 + int m_nWidth;//剪口宽度 + int m_nNotchType;//剪口类型 + QPoint m_ptCorrect;//通过根据刀的X、Y偏移计算得出的实际落刀位置 + int m_nAngle;//根据交口起点和终点计算得出的角度(逆时针方向为正),单位:0.01度 + double angle_2(int startx,int starty,int endx,int endy); + + CNotch() + { + m_ptStart = QPoint(0,0); + m_ptEnd = QPoint(0,0); + m_nWidth = 0;; + m_nNotchType = 0; + m_ptCorrect = QPoint(0,0); + m_nAngle = 0; + } + ~CNotch() {} + CNotch(CNotch &a) + { + m_ptStart = a.m_ptStart; + m_ptEnd = a.m_ptEnd; + m_nWidth = a.m_nWidth; + m_nNotchType = a.m_nNotchType; + m_ptCorrect = a.m_ptCorrect; + m_nAngle = a.m_nAngle; + } + CNotch operator=(const CNotch &a) + { + m_ptStart = a.m_ptStart; + m_ptEnd = a.m_ptEnd; + m_nWidth = a.m_nWidth; + m_nNotchType = a.m_nNotchType; + m_ptCorrect = a.m_ptCorrect; + m_nAngle = a.m_nAngle; + return *this; + } + void CovertToOutputByOffset(int nOffSetX,int nOffsetY); + int IntOfLineCircle(double a,double b,double c,int xc,int yc,int nR,QPoint &lpptIntersection1,QPoint &lpptIntersection2); + +}; + +class CDrill +{ +public: + QPoint m_pt;//冲孔的位置 + int m_nDrillType;//冲孔类型 + int m_nAngle;//冲孔的角度(逆时针方向为正),单位:0.01度 + + CDrill() + { + m_pt = QPoint(0,0); + m_nDrillType = 0;; + m_nAngle = 0; + } + ~CDrill() {} + CDrill(CDrill &a) + { + m_pt = a.m_pt; + m_nDrillType = a.m_nDrillType; + m_nAngle = a.m_nAngle; + } + CDrill operator=(const CDrill &a) + { + m_pt = a.m_pt; + m_nDrillType = a.m_nDrillType; + m_nAngle = a.m_nAngle; + return *this; + } +}; + +class CRPPolyline +{ +public: + int m_nDrawingType;//0:直线 1:位图 2:圆 3:文字 4:条形码、二维码 5:钻孔 6:剪口 + int m_nID;//标识切割线切割顺序 从0开始 + int m_nPenNo;//选择画笔 1为笔绘 3为半透切割 其它为切割 + bool m_bSelect;//是否处于选中状态,true:选中状态 false:未选中状态 + bool m_bPgEnd;//标识该切割线是该页的最后一条线 + int m_nComType;//补偿类型 0 无补偿 1向右(内)补偿 2向左(外)补偿 + + CBitmapInfo m_bitmapInfo; + CRPArc m_circle; + CRPText m_text; + CCode m_code; + CDrill m_drill; + CNotch m_notch; + + LineType m_lineType; + QList m_listPoint; + + CRPPolyline() + { + m_nDrawingType = 0; + m_nID = 0; + m_nPenNo = 0; + m_bSelect = false; + m_bPgEnd = false; + m_lineType.bDefault = true; + m_listPoint.clear(); + m_nComType = 0; + } + ~CRPPolyline() {} + CRPPolyline(const CRPPolyline &a) + { + m_nDrawingType = a.m_nDrawingType; + m_nID = a.m_nID; + m_nPenNo = a.m_nPenNo; + m_bSelect = a.m_bSelect; + m_bPgEnd = a.m_bPgEnd; + m_lineType = a.m_lineType; + m_listPoint.clear(); + m_listPoint.append(a.m_listPoint); + m_text = a.m_text; + m_nComType = a.m_nComType; + m_circle = a.m_circle; + m_text = a.m_text; + m_code = a.m_code; + m_notch = a.m_notch; + m_drill = a.m_drill; + m_bitmapInfo = a.m_bitmapInfo; + } + CRPPolyline operator=( const CRPPolyline &a) + { + m_nDrawingType = a.m_nDrawingType; + m_nID = a.m_nID; + m_nPenNo = a.m_nPenNo; + m_bSelect = a.m_bSelect; + m_bPgEnd = a.m_bPgEnd; + m_lineType = a.m_lineType; + m_listPoint.clear(); + m_listPoint.append(a.m_listPoint); + m_text = a.m_text; + m_nComType = a.m_nComType; + m_circle = a.m_circle; + m_text = a.m_text; + m_code = a.m_code; + m_notch = a.m_notch; + m_drill = a.m_drill; + m_bitmapInfo = a.m_bitmapInfo; + return *this; + } +}; + +class Marker : public QObject +{ + Q_OBJECT +public: + explicit Marker(QObject *parent = 0); + virtual ~Marker(); + Marker(const Marker &a); + Marker operator=(const Marker &a); + void Initialize(); + QRect GetRect(); + QRect RectofPolyline(const QList &listPoint); + + double m_iDPMM; //长度数据单位:m_iDPMM(每毫米点) + QList m_listPolyline; //切割的点链,单位:1/m_iDPMM mm, X向右为正,Y向上为正 + int m_nProducts; + int m_nActualMatchRegions; + int m_nMatchRegions; + QString m_strProductCode;//产品型号 + + +signals: + +public slots: + +}; + +#endif // MARKER_H diff --git a/datafile/hpgl/plotbitmap.cpp b/datafile/hpgl/plotbitmap.cpp new file mode 100644 index 0000000..d5ad090 --- /dev/null +++ b/datafile/hpgl/plotbitmap.cpp @@ -0,0 +1,79 @@ +#include "plotbitmap.h" + +PlotBitmap::PlotBitmap(QObject *parent) : QObject(parent) +{ + +} + +//QBitmap PlotBitmap::Create1BPPBitmap(int bTransparent, int crBkColor, int iWidth, int iHeight, int iStride, int nPixFormat, char *pBmpData) +QBitmap PlotBitmap::Create1BPPBitmap(int iWidth,int iHeight,unsigned char *pBmpData) +{ + QPen pen; + pen.setWidth(1); + pen.setColor(QColor(Qt::black)); + + //QImage::Format_RGBA8888 代表彩色图 + QImage image = QImage(pBmpData, iWidth, iHeight, QImage::Format_RGB888); + //image.save("D:\\1.png"); + + QBitmap pixmap = QBitmap(iWidth,iHeight); + QPainter *pixPainter = new QPainter(); + pixPainter->setPen(pen); + pixPainter->begin(&pixmap); + pixmap.fill(Qt::white);//用白色填充 + pixPainter->drawImage(0,0,image); + //pixmap.save("D:\\1.bmp"); + +#if(0)//转灰度图 + QImage gimage = QImage(); + uchar* pImageData1 = NULL,*pImageData2 = NULL; + + pImageData1 = image.bits(); + + gimage = image.convertToFormat(QImage::Format_Indexed8); + + QVector table; + for( int i = 0 ; i < 256 ; ++i ) + { + table.append(qRgb(i,i,i)); + } + + gimage.setColorTable(table); + + for(int i =0; i< gimage.width();i++) + { + for(int j=0; j< gimage.height();j++) + { + QRgb pix_value = gimage.pixel(i,j); + gimage.setPixel(i,j,qGray(pix_value)); + } + + } + + pImageData2 = gimage.bits(); + gimage.save("D:\\1.bmp"); + +#endif + return pixmap; +} + +//设置unsigned char中某位的值 +//dat 需要设置的unsigned char +//index 设置位 +//val 设置值0或者1 +void PlotBitmap::SetUncharBit(unsigned char &dat, int index, int val) +{ + unsigned int bitmod = 0x01; + if(index >= 0 && index < 8) + { + bitmod <<= index; + if (val == 0) + { + dat &= ~bitmod; + } + else + { + dat |= bitmod; + } + } +} diff --git a/datafile/hpgl/plotbitmap.h b/datafile/hpgl/plotbitmap.h new file mode 100644 index 0000000..e6114e5 --- /dev/null +++ b/datafile/hpgl/plotbitmap.h @@ -0,0 +1,64 @@ +#ifndef PLOTBITMAP_H +#define PLOTBITMAP_H + +#include +#include +#include +#include +//#include + +//BMP文件头(14字节) +typedef struct /**** BMP file header structure ****/ +{ + unsigned short bfType; /* 类型 */ + unsigned int bfSize; /* 整个bmp文件大小 */ + unsigned short bfReserved1; /* Reserved */ + unsigned short bfReserved2; /* ... */ + unsigned int bfOffBits; /* 偏移数,位图文件头+位图信息头+调色板大小 */ +} BmpHeader; + +//位图信息头(40字节) +typedef struct /**** BMP file info structure ****/ +{ + unsigned int biSize; /* Size of info header */ + int biWidth; /* Width of image */ + int biHeight; /* Height of image */ + unsigned short biPlanes; /* Number of color planes */ + unsigned short biBitCount; /* Number of bits per pixel */ + unsigned int biCompression; /* Type of compression to use */ + unsigned int biSizeImage; /* Size of image data */ + int biXPelsPerMeter; /* X pixels per meter */ + int biYPelsPerMeter; /* Y pixels per meter */ + unsigned int biClrUsed; /* Number of colors used */ + unsigned int biClrImportant; /* Number of important colors */ +} BmpInfo; + +class PlotBitmap : public QObject +{ + Q_OBJECT +public: + explicit PlotBitmap(QObject *parent = NULL); + +public: + //创建单色的位图 + //输入参数: + // bTransparent 透明显示 + // crBkColor 背景颜色(在透明显示时位图中颜色为crBkColor的点将不被显示在纸样上) + // iWidth 位图的宽,单位:像素 + // iHeight 位图的高,单位:像素 + // iStride 位图每行的字节数 + // nPixFormat 位图点的格式(见GDI+中BitmapData类PixelFormat的定义) + // pBmpData 位图数据(保存数据的顺序是从左到右,从上到下) + //返回值: + // NULL 失败 + // 非NULL 新生成的位图指针 + //QBitmap Create1BPPBitmap(int bTransparent,int crBkColor,int iWidth,int iHeight,int iStride,int nPixFormat,char *pBmpData); + QBitmap Create1BPPBitmap(int iWidth,int iHeight,unsigned char *pBmpData); + + void SetUncharBit(unsigned char & dat, int index, int val); +signals: + +public slots: +}; + +#endif // PLOTBITMAP_H diff --git a/datafile/hpgl/typedef.h b/datafile/hpgl/typedef.h new file mode 100644 index 0000000..cf4918e --- /dev/null +++ b/datafile/hpgl/typedef.h @@ -0,0 +1,107 @@ +#ifndef TYPEDEF_H +#define TYPEDEF_H + +//--------------------------------------------------------------- + + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +//--------------------------------------------------------------- + + +#define DATA_VALID 0x55AA + +//--------------------------------------------------------------- + +typedef int BOOL; +typedef unsigned char BYTE; +typedef unsigned short int WORD; +typedef unsigned long int DWORD; + +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned int u32; +typedef char s8; +typedef short int s16; +typedef int s32; + +//--------------------------------------------------------------- + +#define U8_MAX ((u8)255) +#define S8_MAX ((s8)127) +#define S8_MIN ((s8)(-128)) +#define U16_MAX ((u16)65535u) +#define S16_MAX ((s16)32767) +#define S16_MIN ((s16)(-32768)) +#define U32_MAX ((u32)4294967295uL) +#define S32_MAX ((s32)2147483647uL) +#define S32_MIN ((s32)(-2147483648uL)) + +//--------------------------------------------------------------- +#ifndef LOBYTE +#define LOBYTE(w) ((BYTE)(((WORD)(w)) & 0xff)) +#endif + +#ifndef HIBYTE +#define HIBYTE(w) ((BYTE)((((WORD)(w)) >> 8) & 0xff)) +#endif + +#ifndef LOWORD +#define LOWORD(l) ((WORD)(((DWORD)(l)) & 0xffff)) +#endif + +#ifndef HIWORD +#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xffff)) +#endif + +#ifndef MAKEWORD +#define MAKEWORD(a, b) ((WORD)((BYTE)(a)) | (((WORD)((BYTE)(b))) << 8)) +#endif + +#ifndef MAKEDWORD +#define MAKEDWORD(a, b) ((DWORD)((WORD)(a)) | (((DWORD)((WORD)(b))) << 16)) +#endif + +#ifndef LOHFBYTE +#define LOHFBYTE(b) ((BYTE)((b) & 0x0f)) +#endif + +#ifndef HIHFBYTE +#define HIHFBYTE(b) ((BYTE)(((b) >> 4) & 0x0f)) +#endif + +#ifndef MAKEBYTE +#define MAKEBYTE(a, b) ((BYTE)((BYTE)((a) & 0x0f)) | ((BYTE)(((BYTE)((b) & 0x0f)) << 4))) +#endif + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +//--------------------------------------------------------------- + +#ifndef PI + +#define PI 3.1415926535897932 + +#endif + + + + +#endif // TYPEDEF_H diff --git a/datafile/hpgl/vectorfont.cpp b/datafile/hpgl/vectorfont.cpp new file mode 100644 index 0000000..3e3c9ff --- /dev/null +++ b/datafile/hpgl/vectorfont.cpp @@ -0,0 +1,918 @@ +#include "vectorfont.h" +#include +#include +#include "main.h" + +VectorFont::VectorFont(QObject *parent) : + QObject(parent) +{ + m_iDPMM = 40; + m_pChinese_char = NULL; + m_pEnglish_char = NULL; + m_nChinese_char_count = 0; + m_nEnglish_char_count = 0; + IniVectorFont(); +} + +VectorFont::~VectorFont() +{ + if(m_pChinese_char != NULL) + { + delete []m_pChinese_char; + m_pChinese_char = NULL; + } + if(m_pEnglish_char != NULL) + { + delete []m_pEnglish_char; + m_pEnglish_char = NULL; + } +} + +void VectorFont::IniVectorFont() +{ + QFile fntFile; + QString strCharFileName; + + BYTE byte[10]; + int nCharCount_C; + int nCharCount_E; + CChinese_char Chinese_char1; + CEnglish_char English_char1; + int nCountChar; + + + QString appPath = QCoreApplication::applicationDirPath(); + QChar separator = QChar('/'); + if(!appPath.contains(separator)) // 判断分隔符 + { + separator = QChar('\\'); + } + m_workPath = appPath + separator; + + + strCharFileName = m_workPath + "english.fnt"; + //qDebug()<< "strCharFileName" << strCharFileName; + fntFile.setFileName(strCharFileName); + + if(!fntFile.open(QIODevice::ReadOnly)) + { + qDebug() <<"english file open failed"; + return; + } + + fntFile.seek(0); + fntFile.read((char*)byte,10); + + m_nInternalLeading_E=(int)((WORD)byte[0] | ((WORD)byte[1] << 8)); + m_nHeight_E=(int)((WORD)byte[2] | ((WORD)byte[3] << 8)); + m_nDescent_E=(int)((WORD)byte[4] | ((WORD)byte[5] << 8)); + nCharCount_E=(int)((DWORD)byte[6] | ((DWORD)byte[7] << 8) | ((DWORD)byte[9] << 16) | ((DWORD)byte[9] << 24)); + //m_aEnglish_char.clear(); + m_pEnglish_char = new CEnglish_char[nCharCount_E]; + m_nEnglish_char_count = nCharCount_E; + fntFile.seek(10); + + nCountChar=nCharCount_E; + while (nCountChar > 0) + { + fntFile.read((char*)byte,10); + + English_char1.m_wCharCode=(WORD)byte[0] | ((WORD)byte[1] << 8); + English_char1.m_wBytes=(WORD)byte[2] | ((WORD)byte[3] << 8); + English_char1.m_wWidth=(WORD)byte[4] | ((WORD)byte[5] << 8); + English_char1.m_dwPosition=(DWORD)byte[6] | ((DWORD)byte[7] << 8) | ((DWORD)byte[9] << 16) | ((DWORD)byte[9] << 24); + + m_pEnglish_char[nCharCount_E-nCountChar] = English_char1; + //m_aEnglish_char.append(English_char1); + + nCountChar--; + } + fntFile.close(); + + strCharFileName = m_workPath + "Hz.fnt"; + //qDebug()<< "strCharFileName" << strCharFileName; + fntFile.setFileName(strCharFileName); + if(!fntFile.open(QIODevice::ReadOnly)) + { + qDebug() <<"chinese file open failed"; + return; + } + fntFile.seek(0); + fntFile.read((char*)byte,8); + + m_nWidth_C=(int)((WORD)byte[0] | ((WORD)byte[1] << 8)); + m_nHeight_C=(int)((WORD)byte[2] | ((WORD)byte[3] << 8)); + nCharCount_C=(int)((DWORD)byte[4] | ((DWORD)byte[5] << 8) | ((DWORD)byte[6] << 16) | ((DWORD)byte[7] << 24)); + + //m_aChinese_char.clear(); + m_pChinese_char = new CChinese_char[nCharCount_C]; + m_nChinese_char_count = nCharCount_C; + + fntFile.seek(8); + nCountChar=nCharCount_C; + while (nCountChar > 0) + { + fntFile.read((char*)byte,8); + + Chinese_char1.m_wCharCode=(WORD)byte[0] | ((WORD)byte[1] << 8); + Chinese_char1.m_wBytes=(WORD)byte[2] | ((WORD)byte[3] << 8); + Chinese_char1.m_dwPosition=(DWORD)byte[4] | ((DWORD)byte[5] << 8) | ((DWORD)byte[6] << 16) | ((DWORD)byte[7] << 24); + + + m_pChinese_char[nCharCount_C-nCountChar] = Chinese_char1; + //m_aChinese_char.append(Chinese_char1); + nCountChar--; + } + fntFile.close(); + + m_dFontAngle = 0; + m_dFontHeight = 0.375 * 10 * m_iDPMM; +} + + +//输入参数: +// ptPointLU 显示字符串的左上角坐标(即TextOut(...)的x,y值) +// pbyData 字符的描述数据 +// wBytes 字符的描述数据个数 +// nLeft,nDown 字符的左下角坐标(即以英汉字库的公共单位及坐标水平绘制字符串时,字符的的左下角坐标) +// nFontScale 字库的长度比例 +void VectorFont::PlotChar(QPoint ptPointLU,BYTE *pbyData,WORD wBytes,int nLeft,int nDown,int nFontScale) +{ + BYTE byByteX,byByteY; + QPoint ptCurrentPos,ptCenter,ptPointS,ptPointE; + QPoint ptPoint1; + WORD wIndex1; + WORD wDirection,wLength; + BOOL bPenUp,bVerTextCommand,bClockwise; + WORD wRadius,wArcS,wSpan; + int nRadius; + double dAngleS,dAngleE,dAngleOffsetS,dAngleOffsetE; + double dx1,dy1,dx2,dy2,dxc,dyc,dr,dD,dH,dBulge; + double dCos,dSin; + double dLToDScale; + int nHeight; + + if (wBytes == 0) return; + + nHeight=(m_nInternalLeading_E + m_nHeight_E) * m_nHeight_E; + //nHeight=(m_nInternalLeading_E + m_nHeight_E) * m_nHeight_C; //之前 + dLToDScale=(double)nHeight / m_dFontHeight; + + m_dRake = m_dFontAngle/180.0*PI; + dCos=cos(m_dRake); + dSin=sin(m_dRake); + + ptCurrentPos=QPoint(nLeft,nDown); + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + MoveTo(ptPoint1); + bVerTextCommand=false; + bPenUp=false; + wIndex1=0; + while (wIndex1 < wBytes) { + switch (pbyData[wIndex1]) { + case 0x0: + wIndex1++; + break; + case 0x1: + wIndex1++; + bPenUp=false; + break; + case 0x2: + wIndex1++; + bPenUp=true; + break; + case 0x3: + wIndex1++; + wIndex1++; + bVerTextCommand=false; + break; + case 0x4: + wIndex1++; + wIndex1++; + bVerTextCommand=false; + break; + case 0x5: + wIndex1++; + bPenUp=true; + break; + case 0x6: + wIndex1++; + bPenUp=true; + break; + case 0x7: + wIndex1++; + wIndex1++; + bPenUp=true; + break; + case 0x8: + if (bVerTextCommand) { + wIndex1=wIndex1+3; + } + else { + wIndex1++; + ptCurrentPos.setX(ptCurrentPos.x() + (char)pbyData[wIndex1] * nFontScale); + wIndex1++; + ptCurrentPos.setY(ptCurrentPos.y() + (char)pbyData[wIndex1] * nFontScale); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + if (bPenUp) + MoveTo(ptPoint1); + else + LineTo(ptPoint1); + + wIndex1++; + } + bVerTextCommand=false; + break; + case 0x9: + if (bVerTextCommand) { + wIndex1++; + byByteX=pbyData[wIndex1]; + wIndex1++; + byByteY=pbyData[wIndex1]; + while ((byByteX != 0) || (byByteY != 0)) { + wIndex1++; + byByteX=pbyData[wIndex1]; + wIndex1++; + byByteY=pbyData[wIndex1]; + } + wIndex1++; + } + else { + wIndex1++; + byByteX=pbyData[wIndex1]; + wIndex1++; + byByteY=pbyData[wIndex1]; + while ((byByteX != 0) || (byByteY != 0)) { + ptCurrentPos.setX(ptCurrentPos.x() + (char)byByteX * nFontScale); + ptCurrentPos.setY(ptCurrentPos.y() + (char)byByteY * nFontScale); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + if (bPenUp) + MoveTo(ptPoint1); + else + LineTo(ptPoint1); + + wIndex1++; + byByteX=pbyData[wIndex1]; + wIndex1++; + byByteY=pbyData[wIndex1]; + } + + wIndex1++; + } + bVerTextCommand=false; + break; + case 0xA: + if (bVerTextCommand) { + wIndex1=wIndex1+3; + } + else { + wIndex1++; + wRadius=(WORD)pbyData[wIndex1]; + wIndex1++; + if (((char)pbyData[wIndex1]) < 0) bClockwise=true; + else bClockwise=false; + wArcS=(WORD)pbyData[wIndex1]; + wArcS=wArcS & 0x70; + wArcS=wArcS >> 4; + wSpan=(WORD)pbyData[wIndex1]; + wSpan=wSpan & 0x7; + + //计算圆心 + ptCenter=ptCurrentPos; + ptCenter.setX(ptCenter.x() - ((double)wRadius * (double)nFontScale * cos((double)wArcS * 45.0 / 180.0 * 3.14159265359))+0.5); + ptCenter.setY(ptCenter.y() - ((double)wRadius * (double)nFontScale * sin((double)wArcS * 45.0 / 180.0 * 3.14159265359))+0.5); + + dAngleS=(double)wArcS * 45.0 / 180.0 * 3.14159265359; + if (bClockwise) dAngleE=dAngleS - (double)wSpan * 45.0 / 180.0 * 3.14159265359; + else dAngleE=dAngleS + (double)wSpan * 45.0 / 180.0 * 3.14159265359; + + if (bClockwise) { + ptPointS.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleE)+0.5); + ptPointS.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleE)+0.5); + ptPointE.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleS)+0.5); + ptPointE.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleS)+0.5); + ptCurrentPos=ptPointS; + } + else { + ptPointS.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleS)+0.5); + ptPointS.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleS)+0.5); + ptPointE.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleE)+0.5); + ptPointE.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleE)+0.5); + ptCurrentPos=ptPointE; + } + + ptCenter=CPToLP(ptCenter,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointS=CPToLP(ptPointS,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointE=CPToLP(ptPointE,nHeight,ptPointLU,dSin,dCos,dLToDScale); + nRadius=(double)wRadius * (double)nFontScale / dLToDScale + 0.5; + Arc(ptCenter.x() - nRadius,ptCenter.y() - nRadius, + ptCenter.x() + nRadius,ptCenter.y() + nRadius, + ptPointS.x(),ptPointS.y(),ptPointE.x(),ptPointE.y()); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + MoveTo(ptPoint1); + + wIndex1++; + } + bVerTextCommand=false; + break; + case 0xB: + if (bVerTextCommand) { + wIndex1=wIndex1+6; + } + else { + wIndex1++; + dAngleOffsetS=(double)((WORD)pbyData[wIndex1]); + wIndex1++; + dAngleOffsetE=(double)((WORD)pbyData[wIndex1]); + wIndex1++; + wRadius=(WORD)pbyData[wIndex1]; + wRadius=wRadius << 8; + wIndex1++; + wRadius=wRadius | (WORD)pbyData[wIndex1]; + wIndex1++; + if (((char)pbyData[wIndex1]) < 0) bClockwise=true; + else bClockwise=false; + wArcS=(WORD)pbyData[wIndex1]; + wArcS=wArcS & 0x70; + wArcS=wArcS >> 4; + wSpan=(WORD)pbyData[wIndex1]; + wSpan=wSpan & 0x7; + + //计算圆心 + ptCenter=ptCurrentPos; + ptCenter.setX(ptCenter.x() - (double)wRadius * (double)nFontScale * cos((double)wArcS * 45.0 / 180.0 * 3.14159265359)+0.5); + ptCenter.setY(ptCenter.y() - (double)wRadius * (double)nFontScale * sin((double)wArcS * 45.0 / 180.0 * 3.14159265359)+0.5); + + dAngleS=(double)wArcS * 45.0; + dAngleS=dAngleOffsetS * 45.0 / 256.0 + dAngleS; + if (bClockwise) dAngleE=-(double)wSpan * 45.0; + else dAngleE=(double)wSpan * 45.0; + dAngleE=dAngleOffsetE * 45.0 / 256.0 + dAngleE; + dAngleE=dAngleOffsetE * 45.0 / 256.0 + dAngleE; + dAngleS=dAngleS / 180.0 * 3.14159265359; + dAngleE=dAngleE / 180.0 * 3.14159265359; + + if (bClockwise) { + ptPointS.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleE)+0.5); + ptPointS.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleE)+0.5); + ptPointE.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleS)+0.5); + ptPointE.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleS)+0.5); + ptCurrentPos=ptPointS; + } + else { + ptPointS.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleS)+0.5); + ptPointS.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleS)+0.5); + ptPointE.setX(ptCenter.x() + (double)wRadius * (double)nFontScale * cos(dAngleE)+0.5); + ptPointE.setY(ptCenter.y() + (double)wRadius * (double)nFontScale * sin(dAngleE)+0.5); + ptCurrentPos=ptPointE; + } + + ptCenter=CPToLP(ptCenter,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointS=CPToLP(ptPointS,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointE=CPToLP(ptPointE,nHeight,ptPointLU,dSin,dCos,dLToDScale); + nRadius=(double)wRadius * (double)nFontScale / dLToDScale + 0.5; + + Arc(ptCenter.x() - nRadius,ptCenter.y() - nRadius, + ptCenter.x() + nRadius,ptCenter.y() + nRadius, + ptPointS.x(),ptPointS.y(),ptPointE.x(),ptPointE.y()); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + MoveTo(ptPoint1); + + wIndex1++; + } + bVerTextCommand=false; + break; + case 0xC: + if (bVerTextCommand) { + wIndex1=wIndex1+4; + } + else { + wIndex1++; + dx1=(double)((char)pbyData[wIndex1]) * (double)nFontScale; + wIndex1++; + dy1=(double)((char)pbyData[wIndex1]) * (double)nFontScale; + wIndex1++; + dBulge=(double)((char)pbyData[wIndex1]); + if (((char)pbyData[wIndex1]) < 0) bClockwise=true; + else bClockwise=false; + + dD=sqrt(dx1*dx1 + dy1*dy1); + dH=fabs(dBulge) * dD / 127.0 / 2.0; + + if (((char)pbyData[wIndex1]) == 0) { + ptCurrentPos.setX(ptCurrentPos.x() + (int)dx1); + ptCurrentPos.setY(ptCurrentPos.y() - (int)dy1); + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + + if (bPenUp) MoveTo(ptPoint1); + else LineTo(ptPoint1); + } + else { + if (bClockwise) { + dx2=-dy1; + dy2=dx1; + } + else { + dx2=dy1; + dy2=-dx1; + } + dx2=dx2 / dD * dH + dx1 / 2.0; + dy2=dy2 / dD * dH + dy1 / 2.0; + + CircleCR(0.0,0.0,dx2,dy2,dx1,dy1,dxc,dyc,dr); + ptCenter.setX(ptCurrentPos.x() + dxc + 0.5); + ptCenter.setY(ptCurrentPos.y() + dyc + 0.5); + + if (bClockwise) + { + ptPointS.setX(ptCurrentPos.x() + dx1 + 0.5); + ptPointS.setY(ptCurrentPos.y() + dy1 + 0.5 ); + ptPointE=ptCurrentPos; + ptCurrentPos=ptPointS; + } + else + { + ptPointS=ptCurrentPos; + ptPointE.setX(ptCurrentPos.x() + dx1 + 0.5); + ptPointE.setY(ptCurrentPos.y() + dy1 + 0.5); + ptCurrentPos=ptPointE; + } + + ptCenter=CPToLP(ptCenter,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointS=CPToLP(ptPointS,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointE=CPToLP(ptPointE,nHeight,ptPointLU,dSin,dCos,dLToDScale); + nRadius=dr / dLToDScale + 0.5; + + Arc(ptCenter.x() - nRadius,ptCenter.y() - nRadius,ptCenter.x() + nRadius,ptCenter.y() + nRadius, + ptPointS.x(),ptPointS.y(),ptPointE.x(),ptPointE.y()); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + MoveTo(ptPoint1); + } + + wIndex1++; + } + bVerTextCommand=false; + break; + case 0xD: + if (bVerTextCommand) { + wIndex1=wIndex1+4; + } + else { + wIndex1++; + while ((pbyData[wIndex1] != 0) || (pbyData[wIndex1+1] != 0)) { + dx1=(double)((char)pbyData[wIndex1]) * (double)nFontScale; + wIndex1++; + dy1=(double)((char)pbyData[wIndex1]) * (double)nFontScale; + wIndex1++; + dBulge=(double)((char)pbyData[wIndex1]); + if (((char)pbyData[wIndex1]) < 0) bClockwise=true; + else bClockwise=false; + + dD=sqrt(dx1*dx1 + dy1*dy1); + dH=fabs(dBulge) * dD / 127.0 / 2.0; + + if (((char)pbyData[wIndex1]) == 0) { + ptCurrentPos.setX(ptCurrentPos.x() + (int)dx1); + ptCurrentPos.setY(ptCurrentPos.y() - (int)dy1); + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + + if (bPenUp) + MoveTo(ptPoint1); + else + LineTo(ptPoint1); + } + else { + if (bClockwise) { + dx2=-dy1; + dy2=dx1; + } + else { + dx2=dy1; + dy2=-dx1; + } + dx2=dx2 / dD * dH + dx1 / 2.0; + dy2=dy2 / dD * dH + dy1 / 2.0; + + CircleCR(0.0,0.0,dx2,dy2,dx1,dy1,dxc,dyc,dr); + ptCenter.setX(ptCurrentPos.x() + dxc + 0.5); + ptCenter.setY(ptCurrentPos.y() + dyc + 0.5); + + if (bClockwise) + { + ptPointS.setX(ptCurrentPos.x() + dx1 + 0.5); + ptPointS.setY(ptCurrentPos.y() + dy1 + 0.5); + ptPointE=ptCurrentPos; + ptCurrentPos=ptPointS; + } + else + { + ptPointS=ptCurrentPos; + ptPointE.setX(ptCurrentPos.x() + dx1 + 0.5); + ptPointE.setY(ptCurrentPos.y() + dy1 + 0.5); + ptCurrentPos=ptPointE; + } + + ptCenter=CPToLP(ptCenter,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointS=CPToLP(ptPointS,nHeight,ptPointLU,dSin,dCos,dLToDScale); + ptPointE=CPToLP(ptPointE,nHeight,ptPointLU,dSin,dCos,dLToDScale); + nRadius=dr / dLToDScale + 0.5; + + Arc(ptCenter.x() - nRadius,ptCenter.y() - nRadius,ptCenter.x() + nRadius,ptCenter.y() + nRadius, + ptPointS.x(),ptPointS.y(),ptPointE.x(),ptPointE.y()); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + MoveTo(ptPoint1); + } + + wIndex1++; + } + } + bVerTextCommand=false; + break; + case 0xE: + bVerTextCommand=true; + wIndex1++; + break; + default: + if (bVerTextCommand) { + wIndex1++; + } + else { + wDirection=(WORD)(pbyData[wIndex1] % 16); + wLength=(WORD)(pbyData[wIndex1] / 16) * (WORD)nFontScale; + ptCurrentPos=GetNextCoodinate(wDirection,wLength,ptCurrentPos); + + ptPoint1=CPToLP(ptCurrentPos,nHeight,ptPointLU,dSin,dCos,dLToDScale); + if (bPenUp) MoveTo(ptPoint1); + else LineTo(ptPoint1); + + wIndex1++; + } + bVerTextCommand=false; + break; + } + } +} + +QPoint VectorFont::CPToLP(QPoint ptCP,int nHeight,QPoint ptPointLU,double dSin,double dCos,double dScale) +{ + double dx,dy; + QPoint ptPoint1; + + dx=(double)ptCP.x(); + dy=(double)ptCP.y()-(double)nHeight; + ptPoint1.setX(ptPointLU.x() + ((dx*dCos - dy*dSin) / dScale + 0.5)); + ptPoint1.setY(ptPointLU.y() + ((dx*dSin + dy*dCos) / dScale + 0.5)); + + return ptPoint1; +} + +//抬笔移动到点(x,y) +void VectorFont::MoveTo(long x, long y) +{ + if(x == 0){} + if(y == 0){} +} + +//抬笔移动到点ptPoint +void VectorFont::MoveTo(QPoint ptPoint) +{ + emit siMoveTo(true,ptPoint); +} + +//从当前位置画线到点(x,y) +void VectorFont::LineTo(long x, long y) +{ + if(x == 0){} + if(y == 0){} +} + +//从当前位置画线到点ptPoint +void VectorFont::LineTo(QPoint ptPoint) +{ + emit siLineTo(false,ptPoint); +} + +//从(x,y)点开始写字,nCount为字节数 +void VectorFont::TextOutString(int x, int y, const char* lpszString, int nCount) +{ + QString strEnglish,strChinese; + QFile fileEnglish,fileChinese; + BYTE *pbyData; + int nLeft; + BYTE byByte1,byByte2; + WORD wCharCode; + int nIndex1,nIndex2,nIndex3,nIndex4; + bool bEnglishChar; + + strEnglish = m_workPath + "english.fnt"; + strChinese = m_workPath + "Hz.fnt"; + + fileEnglish.setFileName(strEnglish); + if(!fileEnglish.open(QIODevice::ReadOnly)) + { + qDebug() <<"file open failed"; + return; + } + + fileChinese.setFileName(strChinese); + if(!fileChinese.open(QIODevice::ReadOnly)) + { + qDebug() <<"file open failed"; + return; + } + + nLeft=0; + nIndex1=0; + while (nIndex1 < nCount) + { + pbyData=NULL; + byByte1=(BYTE)lpszString[nIndex1]; + if ((byByte1 >= 128) && ((nIndex1+1) < nCount)) + { + bEnglishChar=false; + + nIndex1++; + byByte2=(BYTE)lpszString[nIndex1]; + wCharCode=(((WORD)byByte1) << 8) | (WORD)byByte2; + + nIndex2=0; + nIndex3=m_nChinese_char_count - 1; + if (m_pChinese_char[nIndex2].m_wCharCode == wCharCode) nIndex4=nIndex2; + else if (m_pChinese_char[nIndex3].m_wCharCode == wCharCode) nIndex4=nIndex3; + else nIndex4=(nIndex2 + nIndex3) / 2; + while (((nIndex3 - nIndex2) > 1) && + (m_pChinese_char[nIndex4].m_wCharCode != wCharCode)) + { + if (m_pChinese_char[nIndex4].m_wCharCode > wCharCode) + { + nIndex3=nIndex4; + if (nIndex2 > nIndex3) break; + nIndex4=(nIndex2 + nIndex3) / 2; + } + else + { + nIndex2=nIndex4; + if (nIndex2 > nIndex3) break; + nIndex4=(nIndex2 + nIndex3) / 2; + } + } + + if ((m_pChinese_char[nIndex4].m_wCharCode == wCharCode) && + (m_pChinese_char[nIndex4].m_wBytes > 0)) + { + pbyData=new BYTE[m_pChinese_char[nIndex4].m_wBytes + 1]; + + fileChinese.seek(m_pChinese_char[nIndex4].m_dwPosition); + fileChinese.read((char*)pbyData,m_pChinese_char[nIndex4].m_wBytes); + } + } + else + { + bEnglishChar=true; + wCharCode=(WORD)byByte1; + nIndex2=0; + nIndex3=m_nEnglish_char_count - 1; + if (m_pEnglish_char[nIndex2].m_wCharCode == wCharCode) nIndex4=nIndex2; + else if (m_pEnglish_char[nIndex3].m_wCharCode == wCharCode) nIndex4=nIndex3; + else nIndex4=(nIndex2 + nIndex3) / 2; + while (((nIndex3 - nIndex2) > 1) && + (m_pEnglish_char[nIndex4].m_wCharCode != wCharCode)) + { + if (m_pEnglish_char[nIndex4].m_wCharCode > wCharCode) + { + nIndex3=nIndex4; + if (nIndex2 > nIndex3) break; + nIndex4=(nIndex2 + nIndex3) / 2; + } + else + { + nIndex2=nIndex4; + if (nIndex2 > nIndex3) break; + nIndex4=(nIndex2 + nIndex3) / 2; + } + } + + if ((m_pEnglish_char[nIndex4].m_wCharCode == wCharCode) && + (m_pEnglish_char[nIndex4].m_wBytes > 0)) { + pbyData=new BYTE[m_pEnglish_char[nIndex4].m_wBytes + 1]; + + fileEnglish.seek(m_pEnglish_char[nIndex4].m_dwPosition); + fileEnglish.read((char*)pbyData,m_pEnglish_char[nIndex4].m_wBytes); + } + } + if (pbyData != NULL) + { + if (bEnglishChar) + { + PlotChar(QPoint(x,y),pbyData,m_pEnglish_char[nIndex4].m_wBytes,nLeft,0,m_nHeight_C); + } + else + { + PlotChar(QPoint(x,y),pbyData,m_pChinese_char[nIndex4].m_wBytes,nLeft,0,m_nInternalLeading_E + m_nHeight_E); + } + delete []pbyData; + if (bEnglishChar) nLeft=nLeft + m_pEnglish_char[nIndex4].m_wWidth * m_nHeight_C; + else nLeft=nLeft + m_nWidth_C * (m_nInternalLeading_E + m_nHeight_E); + } + else + { + if (bEnglishChar) nLeft=nLeft + m_pEnglish_char[0].m_wWidth * m_nHeight_C; + else nLeft=nLeft + m_nWidth_C * (m_nInternalLeading_E + m_nHeight_E); + } + + nIndex1++; + } + + fileEnglish.close(); + fileChinese.close(); +} +//画弧,从Start逆时针画到End +void VectorFont::Arc(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect, + int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc) +{ + double dXC,dYC,dRadius; + double dx,dy; + double dAngleS,dAngleE,dAngle,dStep; + double dCos,dSin; + int nCount; + + dXC=((double)nLeftRect + (double)nRightRect) / 2.0; + dYC=((double)nTopRect + (double)nBottomRect) / 2.0; + dRadius=((double)nRightRect - (double)nLeftRect) / 2.0; + + dAngleS=angle_2(dXC,dYC,(double)nXStartArc,(double)nYStartArc); + dAngleE=angle_2(dXC,dYC,(double)nXEndArc,(double)nYEndArc); + while (dAngleE >= dAngleS) dAngleE=dAngleE - 2.0 * PI; + + if ((nXStartArc == nXEndArc) && (nYStartArc == nYEndArc)) + { + dAngleS=0.0; + dAngleE=-2.0 * PI; + } + + dSin=qSin(dAngleS); + dCos=qCos(dAngleS); + dx=dRadius * dCos + dXC; + dy=dRadius * dSin + dYC; + MoveTo(dx+0.5,dy+0.5); + + nCount=120; + dStep=PI / 180.0 * (360.0 / (double)nCount); //3度 + dAngle=dAngleS; + while (dAngle > dAngleE) + { + dAngle=dAngle - dStep; + if (dAngle < dAngleE) dAngle=dAngleE; + dSin=qSin(dAngle); + dCos=qCos(dAngle); + dx=dRadius * dCos + dXC; + dy=dRadius * dSin + dYC; + LineTo(dx+0.5,dy+0.5); + } + +} + +QPoint VectorFont::GetNextCoodinate(WORD wDirection,WORD wLength,QPoint ptPoint) +{ + QPoint ptPoint1; + + switch (wDirection) { + case 0: + ptPoint1.setX( ptPoint.x() + (int)wLength); + ptPoint1.setY(ptPoint.y()); + break; + case 1: + ptPoint1.setX(ptPoint.x() + (int)wLength); + ptPoint1.setY(ptPoint.y() + (int)wLength/2); + break; + case 2: + ptPoint1.setX(ptPoint.x() + (int)wLength); + ptPoint1.setY(ptPoint.y() + (int)wLength); + break; + case 3: + ptPoint1.setX(ptPoint.x() + (int)wLength/2); + ptPoint1.setY(ptPoint.y() + (int)wLength); + break; + case 4: + ptPoint1.setX(ptPoint.x()); + ptPoint1.setY(ptPoint.y() + (int)wLength); + break; + case 5: + ptPoint1.setX(ptPoint.x() - (int)wLength/2); + ptPoint1.setY(ptPoint.y() + (int)wLength); + break; + case 6: + ptPoint1.setX(ptPoint.x() - (int)wLength); + ptPoint1.setY(ptPoint.y() + (int)wLength); + break; + case 7: + ptPoint1.setX(ptPoint.x() - (int)wLength); + ptPoint1.setY(ptPoint.y() + (int)wLength/2); + break; + case 8: + ptPoint1.setX(ptPoint.x() - (int)wLength); + ptPoint1.setY(ptPoint.y()); + break; + case 9: + ptPoint1.setX(ptPoint.x() - (int)wLength); + ptPoint1.setY(ptPoint.y() - (int)wLength/2); + break; + case 10: + ptPoint1.setX(ptPoint.x() - (int)wLength); + ptPoint1.setY(ptPoint.y() - (int)wLength); + break; + case 11: + ptPoint1.setX(ptPoint.x() - (int)wLength/2); + ptPoint1.setY(ptPoint.y() - (int)wLength); + break; + case 12: + ptPoint1.setX(ptPoint.x()); + ptPoint1.setY(ptPoint.y() - (int)wLength); + break; + case 13: + ptPoint1.setX(ptPoint.x() + (int)wLength/2); + ptPoint1.setY(ptPoint.y() - (int)wLength); + break; + case 14: + ptPoint1.setX(ptPoint.x() + (int)wLength); + ptPoint1.setY(ptPoint.y() - (int)wLength); + break; + case 15: + ptPoint1.setX(ptPoint.x() + (int)wLength); + ptPoint1.setY(ptPoint.y() - (int)wLength/2); + break; + } + + return ptPoint1; +} + +//求两点确定的直线与X轴的夹角,在[0,2pi)之间 +//输入参数: +// (startx,starty) 起点 +// (endx,endy) 终点 +//返回值: +// 夹角 +double VectorFont::angle_2(int startx,int starty,int endx,int endy) +{ + //直线与X轴之间的夹角 X轴向量OE(1,0) + double dAngle = 0; + if((endx == startx) && (endy == starty)) + { + return dAngle; + } + //求直线的向量坐标 + double dX = endx - startx; + double dY = endy - starty; + dAngle = qAcos((dX)/(qSqrt(dX*dX + dY*dY))); + return dAngle; +} + +///////////////////////// 计算三点定圆时的圆心和半径 /////////////////////////// +// 输入参数:三个样点(x1,y1),(x2,y2),(x3,y3) +// 算法描述: +// 过(x1,y1),(x2,y2)的中点作垂线L1, +// 过(x2,y2),(x3,y3)的中点作垂线L2, +// 求L1,L2的交点. +// 输出参数: +// 如果不能形成圆返回false, +// 否则返回true其中圆心为(cx,cy),半径=cr. +// 按逆时针方向画弧时,如cr>0 则(x1,y1)是起点,(x3,y3)是终点, +// 如cr<0 则(x3,y3)是起点,(x1,y1)是终点. +// 特别说明:此处所说的逆时针是指显示器而言,如果对于对X向右为正, +// Y向上为正的坐标系来说此处是顺时针 +//bool CircleCR(int x1,int y1,int x2,int y2,int x3,int y3,int& cx,int& cy,int& cr); +//////////////////////////////////////////////////////////////////////////////// +bool VectorFont::CircleCR(double x1,double y1,double x2,double y2,double x3,double y3,double& cx,double& cy,double& cr) +{ + double a1,b1,c1,a2,b2,c2; + if(((x1 ==x2) && (y1==y2)) || ((x1 ==x3) && (y1==y3)) || ((x2 ==x3) && (y2==y3))) + { + return false; + } + a1 = x1 - x2; + b1 = y1 - y2; + c1 = -a1 * (x1 + x2) / 2.0 - b1 * (y1 + y2)/2.0; + a2 = x3 - x2; + b2 = y3 - y2; + c2 = -a2 * (x2 + x3) / 2.0 - b2 * (y2 + y3)/2.0; + + double D = a1*b2 - a2*b1; + if(D == 0)//两直线平行 + { + return false; + } + + cx = (b1*c2 - b2*c1)/D; + cy = (c1*a2 - c2*a1)/D; + + //用圆心和其中一个点求距离得到半径: + cr = qSqrt((cx - x1)*(cx - x1) + (cy - y1)*(cy - y1)); + return true; +} + diff --git a/datafile/hpgl/vectorfont.h b/datafile/hpgl/vectorfont.h new file mode 100644 index 0000000..58ec4ac --- /dev/null +++ b/datafile/hpgl/vectorfont.h @@ -0,0 +1,132 @@ +#ifndef VECTORFONT_H +#define VECTORFONT_H + +#include +#include +#include "typedef.h" + +class CChinese_char +{ +public: + WORD m_wCharCode; + WORD m_wBytes; + DWORD m_dwPosition; + + CChinese_char() + { + m_wCharCode=0; + m_wBytes=0; + m_dwPosition=0; + } + CChinese_char(const CChinese_char &a) + { + m_wCharCode=a.m_wCharCode; + m_wBytes=a.m_wBytes; + m_dwPosition=a.m_dwPosition; + } + CChinese_char(WORD wCharCode,WORD wBytes,DWORD dwPosition) + { + m_wCharCode=wCharCode; + m_wBytes=wBytes; + m_dwPosition=dwPosition; + } + ~CChinese_char() {} + CChinese_char operator=(const CChinese_char &a) + { + m_wCharCode=a.m_wCharCode; + m_wBytes=a.m_wBytes; + m_dwPosition=a.m_dwPosition; + return *this; + } +}; + +class CEnglish_char +{ +public: + WORD m_wCharCode; + WORD m_wBytes; + WORD m_wWidth; + DWORD m_dwPosition; + + CEnglish_char() + { + m_wCharCode=0; + m_wBytes=0; + m_wWidth=0; + m_dwPosition=0; + } + CEnglish_char(const CEnglish_char &a) + { + m_wCharCode=a.m_wCharCode; + m_wBytes=a.m_wBytes; + m_wWidth=a.m_wWidth; + m_dwPosition=a.m_dwPosition; + } + CEnglish_char(WORD wCharCode,WORD wBytes,WORD wWidth,DWORD dwPosition) + { + m_wCharCode=wCharCode; + m_wBytes=wBytes; + m_wWidth=wWidth; + m_dwPosition=dwPosition; + } + ~CEnglish_char() {} + CEnglish_char operator=(const CEnglish_char &a) + { + m_wCharCode=a.m_wCharCode; + m_wBytes=a.m_wBytes; + m_wWidth=a.m_wWidth; + m_dwPosition=a.m_dwPosition; + return *this; + } +}; +class VectorFont : public QObject +{ + Q_OBJECT +public: + explicit VectorFont(QObject *parent = 0); + ~VectorFont(); + void IniVectorFont(); + + +signals: + void siLineTo(bool bl,QPoint point); + void siMoveTo(bool bl,QPoint point); + +public slots: +protected: + + double m_iDPMM; //长度数据单位:m_iDPMM(每毫米点) + double m_dRake; //倾斜角(第1个字符原点到最后1个字符原点的连线的角度),单位:弧度 + + QString m_workPath; + + //QList m_aChinese_char; + //QList m_aEnglish_char; + CChinese_char *m_pChinese_char; + CEnglish_char *m_pEnglish_char; + int m_nChinese_char_count; + int m_nEnglish_char_count; + int m_nInternalLeading_E,m_nHeight_E,m_nDescent_E; //m_nHeight_E是windows中字体的Ascent-InternalLeading + int m_nHeight_C,m_nWidth_C; + +public: + void PlotChar(QPoint ptPointLU,BYTE*pbyData,WORD wBytes,int nLeft,int nDown,int nFontScale); + QPoint CPToLP(QPoint ptCP,int nHeight,QPoint ptPointLU,double dSin,double dCos,double dScale); + void TextOutString(int x, int y, const char* lpszString, int nCount); + void Arc(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc); + QPoint GetNextCoodinate(WORD wDirection,WORD wLength,QPoint ptPoint); + void MoveTo(QPoint ptPoint); + void MoveTo(long x,long y); + void LineTo(QPoint ptPoint); + void LineTo(long x,long y); + double angle_2(int startx,int starty,int endx,int endy); + bool CircleCR(double x1,double y1,double x2,double y2,double x3,double y3,double& cx,double& cy,double& cr); + + double m_dFontHeight; //字的高度 + double m_dFontAngle;//指定每行文本输出时相对于设备x轴的角度,其单位为1/10度 + + + +}; + +#endif // VECTORFONT_H diff --git a/items/assistitem.cpp b/items/assistitem.cpp new file mode 100644 index 0000000..d09deea --- /dev/null +++ b/items/assistitem.cpp @@ -0,0 +1,43 @@ +#include "assistitem.h" + +AssistItem::AssistItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +AssistItem::~AssistItem() +{ + clean(); +} + +AssistItem::AssistItem(const AssistItem & item) : QObject() +{ + copyData(item); +} + +AssistItem & AssistItem::operator= (const AssistItem & item) +{ + copyData(item); + return *this; +} + +void AssistItem::clean() +{ + m_macType = 0; + m_showPriority = 0; + m_name.clear(); + m_topImageName.clear(); + m_enumFunction = 0; +} + +void AssistItem::copyData(const AssistItem &item) +{ + if (this != &item) + { + this->m_macType = item.m_macType; + this->m_showPriority = item.m_showPriority; + this->m_name = item.m_name; + this->m_topImageName = item.m_topImageName; + this->m_enumFunction = item.m_enumFunction; + } +} diff --git a/items/assistitem.h b/items/assistitem.h new file mode 100644 index 0000000..36a7192 --- /dev/null +++ b/items/assistitem.h @@ -0,0 +1,36 @@ +#ifndef ASSISTITEM_H +#define ASSISTITEM_H + +#include + +class AssistItem : public QObject +{ + Q_OBJECT +public: + explicit AssistItem(QObject *parent = 0); + + ~AssistItem(); + +public: + AssistItem(const AssistItem & item); + AssistItem & operator= (const AssistItem & item); + +public: + void clean(); + +private: + void copyData(const AssistItem & item); + +public: + int m_macType; // 机器类型 + int m_showPriority; // 显示优先级 + QString m_name; // label名称 + QString m_topImageName; // 顶图图标logo名称 + int m_enumFunction; // 对应的事件的枚举值 + +signals: + +public slots: +}; + +#endif // ASSISTITEM_H diff --git a/items/cmdconfig.h b/items/cmdconfig.h new file mode 100644 index 0000000..ebb5f7a --- /dev/null +++ b/items/cmdconfig.h @@ -0,0 +1,333 @@ +#ifndef CMDCONFIG_H +#define CMDCONFIG_H + +//点击触发型参数枚举(绣花机超级用户参数、冲缝绣产线软件设置参数、网络管理参数) +enum CLICK_ALL_FUNCTION { + ROOT_HMICONFIGURATION = 0, //界面配置 + ROOT_MACHINEPARA, //机器参数 + ROOT_WORKPARA, //工作参数 + ROOT_CLEARPATTERN, //花样总清 + ROOT_VERSIONRECOVERY, //版本恢复 + ROOT_DEBUGMODE, //界面进入调试模式 + ROOT_RESOLUTION, //分辨率 + ROOT_MACTYPE, //机器类型 + ROOT_PRODUCTTYPE, //产品类型 + ROOT_SHUTTLECHANGE, //自动换梭 + ROOT_WATERMARKSET, //主背景水印设置(是否带水印) + ROOT_WIFI, + ROOT_PARASORTSET, //参数分类设置(是否分类) + ROOT_HMIDECRYPT, //界面解密 + ROOT_CHANGEPASSWORD, //修改一级密码 + ROOT_IOTCONFIGURATION, //物联网配置-物联网配置 + ROOT_GATEWAYCONNECTIONMETHOD, //物联网配置-网关连接方式 + ROOT_RACKNUMBERINPUT, //物联网配置-机架号输入 + ROOT_NETWORKSETTINGS, //物联网配置-网络设置 + ROOT_DELIVERYTIME, //物联网配置-工厂预计交货时间 + ROOT_DEBUGPROGRESS, //物联网配置-调试进度 + ROOT_DELETEINI, //删除配置文件 + ROOT_DELETE_DEF_PATH, //删除默认文件路径 + PSE_SOFTWAREPARA_IMPORTPARA, //参数导入 + PSE_SOFTWAREPARA_EXPORTPARA, //参数导出 + PSE_SOFTWAREPARA_HMIUPDATE, //界面升级 + PSE_SOFTWAREPARA_MCUPDATE, //主控升级 + PSE_SOFTWAREPARA_EXIT, //退出程序 + + ROOT_KNIFE_MODEL, //刀压设置模式 + ROOT_MACHINE_MODEL, //机型模式 + ROOT_X_CORRECTVALUE, //X修正值 + ROOT_Y_CORRECTVALUE, //Y修正值 + ROOT_MAXSPEED_MAINSEWWORK, //主轴缝纫工作最高转速 + ROOT_IF_SPLIT_STEP //是否分割针步 +}; + +enum MC_TYPE { NUM1 = 1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9 };//板卡号 + +enum ENUM_ALGORITHM { + FIT_SMALL, //拟合小针步 + MINIMUM_STEP, //直线最小步长 + MAXIMUM_STEP, //直线最大步长 + JUDGMENT_DEGREE, //圆弧转角判断度数 + ARC_COMPENSATION, //圆弧补偿步长 + ARC_COMPENSATION_1, //切刀1圆弧补偿半径 + ARC_COMPENSATION_2, //切刀2圆弧补偿半径 + + CUT_SPD_MINPPS, //最小切割速度 + CUT_SPD_MAXPPS, //最大切割速度 + CUT_ADD_PPSG, //切割加速度 + CUT_SLOW_ANGLE, //切割降速最小偏差角度 + CUT_WORK_MINADD, //工作最小加速度 + CUT_RNF1_COMP, //抬刀补偿 + CUT_RNF2_COMP, //落刀补偿 + + //边走边裁 + CUT_CRUTCH_ANG, //拐点转角判断度数,单位:10000弧度 + CUT_LINE_STP, //分割数据步长,单位0.01mm + CUT_X_LENGH, //X向可切割长度,单位0.01mm + CUT_RNF_COMP, //圆刀退刀补偿 ,单位0.01mm + CUT_Vert_COMP, //切割垂直补偿 ,单位0.01mm + CUT_ENABLE_BRUSH, //圆刀退刀补偿 ,单位0.01mm +}; + +//此头文件定义了常用功能的枚举 +enum SHORTCUT_FUNCTION { + FUN_ALLTOZERO = 1, // 全部归零 + FUN_SPINDLEJOG, // 主轴点动 + FUN_SPINDLEENABLE, // 主轴使能 + FUN_SPINDLEDISABLE, // 主轴失能 + FUN_SPINDLETEST, // 主轴研车 + FUN_SPINDLEROTATE, // 主轴旋转 + FUN_BACKWORKPOINT, // 回工作点 + FUN_CUTTINGPOINT, // 回切割点 + FUN_BACKTOORIGIN, // 回原点 + FUN_SETOFFSETPOINT, // 定偏移点 + FUN_BACKOFFSETPOINT, // 回偏移点 + FUN_SETSTARTPOINT, // 定起始点 + FUN_BACKSTARTPOINT, // 回起始点 + FUN_SETFEEDINGPOINT, //定上料点 + FUN_BACKFEEDINGPOINT, //回上料点 + FUN_CHECKFRAME, // 边框检查 + FUN_FORWARDORBACK, // 前进回退 + FUN_SIMULATEFRAME, //空走边框 + FUN_PROCESSRESET, //流程复位 + FUN_MANUALOIL, //手动加油 + FUN_PATTERNSELECT, // 花样选择 + FUN_SEWAUTOCHANGESHUTTLE, //自动换梭 + FUN_SEWBUFF, //缝纫状态 + FUN_SHUTTLEDISKBUFF, //换梭盘状态 + FUN_BACKTHREADPOINT, //回穿线点 + FUN_KNIFE_COLLECT,//刀压采集 + FUN_KNIFE_TEST,//刀压测试 + FUN_FAN_AREA,//风机区域 + FUN_PEN_UP,//画笔上升 + FUN_PEN_DOWN,//画笔下降 + FUN_SET_KNIFETEST_POS,//设置刀压检测位置 + FUN_DISPLAY_COLLECTED_DATA,//显示采集数据 + FUN_CROSS_CUT,//横切 + FUN_SETANCHORPOINT, // 定定位点(服装机) + FUN_BACKANCHORPOINT, // 回定位点(服装机) + FUN_CUT_SETANCHORPOINT, + FUN_BACKSHUTTLE, //回换梭位(服装机) + FUN_NEEDLESHUTTLERESET, //针梭校对(服装机) + FUN_BACKZEROPOINT, //回零点 + FUN_GOTO_FINISH, //回结束点 + FUN_SHUTTLETOHEAD, //将旋梭从梭盘到机头 + FUN_HEADTOSHUTTLE, //将旋梭从机头到梭盘 + FUN_COUNTRESET, //底线计数清零 + FUN_OUTPUTRESET, //产量清零 + FUN_NEDDLEZEROPOS, //对针零位 + FUN_SHUTTLEZEROPOS, //对梭零位 + FUN_MT_ALLZ, // 所有主轴 零位 + FUN_MT_ALLG, // 所有主轴 勾线 + FUN_MT_ALLM, // 所有主轴 点动 + FUN_MAINSHAFT_ADJUST, // 针梭校对 + FUN_SIMULATED_STATUS, // 模拟缝纫状态 + FUN_MANUAL_THREAD_CUTTING, // 手动剪线 + FUN_HEAD_LIFTUPDOWN, //机头升降 + FUN_HEAD_LIFTING, //机头上升 + FUN_HEAD_LOWERING, //机头下降 + FUN_HEAD_LIFTING2, //机头上升2 + FUN_HEAD_LOWERING2, //机头下降2 + FUN_WORK_HEAD_SET, //工作机头设置 + FUN_NS_RESET,//缝纫针梭复位 + FUN_GOTO_FEEDT,//回穿线点 + FUN_MAKEUP_NOHEAD, // 取消补缝 + FUN_MAKEUP_HEAD1, // 机头1补缝 + FUN_MAKEUP_HEAD2, // 机头2补缝 + FUN_MAKEUP_HEAD3, // 机头3补缝 + FUN_MAKEUP_HEAD4, // 机头4补缝 + FUN_MAKEUP_HEAD5, // 机头5补缝 + ASSIST_ThCutAct1,//机头1 剪线动作 + ASSIST_ThCutAct2,//机头2 剪线动作 + ASSIST_ThCutAct3,//机头3 剪线动作 + ASSIST_ThCutAct4,//机头4 剪线动作 + ASSIST_ThCutAct5,//机头5 剪线动作 + FUN_SPD_SELECT,//速度选择 + FUN_MS_TO_ANGLE,//主轴去指定角度 + FUN_WIRE_MS_RUN,//主轴研车 + FUN_ROT_TO_ANGLE,//旋转电机去指定角度 + FUN_AUTO_PULL,//自动拉料 + FUN_CUT_UD,//剪底面线 + FUN_CUT_WIRE,//剪电阻丝 + FUN_GOTO_PULLPOS,//回拉料起始点 + FUN_JAW_WORK,//夹布工作状态 + FUN_JAW_FEED,//夹布上料状态 + FUN_ZIGZAG_POS1,//去摆动位1 + FUN_ZIGZAG_POS2,//去摆动位2 + FUN_YPB_MOVE,//手动拉料 + FUN_AUTO_CHANGE_ONE_SHUT,//自动换一个梭 + FUN_INSTALL_FIRST_BOBBIN,//安装第一个梭壳 + FUN_SHUT_FROM_PLATE_TO_HEAD,//将旋梭从梭盘拿到机头 + FUN_SHUT_FROM_HEAD_TO_PLATE,//将旋梭从机头拿到梭盘 + FUN_SHUT_INTO_TAKE_PLATE,//进入更换梭盘状态 + FUN_SHUT_INTO_INDX_STA,//进入缝纫状态 + FUN_SHUT_FEED_STATE,//进入送料状态 + FUN_SHUT_BACK_STATE,//进入收料状态 + FUN_SHUIILE_LINE,//梭芯底线显示 + + //飞梭机 + FUN_STARTWORK, //启动工作 + FUN_PAUSEWORK, //暂停 + FUN_HOOKPOS, //主轴去勾线位 + FUN_PARKPOS, //主轴去停车位 + + FUN_BOARD_LOW_POSITION, // 翻板低位 + FUN_BOARD_CENTER_POSITION, // 翻板中位 + + FUN_RESET_ALL, // 全部复位 + FUN_ONE_PULLING, // 一键拉料 + FUN_ONE_CROSS_CUT, // 一键横切 + FUN_CTB_INTO_SEW_STA, // 进入绗缝状态 + FUN_CTB_INTO_PULL_STA, // 进入拉料状态 + FUN_CTB_ONEKEY_CROSSCUT, // 全自动缝纫机一键横切 + FUN_BOTTOM_CLEARING_COUNT, // 底线清空计数 + + //双头组合机型 + FUN_SET_WORK_HEAD, //设置工作机头 九宫格 + + FUN_NULL // 无功能 无功能应该放在最后一位,因为常用功能得最大值就是无功能,否则无法一一对应 +}; + +//辅助功能的枚举 +enum ASSIST_FUNCTION { + ASSIST_SENSOR = 1, // 传感器信号 + ASSIST_CONTROLACTION, // 控制动作 + ASSIST_HMIUPGRADE, // 界面升级 + ASSIST_MCUPGRADE, // 主控升级 + ASSIST_PARAIMPORT, // 参数导入 + ASSIST_PARAEXPORT, // 参数导出 + ASSIST_SOFTWARESET, // 软件设置 + ASSIST_AUTHORIZATION, // 软件授权 + ASSIST_NETWORK, // 网络管理 + ASSIST_WIFI, + ASSIST_TIMESET, // 时间设置 + ASSIST_PRODUCTSTATICS, // 生产统计 + ASSIST_LOGFILE,//文件日志 + ASSIST_ERRORLOG,//错误日志 + ASSIST_BREAKAGELOG,//断线日志 + ASSIST_MCVERSION, // 版本信息 + ASSIST_BOTTOMLINEDETECT, //底线检测 + ASSIST_FACELINEDETECT, //面线检测 + ASSIST_SPINDLETEST, //主轴研车 + ASSIST_CHANGEASHUTTLE ,// 自动换一个梭 + ASSIST_ROOT, //超级用户 + ASSIST_SHUTDOWN, //关机 + ASSIST_BOTTOMLINECOUNTRESET, // 底线计数复位 + ASSIST_DEBUGINFO,//调试信息 + ASSIST_ScanTest,//扫码测试 + ASSIST_HMIBACKUPSUPGRADE, // 界面还原 + ASSIST_NULL // 无功能 +}; + +//花样设置功能的枚举 +enum PATTERNSET_FUNCTION { + PATTERNSET_PATTERNSELECT = 1, // 花样选择 + PATTERNSET_PATTERNPARA, // 花样参数 + PATTERNSET_PATTERNCOLOR, // 花样色序 + PATTERNSET_PATTERNIMPORT, // 花样导入 + PATTERNSET_PATTERNEXPORT, // 花样导出 + PATTERNSET_PATTERNDELETE, // 花样删除 + PATTERNSET_ALGORITHMPARA, // 平板切割算法参数 + PATTERNSET_PATTERNEDIT, // 花样编辑 + PATTERNSET_NEEDLEPREVIEW, // 排针预览 + PATTERNSET_LINEGENER, // 线迹生成 + PATTERNSET_NULL // 无功能 +}; + +//参数设置参数类型的枚举 +enum PARASET_FUNCTION { + PARASET_POSITION = 1, // 位置参数 + PARASET_SPEED, // 速度参数 + PARASET_ACTION, // 动作参数 + PARASET_DETECT, // 检测参数 + PARASET_SETTING , // 工作参数 + PARASET_ALL , // 全部参数 + PARASET_SHUTTLE //自动换梭参数 +}; + +enum OUTCONTROL_FUN { + OUTCONTROL_ENABLE = 1, // 使能 + OUTCONTROL_DISABLE, // 失能 + OUTCONTROL_MS_ENABLE, // 主轴电机使能 + OUTCONTROL_MS_DISABLE, // 主轴电机失能 + OUTCONTROL_JOGP, // 正转 + OUTCONTROL_JOGN, // 反转 + OUTCONTROL_STOP, // 停止 + OUTCONTROL_ZERO, // 归零 + OUTCONTROL_LEFT, // 左位 + OUTCONTROL_MIDDLE, // 中位 + OUTCONTROL_RIGHT, // 右位 + OUTCONTROL_UP, // 上升 + OUTCONTROL_DOWN, // 下降 + MANUALACTION_RUN, // 执行 + OUTCONTROL_OPEN, // 打开 + OUTCONTROL_CLOSE, // 关闭 + OUTCONTROL_STARTOIL, // 开始 + OUTCONTROL_STOPOIL, // 停止 + OUTCONTROL_COCOSTOP, // 输出停止 + MOTORHEADO_UP, // 缝纫机头1升降 + MOTORHEADO_DOWN, //缝纫机头1下降 + MOTORHEADT_UP, // 缝纫机头2升降 + MOTORHEADT_DOWN, // 缝纫机头2下降 + ALLTO_ZERO, // 全部归零 + OUTCONTROL_PULL, //拉料 + OUTCONTROL_PULLBACK, //退料 + OUTCONTROL_PULLSTOP, //拉料/退料停止 + OUTCONTROL_LEFTMOVE, //左移 + OUTCONTROL_RIGHTMOVE, //右移 + OUTCONTROL_FORWARD, //前进 + OUTCONTROL_REVERSE //后退 +}; + +//软件设置的顺序枚举 +enum ENUM_SOFTWARESET { + // SET_THEME = 0, // 主题 + SET_LANGUAGE = 0, // 语言 + SET_FONTSIZE, //字体大小 + SET_CONNECTMODE, //连接方式(通讯方式) + SET_TITLEBAR //设置标题栏 + //参数设置界面参数显示方式 +}; + +//花样参数的顺序枚举 +enum ENUM_PATTERNPARA { + SET_ROTATESTYLE = 0, // 旋转式样 + SET_HORIZONTALSTYLE, // 水平翻转样式 + SET_VERTICALSTYLE, // 垂直翻转样式 + SET_ROTATEANGLE, // 旋转角度 + SET_SETSTEPSIZE, // 针步大小 + SET_LOLACOMP, // 罗拉补偿X+ + SET_LOLACOMPXNEG, // 罗拉补偿X- + SET_LOLACOMPXZERO, // 罗拉补偿X=0 + SET_REINMODE , // 加固方式 + SET_REINNEEDLE , // 加固针数 + SET_REINNUM , // 加固次数 + SET_ANGLECORROFFSET, // 角度修正量 + SET_ANGLECORRPOSX, // 角度修正x正 + SET_ANGLECORRNEGX, // 角度修正x负 + SET_ANGLECORRPOSY, // 角度修正y正 + SET_ANGLECORRNEGY, // 角度修正y负 + SET_SETLEFT, // 左边 + SET_SETFRONT , // 前边 + SET_SCANX, // 缩放x + SET_SCANY , // 缩放y + SET_STARTX, // 起始点x + SET_STARTY , // 起始点y + SET_ANCHORX, // 定位点x + SET_ANCHORY, // 定位点y + SET_EQUAL, //等比缩放 + SET_ROTATIONANGLE, //旋转角度调整 + SET_BISECT, // + SET_OFTNEEDLE // 去除偏移最小针步设置 +}; + +//网络管理设置的顺序枚举 +enum ENUM_NETWORKSET { + SET_MQTT_SERVERIP = 0, // 网关服务器IP + SET_MQTT_SERVERPORT, // 网关服务器端口 + SET_MACHINE_SERVERIP, // 机器服务器IP + SET_MACHINE_SERVERPORT, // 机器服务器端口 + SET_LOCALIP, // 本地IP + SET_LOCALPORT, // 本地端口 +}; + +#endif // CMDCONFIG_H diff --git a/items/errorcodestateitem.cpp b/items/errorcodestateitem.cpp new file mode 100644 index 0000000..db31d2c --- /dev/null +++ b/items/errorcodestateitem.cpp @@ -0,0 +1,37 @@ +#include "errorcodestateitem.h" + +ErrorCodeStateItem::ErrorCodeStateItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +ErrorCodeStateItem::~ErrorCodeStateItem() +{ + clean(); +} + +ErrorCodeStateItem::ErrorCodeStateItem(const ErrorCodeStateItem &item) : QObject() +{ + copyData(item); +} + +ErrorCodeStateItem &ErrorCodeStateItem::operator=(const ErrorCodeStateItem &item) +{ + copyData(item); + return *this; +} + +void ErrorCodeStateItem::clean() +{ + m_code = 0; + m_name.clear(); +} + +void ErrorCodeStateItem::copyData(const ErrorCodeStateItem &item) +{ + if (this != &item) + { + this->m_code = item.m_code ; // 代码 + this->m_name = item.m_name ; // 代码对应的名称 + } +} diff --git a/items/errorcodestateitem.h b/items/errorcodestateitem.h new file mode 100644 index 0000000..8eacea3 --- /dev/null +++ b/items/errorcodestateitem.h @@ -0,0 +1,33 @@ +#ifndef ERRORCODESTATEITEM_H +#define ERRORCODESTATEITEM_H + +#include + +class ErrorCodeStateItem : public QObject +{ + Q_OBJECT +public: + explicit ErrorCodeStateItem(QObject *parent = 0); + + ~ErrorCodeStateItem(); + +public: + ErrorCodeStateItem(const ErrorCodeStateItem & item); + ErrorCodeStateItem & operator= (const ErrorCodeStateItem & item); + +public: + void clean(); + +private: + void copyData(const ErrorCodeStateItem & item); + +public: + unsigned int m_code; // 代码 + QString m_name; // 代码对应的名称 + +signals: + +public slots: +}; + +#endif // ERRORCODESTATEITEM_H diff --git a/items/fileitem.cpp b/items/fileitem.cpp new file mode 100644 index 0000000..eb77a73 --- /dev/null +++ b/items/fileitem.cpp @@ -0,0 +1,63 @@ +#include "fileitem.h" + +FileItem::FileItem(QObject *parent) : + QObject(parent) +{ + clear(); +} + +FileItem::~FileItem() +{ + clear(); +} + +FileItem::FileItem(const FileItem & item) : + QObject(item.parent()) +{ + copyData(item); +} + +FileItem & FileItem::operator=(const FileItem & item) +{ + copyData(item); + return *this; +} + +void FileItem::clear() +{ + m_filePathName.clear(); // 文件路径 + m_showInfo.clear(); // 显示信息 + m_imagePath.clear(); // 图片路径 + m_previewImage = QImage(); // 图形预览 +} + +// 拷贝 +void FileItem::copyData(const FileItem & item) +{ + if (this != &item) + { + this->m_filePathName = item.m_filePathName; // 文件路径 + this->m_showInfo = item.m_showInfo; // 显示信息 + this->m_imagePath = item.m_imagePath; // 图片路径 + this->m_previewImage = item.m_previewImage; // 图形预览 + } +} + +#if (1) +void FileItem::setFileInfo(QString & path, QString & show, QImage & previewImg) +#else +void FileItem::setFileInfo(QString path, QString show, QImage previewImg) +#endif +{ + m_filePathName = path; // 文件路径 + m_showInfo = show; // 显示信息 + m_previewImage = previewImg; // 预览图形 +} + + +void FileItem::setFileInfo(QString path, QString show, QString imagePath) +{ + m_filePathName = path; // 文件路径 + m_showInfo = show; // 显示信息 + m_imagePath = imagePath; // 图片路径 +} diff --git a/items/fileitem.h b/items/fileitem.h new file mode 100644 index 0000000..5e130d9 --- /dev/null +++ b/items/fileitem.h @@ -0,0 +1,48 @@ +#ifndef FILEITEM_H +#define FILEITEM_H + +#include +#include +#include + +// 文件条目项 +class FileItem : public QObject +{ + Q_OBJECT +public: + explicit FileItem(QObject *parent = NULL); + FileItem(const FileItem & item); + ~FileItem(); +public: + FileItem &operator=(const FileItem & item); + +public: + void clear(); +private: + void copyData(const FileItem & item); + +public: +#if (1) + void setFileInfo(QString & path, QString & show, QImage & previewImg); +#else + void setFileInfo(QString path, QString show, QImage previewImg); +#endif + void setFileInfo(QString path, QString show, QString imagePath); + +public: + inline const QString & getFilePath() const {return m_filePathName;} // 文件路径 + inline const QString & getShowInfo() const {return m_showInfo;} // 显示信息 + inline const QString & getImagePath() const {return m_imagePath;} // 图片路径 + inline const QImage & getPreviewImage() const {return m_previewImage;} // 图形预览 +private: + QImage m_previewImage; // 图形预览 + QString m_filePathName; // 文件路径名称 + QString m_imagePath; // 图片路径 + QString m_showInfo; // 显示信息(文件名称) + +signals: + +public slots: +}; + +#endif // FILEITEM_H diff --git a/items/itemsmanage.cpp b/items/itemsmanage.cpp new file mode 100644 index 0000000..f1da4ea --- /dev/null +++ b/items/itemsmanage.cpp @@ -0,0 +1,593 @@ +#include "itemsmanage.h" +extern QString createStrList(QStringList list); + +ParaItem makeAParaItem( + int64_t mcenSel, + int paraType, + int paraTypeSort, + int indexInPara, + int bitInWord, + int readonly, + int valueType, + QString paraName, + int64_t value, + int64_t minval, + int64_t maxval, + int64_t defvalue, + int afterpoint, + QString unitstr, + QString valuestr, + QString selList, + int selIdx, + int defIdx, + int showPriority, + int authority) +{ + ParaItem item; + + item.clean(); + + item.mcenSel = mcenSel; /* 机型选择 */ + item.paraType = paraType; /* 参数类型(机器参数、工作参数、花样设置参数...) */ + item.paraTypeSort = paraTypeSort; /* 参数类型分类(机器参数的速度参数、机器参数的动作参数...) */ + + item.indexInPara = indexInPara; /* 参数索引,-1,提示型显示; >= 0,该条目在参数中的位置*/ + item.bitInWord = bitInWord; /* 参数位索引 */ + item.readonly = readonly; /* 只读标志 */ + item.valueType = valueType; /* 参数值类型 = 0, 无值; = 1, 数字输入型; = 2, 开关选择型; = 3, 列表选择型 */ + + item.paraName = paraName; /* 参数名称 */ + + item.value = value; /* int输入型或选择型参数值 */ + item.minVal = minval; /* int输入型参数值范围下限 */ + item.maxVal = maxval; /* int输入型参数值范围上限 */ + item.defValue = defvalue; /* int输入型或选择型默认参数值 */ + item.afterPoint = afterpoint; /* int输入型保留小数位数 */ + item.unitStr = unitstr; /* int输入型单位字符串 */ + item.valueStr = valuestr; /* 字符输入型参数字符串 */ + + item.selList = selList; /* 列表选择型的参数列表, 通过"\n"来分割 */ + item.selIdx = selIdx; /* 当前选择项索引 */ + item.defIdx = defIdx; /* 默认选择项索引 */ + item.showPriority = showPriority; /* 显示优先级 */ + item.authority = authority; /* 显示优先级 */ + + return item; +} + +bool comparePriority(const ParaItem &item1, const ParaItem &item2) +{ + int pr1, pr2; + pr1 = item1.showPriority; + pr2 = item2.showPriority; + if (pr1 < 0) + { + pr1 = 0; + } + if (pr2 < 0) + { + pr2 = 0; + } + + return (pr1 < pr2); +} + +//各个机型通用参数-软件设置参数 +void initSoftwareParasList(QList & parasList) +{ + //软件设置参数--------------------------- + //软件设置参数-主题;单位:无 ,范围1-3,默认1 + /* + parasList.append(makeAParaItem(0, + PARA_TYPE_SOFTWARESET, + 0 , + SET_THEME, 0, 1, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Theme"),//主题 + 1, 1, 3, 1, 0, "", "", + QCoreApplication::translate("GLOBAL", "Theme1:1;Theme2:2;Theme3:3"),//主题1:1;主题2:2;主题3:3 + 0, 0, 0x0001, operate)); + */ + + //不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + QString strLanguage = createStrList + ({QCoreApplication::translate("GLOBAL", "Chinese"), //0, 中文 + QCoreApplication::translate("GLOBAL", "English"), //1, 英文 + QCoreApplication::translate("GLOBAL", "Ukrainian"), //2, 乌克兰文 + QCoreApplication::translate("GLOBAL", "French"),//3, 法文 + QCoreApplication::translate("GLOBAL", "Russian"),//4, 俄语 + QCoreApplication::translate("GLOBAL", "German")//5, 德文 + }); + + //软件设置参数-语言;单位:无 ,范围0-1,默认0 + parasList.append(makeAParaItem(0, + PARA_TYPE_SOFTWARESET, + 0 , + SET_LANGUAGE, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Language"),//语言 + 0, chinese, german, 0, 0, "", "", + strLanguage,0, 0, 0x0002, operate)); + + // #ifdef Q_OS_WIN + //软件设置参数-字体大小 + parasList.append(makeAParaItem(0, + PARA_TYPE_SOFTWARESET, + 0 , + SET_FONTSIZE, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Fontsize"),//字体大小 + 0, 8, 16, 0, 0, "", "", + (""), + 0, 0, 0x0002, operate)); + // #endif + + //软件设置参数--------------------------- +} + +//各个机型通用参数-时间设置参数 +void initTimeParasList(QList & parasList) +{ + //时间设置参数--------------------------- + //时间设置参数-年;单位:无 ,范围1000-9999,默认1000 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 1, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Year"),//年 + 1000, 1000, 9999, 1000, 0, "", "", + "", 0, 0, 0x0000, operate)); + + //时间设置参数-月;单位:无 ,范围1-12,默认1 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 2, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Month"),//月 + 1, 1, 12, 1, 0, "", "", + "", 0, 0, 0x0001, operate)); + + //时间设置参数-日;单位:无 ,范围1-31,默认1 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 3, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Day"),//日 + 1, 1, 31, 1, 0, "", "", + "", 0, 0, 0x0002, operate)); + + //时间设置参数-时;单位:无 ,范围0-23,默认0 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 4, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Hour"),//时 + 0, 0, 23, 0, 0, "", "", + "", 0, 0, 0x0003, operate)); + + //时间设置参数-分;单位:无 ,范围0-59,默认0 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 5, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Minute"),//分 + 0, 0, 59, 0, 0, "", "", + "", 0, 0, 0x0004, operate)); + + //时间设置参数-秒;单位:无 ,范围0-59,默认0 + parasList.append(makeAParaItem(0, + PARA_TYPE_TIMESET, + 0 , + 6, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Second"),//秒 + 0, 0, 59, 0, 0, "", "", + "", 0, 0, 0x0005, operate)); + //时间设置参数--------------------------- +} + +//各个机型通用参数-网络管理参数 +void initNetworkParasList(QList & parasList) +{ + + //网络管理参数-服务器IP设置;单位:无 ,范围无,默认192.168.16.253 + parasList.append(makeAParaItem(0, + PARA_TYPE_NETWORKSET, + 0 , + SET_MACHINE_SERVERIP, 0, 0, PARA_VALUE_TYPE_STRINPUT, + QCoreApplication::translate("GLOBAL", "Server IP settings"),//服务器IP设置 + 0, 0, 0, 0, 0, "", "192.168.16.253", + "", + 0, 0, 0x0007, operate)); + + //网络管理参数-服务器端口设置;单位:无 ,范围0-65535,默认5000 + parasList.append(makeAParaItem(0, + PARA_TYPE_NETWORKSET, + 0 , + SET_MACHINE_SERVERPORT, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Server port settings"),//服务器端口设置 + 5000, 0, U16_MAX, 5000, 0, "", "", + "", 0, 0,0x0008, operate)); + + //网络管理参数-本地IP设置;单位:无 ,范围无,默认192.168.16.41 + parasList.append(makeAParaItem(0, + PARA_TYPE_NETWORKSET, + 0 , + SET_LOCALIP, 0, 0, PARA_VALUE_TYPE_STRINPUT, + QCoreApplication::translate("GLOBAL", "Local IP settings"),//本地IP设置 + 0, 0, 0, 0, 0, "", "192.168.16.41", + "", + 0, 0, 0x0009, operate)); + + //网络管理参数-本地端口设置;单位:无 ,范围0-65535,默认5001 + parasList.append(makeAParaItem(0, + PARA_TYPE_NETWORKSET, + 0 , + SET_LOCALPORT, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Local port settings"),//本地端口设置 + 5001, 0, U16_MAX, 5001, 0, "", "", + "", 0, 0,0x000A, operate)); + //网络管理参数--------------------------- +} + +OutCtrlItem makeAOutCtrlItem(int macType, int showPriority, QString name, int def, + QString btn1Str, bool btn1Visible, int btn1ClickFun, int btn1PreFun, int btn1RelFun, + QString btn2Str, bool btn2Visible, int btn2ClickFun, int btn2PreFun, int btn2RelFun, + QString btn3Str, bool btn3Visible, int btn3ClickFun, int btn3PreFun, int btn3RelFun, + QString btn4Str, bool btn4Visible, int btn4ClickFun, int btn4PreFun, int btn4RelFun, + QString btn5Str, bool btn5Visible, int btn5ClickFun, int btn5PreFun, int btn5RelFun) +{ + OutCtrlItem item; + item.clean(); + + item.m_macType = macType; + item.m_showPriority = showPriority; + item.m_name = name; + item.m_def = def; + + item.m_btn1Str = btn1Str; + item.m_btn1Visible = btn1Visible; + item.m_btn1ClickFun = btn1ClickFun; + item.m_btn1PreFun = btn1PreFun; + item.m_btn1RelFun = btn1RelFun; + + item.m_btn2Str = btn2Str; + item.m_btn2Visible = btn2Visible; + item.m_btn2ClickFun = btn2ClickFun; + item.m_btn2PreFun = btn2PreFun; + item.m_btn2RelFun = btn2RelFun; + + item.m_btn3Str = btn3Str; + item.m_btn3Visible = btn3Visible; + item.m_btn3ClickFun = btn3ClickFun; + item.m_btn3PreFun = btn3PreFun; + item.m_btn3RelFun = btn3RelFun; + + item.m_btn4Str = btn4Str; + item.m_btn4Visible = btn4Visible; + item.m_btn4ClickFun = btn4ClickFun; + item.m_btn4PreFun = btn4PreFun; + item.m_btn4RelFun = btn4RelFun; + + item.m_btn5Str = btn5Str; + item.m_btn5Visible = btn5Visible; + item.m_btn5ClickFun = btn5ClickFun; + item.m_btn5PreFun = btn5PreFun; + item.m_btn5RelFun = btn5RelFun; + + return item; +} + +ShortCutItem makeAShortCutItem(int macType, int showPriority, QString name, QString topImageName, int enumFunction) +{ + ShortCutItem item; + item.clean(); + + item.m_macType = macType; + item.m_showPriority = showPriority; + item.m_name = name; + item.m_topImageName = topImageName; + item.m_enumFunction = enumFunction; + + return item; +} + +//添加辅助功能item +AssistItem makeAAssistItem(int macType, int showPriority, QString name, QString topImageName, int enumFunction) +{ + AssistItem item; + item.clean(); + + item.m_macType = macType; + item.m_showPriority = showPriority; + item.m_name = name; + item.m_topImageName = topImageName; + item.m_enumFunction = enumFunction; + + return item; +} + +PatternSetItem makeAPatternSetItem(int macType, int showPriority, QString name, QString topImageName, int enumFunction) +{ + PatternSetItem item; + item.clean(); + + item.m_macType = macType; + item.m_showPriority = showPriority; + item.m_name = name; + item.m_topImageName = topImageName; + item.m_enumFunction = enumFunction; + + return item; +} + +void initRootHMIConfigurationList(QList ¶sList) +{ + //超级用户界面配置参数-分辨率;单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_RESOLUTION, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Resolution"),//分辨率 + 0, 0, 2, 0, 0, "", "", + "1920x1080:0;1024x600:1;800x480:2;", + 0, 0, 0x0001, root)); + + //软件设置参数-通讯方式;单位:无 ,范围0-2,默认0 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + SET_CONNECTMODE, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Communication method"),//通讯方式 + 0, 0, 1, 0, 0, "", "", + QCoreApplication::translate("GLOBAL", "Network:0;SerialPort:1"),//网口:0;串口:1 + 0, 0, 0x0011, operate)); + + QString strYesNo = createStrList + ({QCoreApplication::translate("GLOBAL", "No"), //0, 否 + QCoreApplication::translate("GLOBAL", "Yes"), //1, 是 + }); + + QList mcTypeList; + mcSelect mc; + mc.mcName = QCoreApplication::translate("GLOBAL", "McHighSingleQui"); //高速单针机 + mc.mcIdx = MACHINE_HIGHSPEEDSINGLEQUI; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "FiveHeadPrecisionSewing"); //五头精密缝 + mc.mcIdx = MACHINE_FIVEHEADPRECISIONSEWING; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "ClothingMac"); //服装机 + mc.mcIdx = MACHINE_CLOTHINGMAC; + mcTypeList.append(mc); + +// mc.mcName = QCoreApplication::translate("GLOBAL", "Multineedlerotary"); //多针旋梭 +// mc.mcIdx = MACHINE_MULTINEEDLEROTARY; +// mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "ThickWiringMac"); //粗布布线机 + mc.mcIdx = MACHINE_THICK_WIRING; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "FlyShuttle"); //飞梭机 + mc.mcIdx = MACHINE_FLYSHUTTLE; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "GlassFibre"); //玻璃纤维 + mc.mcIdx = MACHINE_GLASSFIBRE; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "DoubleLayered"); //双层绗缝机 + mc.mcIdx = MACHINE_DOUBLE_LAYERED; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "DLQScheBoard"); //双层绗缝调度主板 + mc.mcIdx = MACHINE_DLQSCHE_BOARD; + mcTypeList.append(mc); + +// mc.mcName = QCoreApplication::translate("GLOBAL", "SingleMutilNeedle"); //单排多针旋梭 +// mc.mcIdx = MACHINE_SINGLE_MUTIL_NEEDLE; +// mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "DoubleSizedBedSheets"); //床单机双边缝 + mc.mcIdx = MACHINE_DOUBLE_BEDSHEETS; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "Multi-headRotaryShuttleMc"); //L2000多针机 改为 多头旋梭机 + mc.mcIdx = MACHINE_L2000_MULTI; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "Fully automatic quilting machine"); //全自动绗缝机 + mc.mcIdx = MACHINE_FULLYAUTOMATIC; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "PackageFourSidedTestBoard"); //包四边机测试板 + mc.mcIdx = MACHINE_PkgFourTestBoard; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "AutoDoubleDoor"); //全自动双龙门单机头 + mc.mcIdx = MACHINE_AutoDoubleDoor; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "DoubleHeadCombQuiMc"); //双头组合绗缝机 + mc.mcIdx = MACHINE_DOUBLEHEADQUI; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "CuttingWalk"); //边走边裁 + mc.mcIdx = MACHINE_CUTTINGWALK; + mcTypeList.append(mc); + + mc.mcName = QCoreApplication::translate("GLOBAL", "FourHeadCombQuiMc"); //四头组合绗缝机 + mc.mcIdx = MACHINE_FOURHEADQUI; + mcTypeList.append(mc); + QString strValue; + for(int i = 0; i < mcTypeList.size(); i++) + { + //01/** McHighSingleQui:0; + QString index = QString("%1/%2").arg(i + 1, 2, 10, QChar('0')).arg(mcTypeList.size()); + strValue += index + " " + mcTypeList.at(i).mcName + ":" + QString::number(mcTypeList.at(i).mcIdx) + ";"; + } + + //机器类型 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_MACTYPE, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Machine type"),//机器类型 + //值,最小值,最大值,默认值 + MACHINE_HIGHSPEEDSINGLEQUI, MACHINE_HIGHSPEEDSINGLEQUI, MACHINE_FOURHEADQUI, MACHINE_HIGHSPEEDSINGLEQUI, 0, "", "", + strValue, + 0, 0, 0x0012, operate)); + + //超级用户界面配置参数-产品类型;单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_PRODUCTTYPE, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Product type"),//产品类型 + PRODUCT_NULL, PRODUCT_NULL, PRODUCT_NULL, PRODUCT_NULL, 0, "", "", + QCoreApplication::translate("GLOBAL","ProductNull:")+QString::number(PRODUCT_NULL),//无 + 0, 0, 0x0013, root)); + + if(g_emMacType != MACHINE_L2000_MULTI) + { + //超级用户界面配置参数-是否有自动换梭功能;单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_SHUTTLECHANGE, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Whether there is a Automatic shuttle change function"),//是否有自动换梭功能 + 1, 0, 1, 1, 0, "", "", + strYesNo, + 1, 1, 0x0016, root)); + } + + //超级用户界面配置参数-主背景是否带水印;单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_WATERMARKSET, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Is there a GetonAgain logo"),//是否有再登高标志 + 1, 0, 1, 1, 0, "", "", + strYesNo, + 1, 1, 0x0017, root)); + + //超级用户界面配置参数-参数是否分类显示;单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_PARASORTSET, 0, 0, PARA_VALUE_TYPE_LIST, + QCoreApplication::translate("GLOBAL", "Parameter is classified"),//参数是否分类显示 + 0, 0, 1, 0, 0, "", "", + strYesNo, + 0, 0, 0x0018, root)); + + //是否WIFI + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_WIFI, 0, 0, PARA_VALUE_TYPE_SW, + QCoreApplication::translate("GLOBAL", "WIFI"),//WIFI + 0, 0, 1, 0, 0, "", "", + "", + 0, 0, 0x0018, root)); + + //主轴缝纫工作最高转速 + parasList.append(makeAParaItem(0, + PARA_TYPE_HMICONFIGURATION, + 0 , + ROOT_MAXSPEED_MAINSEWWORK, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Max Speed Of Main Sew Work"), + 0, 0, 4000, 0, 0, "", "", + "", + 0, 0, 0x0018, root)); +} + +//物联网配置参数 +void initRootIOTConfigurationList(QList ¶sList) +{ + //超级用户物联网配置-网关连接方式;单位:无 +// parasList.append(makeAParaItem(0, +// PARA_TYPE_IOTCONFIGURATION, +// 0 , +// ROOT_GATEWAYCONNECTIONMETHOD, 0, 0, PARA_VALUE_TYPE_LIST, +// QCoreApplication::translate("GLOBAL", "Gateway connection method"),//网关连接方式 +// 0, 0, 2, 0, 0, "", "", +// QCoreApplication::translate("GLOBAL","Serial port:0; Network port:1"), +// 0, 0, 0x0011, root)); + + //超级用户物联网配置-机架号输入; 单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_IOTCONFIGURATION, + 0 , + ROOT_RACKNUMBERINPUT, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Input rack number"),//机架号输入 + 0, 0, INT_MAX, 0, 0, "", "", + "", + 0, 0, 0x0012, root)); + + //超级用户物联网配置-网络设置; 单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_IOTCONFIGURATION, + 0 , + ROOT_NETWORKSETTINGS, 0, 0, PARA_VALUE_TYPE_CLICK, + QCoreApplication::translate("GLOBAL", "Network settings"),//网络设置 + 0, 0, 0, 0, 0, "", "", + "", + 0, 0, 0x0013, root)); + + //超级用户物联网配置-工厂预计交货时间; 单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_IOTCONFIGURATION, + 0 , + ROOT_DELIVERYTIME, 0, 0, PARA_VALUE_TYPE_STRINPUT, + QCoreApplication::translate("GLOBAL", "Factory expects delivery time"),//工厂预计交货时间 + 0, 0, 0, 0, 0, "", "", + "", + 0, 0, 0x0014, root)); + + //超级用户物联网配置-调试进度; 单位:无 + parasList.append(makeAParaItem(0, + PARA_TYPE_IOTCONFIGURATION, + 0 , + ROOT_DEBUGPROGRESS, 0, 0, PARA_VALUE_TYPE_INT, + QCoreApplication::translate("GLOBAL", "Debugging progress"),//调试进度 + 0, 1, 100, 0, 0, "", "", + "", + 0, 0, 0x0015, root)); +} + +ParaSetItem makeAParaSetItem(int macType, int showPriority, QString name, QString topImageName, int paraType) +{ + ParaSetItem item; + item.clean(); + + item.m_macType = macType; + item.m_showPriority = showPriority; + item.m_name = name; + item.m_topImageName = topImageName; + item.m_paraType = paraType; + + return item; +} + +SensorItem makeASensorItem(int byte, int bit, QString name, int type) +{ + SensorItem item; + item.clean(); + + item.m_byte_offset = byte; + item.m_bit_offset = bit; + item.m_name = name; + item.m_type = type; + + return item; +} + +ErrorCodeStateItem makeAErrorStateItem(int code, QString name) +{ + ErrorCodeStateItem item; + item.clean(); + + item.m_code = code; + item.m_name = name; + + return item; +} diff --git a/items/itemsmanage.h b/items/itemsmanage.h new file mode 100644 index 0000000..079ddb5 --- /dev/null +++ b/items/itemsmanage.h @@ -0,0 +1,102 @@ +#ifndef ITEMSMANAGE_H +#define ITEMSMANAGE_H + +#include "paraitem.h" +#include "outctrlitem.h" +#include "shortcutitem.h" +#include "assistitem.h" +#include "patternsetitem.h" +#include "parasetitem.h" +#include "nineitem.h" +#include "sensoritem.h" +#include "errorcodestateitem.h" +#include "main.h" +#include +#include + +struct mcSelect +{ + QString mcName; + int mcIdx; +}; + +//添加快捷功能item +ShortCutItem makeAShortCutItem(int macType,int showPriority, + QString name,QString topImageName, + int enumFunction); + +//添加辅助功能item +AssistItem makeAAssistItem(int macType,int showPriority, + QString name,QString topImageName, + int enumFunction); + +//花样设置功能item +PatternSetItem makeAPatternSetItem(int macType,int showPriority, + QString name,QString topImageName, + int enumFunction); + +//参数设置功能item +ParaSetItem makeAParaSetItem(int macType,int showPriority, + QString name,QString topImageName, + int paraType); + +//传感器信号item +SensorItem makeASensorItem(int byte,int bit,QString name,int type = -1); + +//错误代码/状态item +ErrorCodeStateItem makeAErrorStateItem(int code,QString name); + +//添加控制动作item +OutCtrlItem makeAOutCtrlItem(int macType,int showPriority,QString name,int def, + QString btn1Str,bool btn1Visible, + int btn1ClickFun,int btn1PreFun,int btn1RelFun, + QString btn2Str,bool btn2Visible, + int btn2ClickFun,int btn2PreFun,int btn2RelFun, + QString btn3Str,bool btn3Visible, + int btn3ClickFun,int btn3PreFun,int btn3RelFun, + QString btn4Str,bool btn4Visible, + int btn4ClickFun,int btn4PreFun,int btn4RelFun, + QString btn5Str,bool btn5Visible, + int btn5ClickFun,int btn5PreFun,int btn5RelFun); + + +//添加参数item +ParaItem makeAParaItem( + int64_t mcenSel, /* 机型选择 */ + int paraType, /* 参数类型(机器参数、工作参数、花样设置参数...) */ + int paraTypeSort, /* 参数类型分类(机器参数的速度参数、机器参数的动作参数...) */ + int indexInPara, /* 参数索引,-1,提示型显示; >= 0,该条目在参数中的位置*/ + int bitInWord, /* 参数位索引 */ + int readonly, /* 只读标志 */ + int valueType, /* 参数值类型 = 0, 无值; = 1, 数字输入型; = 2, 开关选择型; = 3, 列表选择; = 4, 字符输入型*/ + + QString paraName, /* 参数名称 */ + + int64_t value, /* int输入型或选择型参数值 */ + int64_t minval, /* int输入型参数值范围下限 */ + int64_t maxval, /* int输入型参数值范围上限 */ + int64_t defvalue, /* int输入型或选择型默认参数值 */ + int afterpoint, /* int输入型保留小数位数 */ + QString unitstr, /* int输入型单位字符串 */ + QString valuestr, /* 字符输入型参数字符串 */ + + QString selList, /* 列表选择型的参数列表, 通过"\n"来分割 */ + int selIdx, /* 当前选择项索引 */ + int defIdx, /* 默认选择项索引 */ + + int showPriority, /* 显示优先级 */ + int authority /* 参数权限 */ + ); + + + +//比较参数优先级 +bool comparePriority(const ParaItem & item1, const ParaItem & item2); + +//各个机型通用参数 +void initSoftwareParasList(QList & parasList);//软件参数 +void initTimeParasList(QList & parasList);//时间设置参数 +void initNetworkParasList(QList & parasList);//网络管理参数 +void initRootHMIConfigurationList(QList & parasList);//界面配置参数 +void initRootIOTConfigurationList(QList ¶sList); //物联网配置参数 +#endif // ITEMSMANAGE_H diff --git a/items/nineitem.cpp b/items/nineitem.cpp new file mode 100644 index 0000000..1c86980 --- /dev/null +++ b/items/nineitem.cpp @@ -0,0 +1,44 @@ +#include "nineitem.h" + +NineItem::NineItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +NineItem::NineItem(int fun, QString ImageName) +{ + clean(); + m_topImageName = ImageName; + m_enumFunction = fun; +} + +NineItem::~NineItem() +{ + clean(); +} + +NineItem::NineItem(const NineItem &item) : QObject(0) +{ + copyData(item); +} + +NineItem &NineItem::operator=(const NineItem &item) +{ + copyData(item); + return *this; +} + +void NineItem::clean() +{ + m_topImageName.clear(); + m_enumFunction = 0; +} + +void NineItem::copyData(const NineItem &item) +{ + if (this != &item) + { + this->m_topImageName = item.m_topImageName; + this->m_enumFunction = item.m_enumFunction; + } +} diff --git a/items/nineitem.h b/items/nineitem.h new file mode 100644 index 0000000..950c641 --- /dev/null +++ b/items/nineitem.h @@ -0,0 +1,30 @@ +#ifndef NINEITEM_H +#define NINEITEM_H + +#include + +class NineItem : public QObject +{ + Q_OBJECT +public: + explicit NineItem(QObject *parent = 0); + NineItem(int fun,QString ImageName); + ~NineItem(); + +public: + NineItem(const NineItem & item); + NineItem & operator= (const NineItem & item); + +public: + void clean(); + +private: + void copyData(const NineItem & item); + +public: + QString m_topImageName; // 顶图图标logo名称 + int m_enumFunction; // 对应的事件的枚举值 + +}; + +#endif // NINEITEM_H diff --git a/items/outctrlitem.cpp b/items/outctrlitem.cpp new file mode 100644 index 0000000..f02181c --- /dev/null +++ b/items/outctrlitem.cpp @@ -0,0 +1,101 @@ +#include "outctrlitem.h" + +OutCtrlItem::OutCtrlItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +OutCtrlItem::~OutCtrlItem() +{ + clean(); +} + +OutCtrlItem::OutCtrlItem(const OutCtrlItem & item) : QObject() +{ + copyData(item); +} + +OutCtrlItem & OutCtrlItem::operator= (const OutCtrlItem & item) +{ + copyData(item); + return *this; +} + +void OutCtrlItem::clean() +{ + m_macType = 0; + m_showPriority = 0; + m_name.clear(); // 名称 + m_def = -1; + + m_btn1Str.clear(); + m_btn1Visible = false; + m_btn1ClickFun = -1; + m_btn1PreFun = -1; + m_btn1RelFun = -1; + + m_btn2Str.clear(); + m_btn2Visible = false; + m_btn2ClickFun = -1; + m_btn2PreFun = -1; + m_btn2RelFun = -1; + + m_btn3Str.clear(); + m_btn3Visible = false; + m_btn3ClickFun = -1; + m_btn3PreFun = -1; + m_btn3RelFun = -1; + + m_btn4Str.clear(); + m_btn4Visible = false; + m_btn4ClickFun = -1; + m_btn4PreFun = -1; + m_btn4RelFun = -1; + + m_btn5Str.clear(); + m_btn5Visible = false; + m_btn5ClickFun = -1; + m_btn5PreFun = -1; + m_btn5RelFun = -1; +} + +void OutCtrlItem::copyData(const OutCtrlItem & item) +{ + if (this != &item) + { + this->m_macType = item.m_macType; + this->m_showPriority = item.m_showPriority; + this->m_name = item.m_name; // 名称 + this->m_def = item.m_def; + + this->m_btn1Str = item.m_btn1Str; + this->m_btn1Visible = item.m_btn1Visible; + this->m_btn1ClickFun = item.m_btn1ClickFun; + this->m_btn1PreFun = item.m_btn1PreFun; + this->m_btn1RelFun = item.m_btn1RelFun; + + this->m_btn2Str = item.m_btn2Str; + this->m_btn2Visible = item.m_btn2Visible; + this->m_btn2ClickFun = item.m_btn2ClickFun; + this->m_btn2PreFun = item.m_btn2PreFun; + this->m_btn2RelFun = item.m_btn2RelFun; + + this->m_btn3Str = item.m_btn3Str; + this->m_btn3Visible = item.m_btn3Visible; + this->m_btn3ClickFun = item.m_btn3ClickFun; + this->m_btn3PreFun = item.m_btn3PreFun; + this->m_btn3RelFun = item.m_btn3RelFun; + + this->m_btn4Str = item.m_btn4Str; + this->m_btn4Visible = item.m_btn4Visible; + this->m_btn4ClickFun = item.m_btn4ClickFun; + this->m_btn4PreFun = item.m_btn4PreFun; + this->m_btn4RelFun = item.m_btn4RelFun; + + this->m_btn5Str = item.m_btn5Str; + this->m_btn5Visible = item.m_btn5Visible; + this->m_btn5ClickFun = item.m_btn5ClickFun; + this->m_btn5PreFun = item.m_btn5PreFun; + this->m_btn5RelFun = item.m_btn5RelFun; + } +} diff --git a/items/outctrlitem.h b/items/outctrlitem.h new file mode 100644 index 0000000..388d39b --- /dev/null +++ b/items/outctrlitem.h @@ -0,0 +1,68 @@ +#ifndef OUTCTRLITEM_H +#define OUTCTRLITEM_H + +#include +#include "items/cmdconfig.h" + +typedef short int s16; + +class OutCtrlItem : public QObject +{ + Q_OBJECT +public: + explicit OutCtrlItem(QObject *parent = 0); + + ~OutCtrlItem(); + +public: + OutCtrlItem(const OutCtrlItem & item); + OutCtrlItem & operator= (const OutCtrlItem & item); + +public: + void clean(); + +private: + void copyData(const OutCtrlItem & item); + +public: + int m_macType; // 机器类型 + int m_showPriority; // 显示优先级 + QString m_name; // 名称 + int m_def; // 对应的事件宏定义 + + QString m_btn1Str; // 按钮1上的文本 + bool m_btn1Visible; // 按钮1是否可见 + s16 m_btn1ClickFun; // 按钮1对应的点击事件 -1:代表没有 + s16 m_btn1PreFun; // 按钮1对应的按下事件 -1:代表没有 + s16 m_btn1RelFun; // 按钮1对应的抬起事件 -1:代表没有 + + QString m_btn2Str; // 按钮2上的文本 + bool m_btn2Visible; // 按钮2是否可见 + s16 m_btn2ClickFun; // 按钮2对应的点击事件 -1:代表没有 + s16 m_btn2PreFun; // 按钮2对应的按下事件 -1:代表没有 + s16 m_btn2RelFun; // 按钮2对应的抬起事件 -1:代表没有 + + QString m_btn3Str; // 按钮3上的文本 + bool m_btn3Visible; // 按钮3是否可见 + s16 m_btn3ClickFun; // 按钮3对应的点击事件 -1:代表没有 + s16 m_btn3PreFun; // 按钮3对应的按下事件 -1:代表没有 + s16 m_btn3RelFun; // 按钮3对应的抬起事件 -1:代表没有 + + QString m_btn4Str; // 按钮4上的文本 + bool m_btn4Visible; // 按钮4是否可见 + s16 m_btn4ClickFun; // 按钮4对应的点击事件 -1:代表没有 + s16 m_btn4PreFun; // 按钮4对应的按下事件 -1:代表没有 + s16 m_btn4RelFun; // 按钮4对应的抬起事件 -1:代表没有 + + QString m_btn5Str; // 按钮5上的文本 + bool m_btn5Visible; // 按钮5是否可见 + s16 m_btn5ClickFun; // 按钮5对应的点击事件 -1:代表没有 + s16 m_btn5PreFun; // 按钮5对应的按下事件 -1:代表没有 + s16 m_btn5RelFun; // 按钮5对应的抬起事件 -1:代表没有 + +signals: + +public slots: +}; + +#endif // OUTCTRLITEM_H diff --git a/items/paraitem.cpp b/items/paraitem.cpp new file mode 100644 index 0000000..a58bbe1 --- /dev/null +++ b/items/paraitem.cpp @@ -0,0 +1,77 @@ +#include "paraitem.h" + + +ParaItem::ParaItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +ParaItem::~ParaItem() +{ + paraName.clear(); + selList.clear(); + unitStr.clear(); + valueStr.clear(); +} + +ParaItem::ParaItem(const ParaItem & item) : QObject() +{ + copyData(item); +} + +ParaItem & ParaItem::operator=(const ParaItem & item) +{ + copyData(item); + return *this; +} + +void ParaItem::clean() +{ + mcenSel = 0; + paraType = 0; + paraTypeSort = 0; + indexInPara = -1; + bitInWord = 0; + readonly = 0; + valueType = 0; + paraName = ""; + value = 0; + minVal = 0; + maxVal = 0; + defValue = 0; + afterPoint = 0; + unitStr = ""; + valueStr = ""; + selList = ""; + selIdx = -1; + defIdx = -1; + showPriority = 0; + authority = 0; +} + +void ParaItem::copyData(const ParaItem & item) +{ + if (this != &item) + { + this->mcenSel = item.mcenSel; + this->paraType = item.paraType; + this->paraTypeSort = item.paraTypeSort; + this->indexInPara = item.indexInPara; + this->bitInWord = item.bitInWord; + this->readonly = item.readonly; + this->valueType = item.valueType; + this->paraName = item.paraName; + this->value = item.value; + this->minVal = item.minVal; + this->maxVal = item.maxVal; + this->defValue = item.defValue; + this->afterPoint = item.afterPoint; + this->unitStr = item.unitStr; + this->valueStr = item.valueStr; + this->selList = item.selList; + this->selIdx = item.selIdx; + this->defIdx = item.defIdx; + this->showPriority = item.showPriority; + this->authority = item.authority; + } +} diff --git a/items/paraitem.h b/items/paraitem.h new file mode 100644 index 0000000..fd10daa --- /dev/null +++ b/items/paraitem.h @@ -0,0 +1,92 @@ +#ifndef PARAITEM_H +#define PARAITEM_H + +#include +#include +#include +#include "items/cmdconfig.h" + +class ParaItem : public QObject +{ + Q_OBJECT +public: + explicit ParaItem(QObject *parent = 0); + ParaItem(const ParaItem & item); + ~ParaItem(); + +public: + ParaItem &operator=(const ParaItem & item); + +public: + void clean(); + +private: + void copyData(const ParaItem & item); + +public: + int64_t mcenSel; // 机型选择 + int paraType; // 参数类型(机器参数、工作参数、花样设置参数...) + int paraTypeSort; // 参数类型分类(机器参数的速度参数、机器参数的动作参数...) + + int indexInPara; // 参数索引,-1,提示型显示; >= 0,该条目在参数中的位置 + int bitInWord; // 参数位索引 + int readonly; // 只读标志 + int valueType; // 参数值类型 = 0, 无值; = 1, 数字输入型; = 2, 开关选择型; = 3, 列表选择型; = 4, 字符输入型 +public: + QString paraName; // 参数名称 +public: + int64_t value; // 数字输入型数值 + int64_t minVal; // 输入值范围下限 + int64_t maxVal; // 输入值范围上限 + int64_t defValue; // 默认值 + int afterPoint; // 保留小数位数 + QString unitStr; // 单位 + QString valueStr; // 字符输入型字符 + +public: + QString selList; // 列表选择型参数列表,通过"\n"来分割 + int selIdx; // 选择项目 + int defIdx; // 默认选择 +public: + int showPriority; // 显示优先级 + int authority; // 参数权限 + +}; + +#define PARA_VALUE_TYPE_NONE 0 // 无 +#define PARA_VALUE_TYPE_INT 1 // 数值输入型 +#define PARA_VALUE_TYPE_SW 2 // 开关型 +#define PARA_VALUE_TYPE_LIST 3 // 列表选择型 +#define PARA_VALUE_TYPE_STRINPUT 4 // 字符串输入型 +#define PARA_VALUE_TYPE_CLICK 5 // 点击触发型 + +//参数类型(点击触发型的参数种类) +#define PARA_TYPE_MACH 0x00000001 // 主控机器参数 +#define PARA_TYPE_WORK 0x00000002 // 主控工作参数 +#define PARA_TYPE_DEF_MC 0x00000004 // 出厂默认机器配置参数(读取有效) +#define PARA_TYPE_DEF_WK 0x00000008 // 出厂默认机器工作参数(读取有效) +#define PARA_TYPE_PATTERN 0x00000010 // 花样参数 +#define PARA_TYPE_SOFTWARESET 0x00000020 // 软件设置参数 +#define PARA_TYPE_TIMESET 0x00000040 // 时间设置参数 +#define PARA_TYPE_COMMONFUN 0x00000080 // 常用功能设置参数 +#define PARA_TYPE_NETWORKSET 0x00000100 // 网络管理设置参数 +#define PARA_TYPE_ROOT 0x00000200 // 超级用户参数 +#define PARA_TYPE_SPINDLETEST 0x00000400 // 主轴研车参数 +#define PARA_TYPE_HMICONFIGURATION 0x00000800 // 界面配置 +#define PARA_TYPE_IOTCONFIGURATION 0x00001000 // 物联网配置 +#define PARA_TYPE_NETWORKSETTINGS 0x00002000 // 网络设置 + +//参数分类 +#define MC_SORT_SPEED 0x0001 // 速度参数 +#define MC_SORT_ACTION 0x0002 // 动作参数 +#define MC_SORT_DETECT 0x0004 // 检测参数 +#define MC_SORT_POSITION 0x0008 // 位置参数 +#define MC_SORT_SETTING 0x0010 // 设置参数 + +//花样参数分类 +#define PATTERNPARA_SORT_DSTR 0x0001 // dst和dsr文件花样参数 +#define PATTERNPARA_SORT_QUI 0x0002 // qui文件花样参数 +#define PATTERNPARA_SORT_PLT 0x0003 // plt文件花样参数 + + +#endif // PARAITEM_H diff --git a/items/parasetitem.cpp b/items/parasetitem.cpp new file mode 100644 index 0000000..9d798b4 --- /dev/null +++ b/items/parasetitem.cpp @@ -0,0 +1,44 @@ +#include "parasetitem.h" + +ParaSetItem::ParaSetItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +ParaSetItem::~ParaSetItem() +{ + clean(); +} + +ParaSetItem::ParaSetItem(const ParaSetItem & item) : QObject() +{ + copyData(item); +} + +ParaSetItem & ParaSetItem::operator= (const ParaSetItem & item) +{ + copyData(item); + return *this; +} + +void ParaSetItem::clean() +{ + m_macType = 0; + m_showPriority = 0; + m_name.clear(); + m_topImageName.clear(); + m_paraType = 1; +} + +void ParaSetItem::copyData(const ParaSetItem &item) +{ + if (this != &item) + { + this->m_macType = item.m_macType; + this->m_showPriority = item.m_showPriority; + this->m_name = item.m_name; + this->m_topImageName = item.m_topImageName; + this->m_paraType = item.m_paraType; + } +} + diff --git a/items/parasetitem.h b/items/parasetitem.h new file mode 100644 index 0000000..92122cd --- /dev/null +++ b/items/parasetitem.h @@ -0,0 +1,36 @@ +#ifndef PARASETITEM_H +#define PARASETITEM_H + +#include + +class ParaSetItem : public QObject +{ + Q_OBJECT +public: + explicit ParaSetItem(QObject *parent = 0); + + ~ParaSetItem(); + +public: + ParaSetItem(const ParaSetItem & item); + ParaSetItem & operator= (const ParaSetItem & item); + +public: + void clean(); + +private: + void copyData(const ParaSetItem & item); + +public: + int m_macType; // 机器类型 + int m_showPriority; // 显示优先级 + QString m_name; // label名称 + QString m_topImageName; // 顶图图标logo名称 + int m_paraType; // 参数类型 + +signals: + +public slots: +}; + +#endif // PARASETITEM_H diff --git a/items/patternsetitem.cpp b/items/patternsetitem.cpp new file mode 100644 index 0000000..d24a25c --- /dev/null +++ b/items/patternsetitem.cpp @@ -0,0 +1,43 @@ +#include "patternsetitem.h" + +PatternSetItem::PatternSetItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +PatternSetItem::~PatternSetItem() +{ + clean(); +} + +PatternSetItem::PatternSetItem(const PatternSetItem & item) : QObject() +{ + copyData(item); +} + +PatternSetItem & PatternSetItem::operator= (const PatternSetItem & item) +{ + copyData(item); + return *this; +} + +void PatternSetItem::clean() +{ + m_macType = 0; + m_showPriority = 0; + m_name.clear(); + m_topImageName.clear(); + m_enumFunction = 0; +} + +void PatternSetItem::copyData(const PatternSetItem &item) +{ + if (this != &item) + { + this->m_macType = item.m_macType; + this->m_showPriority = item.m_showPriority; + this->m_name = item.m_name; + this->m_topImageName = item.m_topImageName; + this->m_enumFunction = item.m_enumFunction; + } +} diff --git a/items/patternsetitem.h b/items/patternsetitem.h new file mode 100644 index 0000000..c9579ac --- /dev/null +++ b/items/patternsetitem.h @@ -0,0 +1,36 @@ +#ifndef PATTERNSETITEM_H +#define PATTERNSETITEM_H + +#include + +class PatternSetItem : public QObject +{ + Q_OBJECT +public: + explicit PatternSetItem(QObject *parent = 0); + + ~PatternSetItem(); + +public: + PatternSetItem(const PatternSetItem & item); + PatternSetItem & operator= (const PatternSetItem & item); + +public: + void clean(); + +private: + void copyData(const PatternSetItem & item); + +public: + int m_macType; // 机器类型 + int m_showPriority; // 显示优先级 + QString m_name; // label名称 + QString m_topImageName; // 顶图图标logo名称 + int m_enumFunction; // 对应的事件的枚举值 + +signals: + +public slots: +}; + +#endif // PATTERNSETITEM_H diff --git a/items/sensoritem.cpp b/items/sensoritem.cpp new file mode 100644 index 0000000..90d657e --- /dev/null +++ b/items/sensoritem.cpp @@ -0,0 +1,46 @@ +#include "sensoritem.h" + +SensorItem::SensorItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +SensorItem::~SensorItem() +{ + clean(); +} + +SensorItem::SensorItem(const SensorItem & item) : QObject() +{ + copyData(item); +} + +SensorItem & SensorItem::operator= (const SensorItem & item) +{ + copyData(item); + return *this; +} + +void SensorItem::clean() +{ + m_byte_offset = -1; // 字节偏移值 + m_bit_offset = -1; // 字节内位偏移值 + m_name.clear(); // 名称 + m_type = -1; // 传感器类型 +} + +void SensorItem::copyData(const SensorItem & item) +{ + m_byte_offset = item.m_byte_offset ; // 字节偏移值 + m_bit_offset = item.m_bit_offset ; // 字节内位偏移值 + m_name = item.m_name ; // 名称 + m_type = item.m_type; // 传感器类型 +} + +void SensorItem::setItemValue(int woffset, int boffset, QString name, int type) +{ + m_byte_offset = woffset ; // 字节偏移值 + m_bit_offset = boffset ; // 字节内位偏移值 + m_name = name ; // 名称 + m_type = type; // 传感器类型 +} diff --git a/items/sensoritem.h b/items/sensoritem.h new file mode 100644 index 0000000..da59709 --- /dev/null +++ b/items/sensoritem.h @@ -0,0 +1,35 @@ +#ifndef __SENSORITEM_H__ +#define __SENSORITEM_H__ + +#include + +#define MAX_SENSOR_NUM (1024*8) + +class SensorItem : public QObject +{ + Q_OBJECT +public: + explicit SensorItem(QObject *parent = 0); + ~SensorItem(); +public: + SensorItem(const SensorItem & item); + SensorItem & operator= (const SensorItem & item); + +public: + void clean(); + +private: + void copyData(const SensorItem & item); + +public: + void setItemValue(int woffset, int boffset, QString name, int type = -1); + +public: + int m_byte_offset; // 字节偏移值 + int m_bit_offset; // 字节内的位偏移值 + QString m_name; // 名称 + int m_type; // 传感器类型 + +}; + +#endif // __SENSORITEM_H__ diff --git a/items/shortcutitem.cpp b/items/shortcutitem.cpp new file mode 100644 index 0000000..3e5cf44 --- /dev/null +++ b/items/shortcutitem.cpp @@ -0,0 +1,43 @@ +#include "shortcutitem.h" + +ShortCutItem::ShortCutItem(QObject *parent) : QObject(parent) +{ + clean(); +} + +ShortCutItem::~ShortCutItem() +{ + clean(); +} + +ShortCutItem::ShortCutItem(const ShortCutItem & item) : QObject() +{ + copyData(item); +} + +ShortCutItem & ShortCutItem::operator= (const ShortCutItem & item) +{ + copyData(item); + return *this; +} + +void ShortCutItem::clean() +{ + m_macType = 0; + m_showPriority = 0; + m_name.clear(); + m_topImageName.clear(); + m_enumFunction = 0; +} + +void ShortCutItem::copyData(const ShortCutItem &item) +{ + if (this != &item) + { + this->m_macType = item.m_macType; + this->m_showPriority = item.m_showPriority; + this->m_name = item.m_name; + this->m_topImageName = item.m_topImageName; + this->m_enumFunction = item.m_enumFunction; + } +} diff --git a/items/shortcutitem.h b/items/shortcutitem.h new file mode 100644 index 0000000..069cf37 --- /dev/null +++ b/items/shortcutitem.h @@ -0,0 +1,35 @@ +#ifndef SHORTCUTITEM_H +#define SHORTCUTITEM_H + +#include + +class ShortCutItem : public QObject +{ + Q_OBJECT +public: + explicit ShortCutItem(QObject *parent = 0); + + ~ShortCutItem(); +public: + ShortCutItem(const ShortCutItem & item); + ShortCutItem & operator= (const ShortCutItem & item); + +public: + void clean(); + +private: + void copyData(const ShortCutItem & item); + +public: + int m_macType; // 机器类型 + int m_showPriority; // 显示优先级 + QString m_name; // label名称 + QString m_topImageName; // 顶图图标logo名称 + int m_enumFunction; // 对应的事件的枚举值 + +signals: + +public slots: +}; + +#endif // SHORTCUTITEM_H diff --git a/machine/comm/comm.cpp b/machine/comm/comm.cpp new file mode 100644 index 0000000..c1de8bd --- /dev/null +++ b/machine/comm/comm.cpp @@ -0,0 +1,438 @@ +//------------------------------------------------------------------------------- +// File Name: comm.cpp +// Brief: +// Version: 1.0.0 +// Create Date: 2017/05/08 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2017, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2017/05/08 +//------------------------------------------------------------------------------- + +#define _IN_COMM_CPP + +#include "comm.h" +#include "crc16.h" + + +//-------------------------------------------------------------------------------------------------- + +// 读空缓冲区 +void readBuffEmpty(DataExFuns * funs) +{ + int rslt, len; + u8 temp; + + len = funs->getRsvLen(); + + while (len > 0) + { + rslt = funs->getCommData(&temp, 1); + if (rslt != 1) + { + rslt = 0; + break; + } + len--; + } +} + +//-------------------------------------------------------------------------------------------------- +// 功能: 从通讯口接收缓冲区中得到一个数据包, 如果有附加数据,包括附加数据 +// 参数: pPacket, 数据包指针 +// 返回: >=0, 成功取得一个数据包,包括定长数据包和可变长度数据包,返回值为数据包长度 +// -1, 参数错误 +// -2, CRC错误 +// -3, 数据不足 +// -4, 没有找到同步序列 +// -5,等待接收数据超时 +// -6, 数据包参数错误 +// -7, 附加数据CRC错误 +// -8, 发生未知错误 + +// 结果: 如果正确取得数据包,或通讯口没有命令, 循环队列尾指针回向后移动 + +int getANormalPacket(DataExFuns * funs, DataPacket * pPacket) +{ + int rslt, len; + int i; + int phase; + int status; + int exlen; + static int rdstatus = 0; + static u8 odBuf[LEN_NORMAL_PACKET]; + + u8 temp; + u8 rdBuf[LEN_NORMAL_PACKET]; + DataPacket * pDat; + + u8 getBuf[LEN_NORMAL_PACKET-DP_SYNC_LEN]; + int getBuflen; + int getIdx; + + u8 tmpBuf[LEN_NORMAL_PACKET-DP_SYNC_LEN]; + int tmpBuflen; + + if (funs == NULL || pPacket == NULL) + { + return -1; + } + + rslt = 0; + i = 0; // 扫描字节计数器 + getBuflen = 0; + getIdx = 0; + tmpBuflen = 0; + pDat = (DataPacket *)rdBuf; + + if (rdstatus == 0) + { + do + { + len = funs->getRsvLen(); // 得到接收长度 + len += getBuflen; // 加上已经获取的长度 + + if (len < LEN_NORMAL_PACKET) + { + rslt = -3; + break; // 没有足够数据 + } + + phase = 0; + status = 0; + rslt = 0; + + // 从接收缓冲区中找数据包 + while(((len + phase) >= LEN_NORMAL_PACKET) && (phase < LEN_NORMAL_PACKET)) + { + if (getBuflen == 0) + { + if (phase == 0 && i > MAX_ONCE_SCAN) + { + rslt = -4; + break; // 查找同步序列超出最大单次扫描字节数 + } + + rslt = funs->getCommData(&temp, 1); + if (rslt != 1) + { + printf("error at GetCommData rslt\r\n"); + rslt = -8; + break; + } + rslt = 0; + i++; // 扫描字数增加 + } + else + { + temp = getBuf[getIdx]; + getIdx++; + getBuflen--; + } + + len--; // 剩余长度减小 + + pDat->buff.normal[phase] = temp; + if (phase < DP_SYNC_LEN) // 识别同步序列 + { + tmpBuflen = 0; + + if (phase == 0) + { + if (temp == FLDP_SYNC[0]) + { + status = 1; + } + else if (temp == VLDP_SYNC[0]) + { + status = 2; + } + else + { + status = 0; + phase = 0; + rslt = 0; // 非同步序列 + break; + } + } + else + { + if (status == 1) + { + if (temp != FLDP_SYNC[phase]) + { + status = 0; + phase = 0; + rslt = 0; + break; + } + } + else if (status == 2) + { + if (temp != VLDP_SYNC[phase]) + { + status = 0; + phase = 0; + rslt = 0; + break; + } + } + else + { + printf("error status in GetANormalPacket\r\n"); + rslt = -8; + break; + } + } + } + else + { + tmpBuf[tmpBuflen] = temp; + tmpBuflen++; + } + + phase++; + } + + if (rslt != 0) + { + break; + } + + if (phase >= LEN_NORMAL_PACKET) // 得到数据包 + { + u16 crc; + crc = calcCrc16(pDat->normal.content, DP_CONT_LEN); + if (crc == pDat->normal.crc) + { + // 得到正确数据包 + memcpy(pPacket, pDat, LEN_NORMAL_PACKET); + + // printf("GetANormalPacket ok\r\n"); + rslt = LEN_NORMAL_PACKET; + break; + } + else + { + // CRC 不正确 + printf("crc error in GetANormalPacket\r\n"); + // 拷贝需要再判断的数据 + if (tmpBuflen != 0) + { + memcpy(getBuf, tmpBuf, tmpBuflen); + } + getBuflen = tmpBuflen; + getIdx = 0; + // continue; + } + } + else + { + // 没有找到同步序列的情况 + getBuflen = 0; + getIdx = 0; + // continue; + } + }while(1); + } + + if (rdstatus == 1) + { + memcpy(pPacket, odBuf, LEN_NORMAL_PACKET); + rslt = LEN_NORMAL_PACKET; + } + + // 附加数据 + if (rslt == LEN_NORMAL_PACKET) + { + if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0) // 是可变长度数据包 + { + exlen = pPacket->vldp.exlen; + if (exlen > MAX_EXDP_LEN) + { + printf("data exlen error, len=%d\r\n", exlen); + return -6; // 数据包参数错误 + } + + memset(pPacket->buff.exData, 0, MAX_EXDP_LEN); + + i = 0; + status = 0; // 作为历史计数器 + // 读取附加数据 + do + { + rslt = funs->getCommData(pPacket->buff.exData, exlen); + if (rslt == exlen) + { + u16 crc; + // 校验CRC + crc = calcCrc16(pPacket->buff.exData, exlen); + if (crc == pPacket->vldp.excrc) + { +// printf("get exdata ok\r\n"); + rslt = exlen+LEN_NORMAL_PACKET; + } + else + { + printf("crc error at get exdata\r\n"); + rslt = -7; // CRC错误 + } + rdstatus = 0; + break; // 得到数据 + } + else if (rslt == 0) + { + memcpy(odBuf, pPacket, LEN_NORMAL_PACKET); + rdstatus = 1; + rslt = -3; + break; + /* + // 数据不足 + if (funs->delay != NULL) + { + funs->delay(1); // 延时等待 + } + len = funs->getRsvLen(); // 得到接收数据长度 + qDebug()<<"getRsvLen"< GTEX_TIME_OUT) // 如果无变化计数器值大于超时值 + { + qDebug()<<"call GetCommData timeout"; + rslt = -5; + break; + } + } + */ + } + else + { + qDebug()<<"error after call GetCommData"; + break; + } + }while(1); + + } + } + return rslt; +} + +//-------------------------------------------------------------------------------------------------- + +// 功能: 添加数据到发送队列中, 通过通讯口发送数据 +// 参数: pPacket, 需要发送的数据,已经正确存放在了相应字段。 +// 结果: +// 0, 可以发送, 添加到了发送数据队列中 +// -1, 参数错误 +// -2,发送错误 +// 1, 队列已满, 不能发送 +int sendAPacket(DataExFuns * funs, DataPacket * pPacket) +{ + int rslt; + int freelen, sendlen; + + if (pPacket == NULL) + { + return -1; + } + + if (memcmp(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN) == 0) + { + sendlen = LEN_NORMAL_PACKET; + } + else if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0) + { + sendlen = LEN_NORMAL_PACKET + pPacket->vldp.exlen; + } + else + { + printf("para err, not a corrected packet\r\n"); + return -1; + } + + freelen = funs->getTrsFreeLen(); + + if (freelen < sendlen) + { +// printf("buff is full in SendAPacket\r\n"); + return 1; + } + + rslt = funs->sendCommData(pPacket->datbuff, sendlen); + if (rslt != sendlen) + { + printf("error at call SendCommData, rslt=%d\r\n", rslt); + return -2; + } + + return 0; +} + +//-------------------------------------------------------------------------------------------------- + +// 功能: 打包一个固定长度数据包 +// 参数: +// pPacket, 需要打包的数据包,其中除了sync和crc的部分已经就绪 +// 结果: +// 0, 打包好数据 +// -1, 参数错误 + +int packetAFLDP(DataPacket * pPacket) +{ + if (pPacket == NULL) + { + return -1; + } + + memcpy(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN); + pPacket->normal.crc = calcCrc16(pPacket->normal.content, DP_CONT_LEN); + + return 0; +} + +//-------------------------------------------------------------------------------------------------- + +// 功能: 打包一个可变长度数据包 +// 参数: pPacket, 需要打包的数据包,需要填充其中的 SYNC EXLEN EXCRC 和 EXDAT 等部分 +// pExdat, 附加数据,可以为空 +// exlen,附加数据长度,可以为0 +// 结果: +// 0, 打包好数据 +// -1, 参数错误 +// -2, + +int packetAVLDP(DataPacket * pPacket, u8 * pExdat, u16 exlen) +{ + if (pPacket == NULL) + { + return -1; + } + + if (pExdat == NULL) + { + exlen = 0; + } + + memcpy(pPacket->vldp.sync, VLDP_SYNC, DP_SYNC_LEN); + pPacket->vldp.exlen = exlen; + pPacket->vldp.excrc = calcCrc16(pExdat, exlen); + pPacket->vldp.crc = calcCrc16(pPacket->normal.content, DP_CONT_LEN); + if (exlen != 0) + { + memcpy(pPacket->vldp.exData, pExdat, exlen); + } + return 0; +} + +//-------------------------------------------------------------------------------------------------- + + diff --git a/machine/comm/comm.h b/machine/comm/comm.h new file mode 100644 index 0000000..0133af1 --- /dev/null +++ b/machine/comm/comm.h @@ -0,0 +1,228 @@ +//------------------------------------------------------------------------------- +// File Name: comm.h +// Brief: +// Version: 1.0.0 +// Create Date: 2017/05/08 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2017, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2017/05/08 +//------------------------------------------------------------------------------- + +#ifndef __COMM_H__ +#define __COMM_H__ + +#include "typedef.h" +#include +#include +#include +//------------------------------------------------------------------------ + +// 通讯数据包定义 + +//------------------------------------ +/* +一、数据包格式 + + 1. 固定长度数据包格式 + + |-------------------------------------------------------------------|-----------| + | 数据识别序列 | 数据内容 | 校验字 | + |-------------------------------------------------------------------|-----------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 B8 B9 B10 B11 B12 B13 | B14 B15 | + |-------------------------------------------------------------------|-----------| + | 固定序列如下 | | 参数,不同命令定义不同 | B4--B13的 | + | | 数据包ID | 具体定义参考命令详细说明 | | + | 'F','L','D','P' | | | 16位CRC | + |-------------------------------------------------------------------|-----------| + + 2. 可变长度数据包格式 + + |---------------------------------------------------------------------------|-----------|---------------- + | 数据识别序列 | 数据内容 | 校验字 | 附加数据 | + |---------------------------------------------------------------------------|-----------|---------------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 B12 B13 | B14 B15 | B16--Bn | + |---------------------------------------------------------------------------|-----------|---------------| + | 固定序列如下 | | 附加 | 附加 | 参数,不同命令 | B4--B13的 | 数据内容 | + | | 数据包ID | 数据 | 数据 | 定义不同,定义 | | | + | 'V','L','D','P' | | 长度 | 校验字 | 参考命令详细说明 | 16位CRC | | + |---------------------------------------------------------------------------|-----------|---------------| + + 附加数据长度取值范围为 0--1024 +*/ + +//------------------------------------ + +#define DP_SYNC_LEN 4 // 数据识别序列长度 +#define DP_CONT_LEN 10 // 数据内容长度 +#define DP_CRC_LEN 2 // 校验字长度 +#define MAX_EXDP_LEN 1024 // 最大附加数据长度 + +#define LEN_NORMAL_PACKET (DP_SYNC_LEN+DP_CONT_LEN+DP_CRC_LEN) + +#define MAX_INDP_PARA 8 + +#ifdef _IN_COMM_CPP + +//最早 +//const u8 FLDP_SYNC[DP_SYNC_LEN] = +//{ +// 'F','L','D','P', +//}; + +//const u8 VLDP_SYNC[DP_SYNC_LEN] = +//{ +// 'V','L','D','P', +//}; + +//期间 +//const u8 FLDP_SYNC[DP_SYNC_LEN] = +//{ +// 'F','L','P','S', +//}; + +//const u8 VLDP_SYNC[DP_SYNC_LEN] = +//{ +// 'V','L','P','S', +//}; + +//最新 +const u8 FLDP_SYNC[DP_SYNC_LEN] = +{ + 'F','S','F','D', +}; + +const u8 VLDP_SYNC[DP_SYNC_LEN] = +{ + 'V','S','F','D', +}; + +#else + +extern const u8 FLDP_SYNC[DP_SYNC_LEN]; +extern const u8 VLDP_SYNC[DP_SYNC_LEN]; + +#endif + +//----------------------------------------------------------------------- + +typedef union +{ + u8 datbuff[LEN_NORMAL_PACKET+MAX_EXDP_LEN]; // dat buff 方式 + + struct + { + u8 normal[LEN_NORMAL_PACKET]; + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) buff; // buff方式 + + struct + { + u8 sync[DP_SYNC_LEN]; + u8 content[DP_CONT_LEN]; + u16 crc; + } __attribute__ ((packed)) normal; // 通用方式 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmd; + u8 para[8]; + u16 crc; + } __attribute__ ((packed)) fldp; // fldp方式 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmd; + u16 exlen; + u16 excrc; + u8 para[4]; + u16 crc; + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) vldp; // vldp方式 + +} DataPacket; + +//----------------------------------------------------------------------- + +typedef struct +{ + int (*sendCommData)(u8 *, int); + int (*getCommData)(u8 *, int); + int (*getRsvLen)(void); + int (*getTrsFreeLen)(void); + void (*delay)(u32); +} DataExFuns; + + +//----------------------------------------------------------------------- + +// 读空缓冲区 +void readBuffEmpty(DataExFuns * funs); + + +//----------------------------------------------------------------------- + +// 功能: 从通讯口接收缓冲区中得到一个数据包, +// 只能取得普通数据包结构. 如果数据包还有附加数据, 那么需要用 GetExCommData 函数取得 +// 参数: pPacket, 数据包指针 +// 返回: >=0, 成功取得一个数据包,包括定长数据包和可变长度数据包,返回值为数据包长度 +// -1, 参数错误 +// -2, CRC错误 +// -3, 数据不足 +// -4, 没有找到同步序列 +// -5,等待接收数据超时 +// -6, 数据包参数错误 +// -7, 附加数据CRC错误 +// -8, 发生未知错误 + +// 结果: 如果正确取得数据包,或通讯口没有命令, 循环队列尾指针回向后移动 + +#define MAX_ONCE_SCAN (LEN_NORMAL_PACKET*10) // 一次扫描最大字节数 +#define GTEX_TIME_OUT 100 // 得到数据包超时时间,单位是ms + +int getANormalPacket(DataExFuns * funs, DataPacket * pPacket); + +//-------------------------------------------------------------------------------------------------- + +// 功能: 添加数据到发送队列中, 通过通讯口发送数据 +// 参数: pPacket, 需要发送的数据,已经正确存放在了相应字段。 +// 结果: +// 0, 可以发送, 添加到了发送数据队列中 +// -1, 参数错误 +// -2,发送错误 +// 1, 队列已满, 不能发送 +int sendAPacket(DataExFuns * funs, DataPacket * pPacket); + +//-------------------------------------------------------------------------------------------------- + +// 功能: 打包一个固定长度数据包 +// 参数: +// pPacket, 需要打包的数据包,其中除了sync和crc的部分已经就绪 +// 结果: +// 0, 打包好数据 +// -1, 参数错误 + +int packetAFLDP(DataPacket * pPacket); + +//-------------------------------------------------------------------------------------------------- + +// 功能: 打包一个可变长度数据包 +// 参数: pPacket, 需要打包的数据包,需要填充其中的 SYNC EXLEN EXCRC 和 EXDAT 等部分 +// pExdat, 附加数据,可以为空 +// exlen,附加数据长度,可以为0 +// 结果: +// 0, 打包好数据 +// -1, 参数错误 +// -2, + +int packetAVLDP(DataPacket * pPacket, u8 * pExdat, u16 exlen); + +//-------------------------------------------------------------------------------------------------- + + +#endif diff --git a/machine/comm/config.h b/machine/comm/config.h new file mode 100644 index 0000000..a5b2e71 --- /dev/null +++ b/machine/comm/config.h @@ -0,0 +1,16 @@ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + + + +#include "typedef.h" +#include + + +#define EMBROIDERY +#define MAX_EXDP_LEN 1024 // 最大附加数据长度 + +#define SEW 8 //缝纫 +#define IMAGE_TYPE (QImage::Format_ARGB32) + +#endif diff --git a/machine/comm/crc16.cpp b/machine/comm/crc16.cpp new file mode 100644 index 0000000..7f97a49 --- /dev/null +++ b/machine/comm/crc16.cpp @@ -0,0 +1,159 @@ + +//------------------------------------------------------------------------------- +// File Name: crc16.cpp +// Brief: +// Version: 1.0.0 +// Create Date: 2017/05/08 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2017, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2017/05/08 +//------------------------------------------------------------------------------- + + +#include "crc16.h" + +//------------------------------------------------------------------------------- + +#ifdef USE_CRC_TABLE + +// 16 位 crc 列表 +u16 CRC16_LIST[256] = +{ + 0x0000, 0x3096, 0x612C, 0x51BA, 0xC419, 0xF48F, 0xA535, 0x95A3, + 0x8832, 0xB8A4, 0xE91E, 0xD988, 0x4C2B, 0x7CBD, 0x2D07, 0x1D91, + 0x1064, 0x20F2, 0x7148, 0x41DE, 0xD47D, 0xE4EB, 0xB551, 0x85C7, + 0x9856, 0xA8C0, 0xF97A, 0xC9EC, 0x5C4F, 0x6CD9, 0x3D63, 0x0DF5, + 0x20C8, 0x105E, 0x41E4, 0x7172, 0xE4D1, 0xD447, 0x85FD, 0xB56B, + 0xA8FA, 0x986C, 0xC9D6, 0xF940, 0x6CE3, 0x5C75, 0x0DCF, 0x3D59, + 0x30AC, 0x003A, 0x5180, 0x6116, 0xF4B5, 0xC423, 0x9599, 0xA50F, + 0xB89E, 0x8808, 0xD9B2, 0xE924, 0x7C87, 0x4C11, 0x1DAB, 0x2D3D, + 0x4190, 0x7106, 0x20BC, 0x102A, 0x8589, 0xB51F, 0xE4A5, 0xD433, + 0xC9A2, 0xF934, 0xA88E, 0x9818, 0x0DBB, 0x3D2D, 0x6C97, 0x5C01, + 0x51F4, 0x6162, 0x30D8, 0x004E, 0x95ED, 0xA57B, 0xF4C1, 0xC457, + 0xD9C6, 0xE950, 0xB8EA, 0x887C, 0x1DDF, 0x2D49, 0x7CF3, 0x4C65, + 0x6158, 0x51CE, 0x0074, 0x30E2, 0xA541, 0x95D7, 0xC46D, 0xF4FB, + 0xE96A, 0xD9FC, 0x8846, 0xB8D0, 0x2D73, 0x1DE5, 0x4C5F, 0x7CC9, + 0x713C, 0x41AA, 0x1010, 0x2086, 0xB525, 0x85B3, 0xD409, 0xE49F, + 0xF90E, 0xC998, 0x9822, 0xA8B4, 0x3D17, 0x0D81, 0x5C3B, 0x6CAD, + 0x8320, 0xB3B6, 0xE20C, 0xD29A, 0x4739, 0x77AF, 0x2615, 0x1683, + 0x0B12, 0x3B84, 0x6A3E, 0x5AA8, 0xCF0B, 0xFF9D, 0xAE27, 0x9EB1, + 0x9344, 0xA3D2, 0xF268, 0xC2FE, 0x575D, 0x67CB, 0x3671, 0x06E7, + 0x1B76, 0x2BE0, 0x7A5A, 0x4ACC, 0xDF6F, 0xEFF9, 0xBE43, 0x8ED5, + 0xA3E8, 0x937E, 0xC2C4, 0xF252, 0x67F1, 0x5767, 0x06DD, 0x364B, + 0x2BDA, 0x1B4C, 0x4AF6, 0x7A60, 0xEFC3, 0xDF55, 0x8EEF, 0xBE79, + 0xB38C, 0x831A, 0xD2A0, 0xE236, 0x7795, 0x4703, 0x16B9, 0x262F, + 0x3BBE, 0x0B28, 0x5A92, 0x6A04, 0xFFA7, 0xCF31, 0x9E8B, 0xAE1D, + 0xC2B0, 0xF226, 0xA39C, 0x930A, 0x06A9, 0x363F, 0x6785, 0x5713, + 0x4A82, 0x7A14, 0x2BAE, 0x1B38, 0x8E9B, 0xBE0D, 0xEFB7, 0xDF21, + 0xD2D4, 0xE242, 0xB3F8, 0x836E, 0x16CD, 0x265B, 0x77E1, 0x4777, + 0x5AE6, 0x6A70, 0x3BCA, 0x0B5C, 0x9EFF, 0xAE69, 0xFFD3, 0xCF45, + 0xE278, 0xD2EE, 0x8354, 0xB3C2, 0x2661, 0x16F7, 0x474D, 0x77DB, + 0x6A4A, 0x5ADC, 0x0B66, 0x3BF0, 0xAE53, 0x9EC5, 0xCF7F, 0xFFE9, + 0xF21C, 0xC28A, 0x9330, 0xA3A6, 0x3605, 0x0693, 0x5729, 0x67BF, + 0x7A2E, 0x4AB8, 0x1B02, 0x2B94, 0xBE37, 0x8EA1, 0xDF1B, 0xEF8D +}; + +#else + +#ifdef SHIFT_RIGHT // 如果是右移 + +#define CRC_GEN 0xa001 // 使用多项式 0xa001 + +#else // 如果是左移 + +#define CRC_GEN 0x8005 // 使用多项式 0x8005 + +#endif // #ifdef SHIFT_RIGHT + +#endif + +//------------------------------------------------------------------------------- + +u16 addCrc16(u16 crcword, u8 dat) +{ +#ifdef USE_CRC_TABLE // 查表法crc + crcword = (crcword >> 8) ^ CRC16_LIST[(crcword ^ dat) & 0xFF]; +#else + u8 i; + crcword ^= dat; + for (i = 0; i < 8; i++) + { +#ifdef SHIFT_RIGHT // 右移计算crc + if ((LOBYTE(crcword) & 0x01) != 0) + { + crcword >>= 1; + crcword ^= CRC_GEN; + } + else + { + crcword >>= 1; + } +#else // 左移计算crc + if ((HIBYTE(crcword) & 0x80) != 0) + { + crcword <<= 1; + crcword ^= CRC_GEN; + } + else + { + crcword <<= 1; + } +#endif + } + +#endif + return crcword; +} + +//------------------------------------------------------------------------------- + +u16 calcCrc16(u8 * pBuf, int lenBuf) +{ + int i; + u16 crcword = CRC_INIT; + + for (i = 0; i < lenBuf; i++) + { + crcword = addCrc16(crcword, pBuf[i]); + } + + return crcword; +} + +//------------------------------------------------------------------------------- + +u8 calcCheckSum8(u8 * pBuf, int lenBuf) +{ + int i; + u8 checksum = 0; + + for (i = 0; i < lenBuf; i++) + { + checksum += pBuf[i]; + } + + return checksum; + +} + +//------------------------------------------------------------------------------- + +u32 calcCheckSum32(u8 * pBuf, int lenBuf) +{ + int i; + u32 checksum = 0; + + for (i = 0; i < lenBuf; i++) + { + checksum += pBuf[i]; + } + + return checksum; + +} + + diff --git a/machine/comm/crc16.h b/machine/comm/crc16.h new file mode 100644 index 0000000..62116e9 --- /dev/null +++ b/machine/comm/crc16.h @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------- +// File Name: crc16.h +// Brief: +// Version: 1.0.0 +// Create Date: 2017/05/08 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2017, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2017/05/08 +//------------------------------------------------------------------------------- + + +#ifndef __CRC16_H__ +#define __CRC16_H__ + +/* + + CRC16 算法模块 + + 提供查表法和移位法两种 CRC16 算法 + +*/ + +#include "typedef.h" + +#define USE_CRC_TABLE // 用查表法crc, 否则, 用移位法计算 +#define SHIFT_RIGHT // 右移位 + +#ifdef USE_CRC_TABLE + +#define CRC_INIT 0x0000 // 并且crc初值为0 + +#else + +#ifdef SHIFT_RIGHT // 如果是右移 + +#define CRC_INIT 0xFFFF // crc初值为0xFFFF + +#else // 如果是左移 + +#define CRC_INIT 0x0000 // 并且crc初值为0 + +#endif // #ifdef SHIFT_RIGHT + +#endif + + +u16 calcCrc16(u8 * pBuf, int lenBuf); + + +u8 calcCheckSum8(u8 * pBuf, int lenBuf); + +u32 calcCheckSum32(u8 * pBuf, int lenBuf); + + +#endif + diff --git a/machine/comm/crc32.cpp b/machine/comm/crc32.cpp new file mode 100644 index 0000000..3ea6d75 --- /dev/null +++ b/machine/comm/crc32.cpp @@ -0,0 +1,74 @@ + +//------------------------------------------------------------------------------- +// File Name: crc32.c +// Brief: +// Version: 1.0.0 +// Create Date: 2018/08/13 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2019, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2018/08/13 +//------------------------------------------------------------------------------- + + +#include "crc32.h" + +//------------------------------------------------------------------------------- + +static const u32 CRC32_LIST[256] = +{ + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, + 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, + 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, + 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, + 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, + 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, + 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, + 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, + 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, + 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, + 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, + 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, + 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, + 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, + 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, + 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, + 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, + 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, + 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, + 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, + 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, + 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, + 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, + 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, + 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, + 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL, +}; + + +u32 addCrc32(u32 crcword, u8 dat) +{ + return (crcword >> 8) ^ CRC32_LIST[((crcword ^ dat) & 0xFF)]; +} + +u32 calcCrc32(u8 * pBuf, int lenBuf) +{ + int i; + u32 crcword = CRC32_INIT; + + for (i = 0; i < lenBuf; i++) + { + crcword = addCrc32(crcword, pBuf[i]); + } + + return crcword; +} diff --git a/machine/comm/crc32.h b/machine/comm/crc32.h new file mode 100644 index 0000000..37036da --- /dev/null +++ b/machine/comm/crc32.h @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------- +// File Name: crc32.h +// Brief: +// Version: 1.0.0 +// Create Date: 2018/08/13 +// Create by: Marshal Lee +// Copyright: +// Copyright (c) 2019, GetonAgain Co., LTD. +// All rights reserved. +// +// Modify by: Marshal Lee +// Modify Date: 2018/08/13 +//------------------------------------------------------------------------------- + + +#ifndef __CRC32_H__ +#define __CRC32_H__ + +/* + CRC32 算法模块 +*/ + +#include "typedef.h" + +#define CRC32_INIT 0xffffffff // crc初值 + + +u32 addCrc32(u32 crcword, u8 dat); +u32 calcCrc32(u8 * pBuf, int lenBuf); + + + +#endif diff --git a/machine/comm/datadef.h b/machine/comm/datadef.h new file mode 100644 index 0000000..b44012c --- /dev/null +++ b/machine/comm/datadef.h @@ -0,0 +1,495 @@ +#ifndef __DATADEF_H__ +#define __DATADEF_H__ + +#include "typedef.h" +#include "config.h" +//------------------------------------------------------------------------- + +#define PATTERN_LARGE_NEEDLES 1280000 + +// 绝对位置数据 +typedef struct +{ + u8 ctrl; //控制字节 + u8 attr; //属性字节 + WORD action;//控制动作 + double ax; //X位置 + double ay; //Y位置 + double ar; //R角度 + +}__attribute__ ((packed)) DsAbsItem; + +typedef struct +{ + QList absItemList; + +}LineItem; + +// 画图格式数据 +typedef struct +{ + u8 ctrl;//控制字节 + u8 attr;//属性字节 + + WORD action;// 附加动作 + double bx, by;//绘制起点,第一机头 + double ex, ey;//绘制终点,第一机头 + double bx2, by2;//绘制起点,第二机头 + double ex2, ey2;//绘制终点,第二机头 + s32 ar;//角度 + u32 rgb; + +}__attribute__ ((packed)) DispItem; + +// 编辑花样格式数据 +typedef struct +{ + u8 ctrl;//控制字节 + u8 attr;//属性字节 + + WORD action;// 附加动作 + double bx, by;//绘制起点 + double ex, ey;//绘制终点 + s16 ar;//角度 + +}__attribute__ ((packed)) ViewItem; + +//刀压测试的获取XY增益参数 +typedef struct +{ + s16 GapArray[25][20]; // X*Y + u16 enFlag; // 参数有效标志 + u8 cellx; // X向格子数 + u8 celly; // Y向格子数 + s16 xcellgap; // X向格子间距,单位mm + s16 ycellgap; // Y向格子间距,单位mm + s16 collectStartX; // X向采集起始位置,单位mm + s16 collectStartY; // Y向采集起始位置,单位mm + u16 rev[0x200-25*20-6]; +} __attribute__ ((packed)) KnifeGapPara; + + +//机头间距表地址 +typedef struct { + unsigned char iswork; //1-8机头是否工作 + unsigned char doubleHead; //双机头 + unsigned short int distance1_2; //机头2和机头1的机头间距(单位0.1mm,范围0-5000.0) + unsigned short int distance1_3; + unsigned short int distance1_4; + unsigned short int distance1_5; + unsigned short int distance1_6; + unsigned short int distance1_7; + unsigned short int distance1_8; + +}__attribute__ ((packed)) HeadTable; + +// 画图格式数据 +typedef struct +{ + u8 ctrl;//控制字节 + u8 attr;//属性字节 + + WORD action;// 附加动作 + s16 bx, by;//绘制起点 + s16 ex, ey;//绘制终点 + s16 ar;//角度 + HeadTable headtable; + u32 rgb; + +}__attribute__ ((packed)) Disp_HeadItem; + +// 执行数据定义 +typedef struct +{ + u8 ctrl; // 控制字节 + u8 attr; // 属性字节 + s16 dx; // X偏移 + s16 dy; // Y偏移 + s16 dr; // R偏移 + u16 len; // xy分量合成长度 + u8 action[2]; //附加动作 + + u8 rev[4]; // 保留 + +}__attribute__ ((packed)) DataItem, Ds16Item; + +// ds8格式 +typedef struct +{ + u8 ctrl; // 控制字节 + u8 attr; // 属性字节 + s16 dx; // X偏移 + s16 dy; // Y偏移 + s16 dr; // R偏移 + +}__attribute__ ((packed)) Ds8Item; + +// 兼容dsr格式 +typedef struct +{ + u8 ctrl; // 控制字节 + u8 attr; // 属性字节 + u8 dx; // X偏移 + u8 dy; // Y偏移 + +}__attribute__ ((packed)) DsrItem, Ds4Item; + + +// 双字节压缩格式 +typedef struct +{ + s8 cdx; // X数据 + s8 cdy; // Y数据 + + /* + 格式定义 + cdx x分量控制数据 + cdy y分量控制数据 + + 每个字节的最低位为控制位,高7个位为数据位。数据位的最高位是符号位。 + + 两个控制位合在一起形成4种控制数据,定义如下: + cdx.0 cdy.0 + 0 0 缝纫数据,数据范围从-128 -- +126, 只有偶数可用(精度0.2mm),单位0.1mm + 0 1 空走数据,数据范围从-128 -- +126, 只有偶数可用(精度0.2mm),单位0.1mm + 1 0 大步空走数据,数据范围从-128 -- +126, 只有偶数可用(精度2mm),单位1mm + 1 1 控制数据,数据位定义为控制码和参数 cdx 为控制码, cdx 为参数 + +*/ +}__attribute__ ((packed)) ToBItem, Ds2Item; + + +// ctrl 定义 +// 控制字节, 作为功能码,定义如下 + +#define DATA_NULL 0x00 // 文件结束 +#define DATA_SEWING 0x01 // 缝纫数据, 该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y,R 偏移运动dx,dy,dr, 框步进式运动或连续运动 +#define DATA_OFFSET 0x02 // 偏移数据, 该数据只移动 X, Y,R 偏移 dx,dy,dr,连续运动 +#define DATA_CUTTING 0x03 // 切刀数据, 该数据需要切刀先运转,同时 X, Y,R 偏移 dx,dy,dr,根据切刀类型选择动框方式 +#define DATA_LASER 0x04 // 激光数据, 该数据需要激光出光, 同时X, Y,R偏移 dx,dy,dr,框连续运动,激光强度和运动线速度有关系 +#define DATA_DRAWING 0x05 // 记号数据, 该数据需要记号笔先放下来, 同时X, Y,R偏移dx,dy,dr,框连续运动 +#define DATA_SEWING_R 0x06 // 右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y,R 偏移运动dx,dy,dr, 框步进式运动或连续运动 + +#define DATA_SECF_SEW 0x11 // 第二框缝纫 +#define DATA_SECF_OFST 0x12 // 第二框偏移 + +#define DATA_SECF_SEW_R 0x16 // 第二框右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y,R 偏移运动dx,dy,dr, 框步进式运动或连续运动 + +// 兼容DSR控制码 +#define DATA_SYNCSEW 0x07 // 同步缝纫数据, 该数据需要缝纫机针扎一次, 同时 X, Y,R 偏移运动 dx,dy,dr,X2, Y2 也运动 dx,dy,框步进式运动或连续运动 +#define DATA_PAUSE_OLD 0x08 // 暂停 +#define DATA_ANGLE_OLD 0x09 // 拐点 +#define DATA_CUT_OLD 0x0A // 剪线 +#define DATA_END_OLD 0x10 // 结束码 +#define DATA_OFFSET_SEC 0x12 // 第二机头偏移(右机头偏移) + +#define DATA_JUMP 0x0B // 跳针数据,该数据要求缝纫机主轴不动, 但 X, Y,R 偏移运动 dx,dy,dr, 框步进式运动或连续运动 +#define DATA_PUNCH 0x0C // 冲孔数据, 该数据需要冲孔主轴运转一圈,同时 X, Y,R 偏移 dx,dy,dr, +#define DATA_EMB 0x0D // 绣花数据,该数据需要平绣针扎一次, 同时 X, Y,偏移运动dx,dy, 框步进式运动 +#define DATA_CHGND_OLD 0x0E // 换色功能码 lxs 20220628添加 +#define DATA_SYNCOFST 0x0F // 同步偏移数据 +#define DATA_MIRROR_SEC 0x17 // 镜像缝纫数据 +#define DATA_MIRROR_OFT_SEC 0x1F // 镜像偏移数据 + +#define DATA_MILLING 0x21 // 铣刀数据 +#define DATA_DRILL 0x22 // 钻孔数据 +#define DATA_RKNIFE 0x23 // 圆刀数据, 该数据需要震刀先运转,同时 X, Y,R 偏移 dx,dy,dr, +#define DATA_SKNIFE 0x24 // 震刀数据, 该数据需要震刀先运转,同时 X, Y,R 偏移 dx,dy,dr, + +#define DATA_BASE1 0x2A // 基座1数据 +#define DATA_BASE2 0x2B // 基座2数据 +#define DATA_BASE3 0x2C // 基座3数据 + +#define DATA_EKNIFE1 0x2D // 偏心刀1数据 +#define DATA_EKNIFE2 0x2E // 偏心刀2数据 + +#define DATA_END 0x80 // 结束码 +#define DATA_PAUSE 0x81 // 暂停功能码 +#define DATA_CHGND 0x82 // 换色 +#define DATA_CUTTRD 0x83 // 剪线功能码 + +#define DATA_SYNC_CUTTER 0x88 // 左右机头剪线,下位机取名叫 DATA_CUTTRD_R +#define DATA_CUTTER_SEC 0x87 // 右机头剪线,下位机取名叫 DATA_CUTTRD_L + +#define DATA_ANGLE 0x89 // 拐点 + +// atrr, 属性字节,作为运动属性字节 + +// 缝纫针步的属性定义: + +// attr.7, 夹线力度等级H +// attr.6, 夹线力度等级L +// attr.5, 保留 +// attr.4, 缝纫回针标志 +// attr.3, 压脚高度等级H +// attr.2, 压脚高度等级L +// attr.1, 速度等级H +// attr.0, 速度等级L + +#define ATTR_CLAMP_LV 0xC0 // 夹线力度等级 +#define ATTR_RESEW 0x10 // 回针标志 +#define ATTR_FOOT_LV 0x0C // 压脚高度等级 +#define ATTR_SPD_LV 0x03 // 速度等级 + +// 缝纫针步的属性定义: +// dx, x向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm +// dy, y向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm +// dr, r向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.0001 弧度 +// len, xy 分量的合成长度,无符号数,范围0--65535, 单位为 0.01mm + +#define HEAD_NAME_STR_LEN 0x20 +#define HEAD_FIX_INFO_LEN 0x32 + +// 铣刀的属性定义: + +// attr.7, 保留 +// attr.6, 保留 +// attr.5, 保留 +// attr.4, 保留 +// attr.3, 刀压深度HH +// attr.2, 刀压深度HL +// attr.1, 刀压深度LH +// attr.0, 刀压深度LL + +#define ATTR_HIGH_MARK 0x0F // 铣刀刀压深度调整掩码 + +#pragma pack(1)//设定为1字节对齐 +//ds16头文件-发给下位机的 +typedef struct +{ + // 0x00 + char fileName[32]; // 文件名称 + + // 0x20 + u32 dataSize; // 数据字节数 + u32 itemNums; // 数据项个数 + u16 bytesPerItem; // 每项占的字节数 + u16 bytesPerBlk; // 数据内容划分块大小 + u32 dataChecksum; // 数据累加校验和 + u16 checkCrc; // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + + // 0x32 + u16 rev0; + u32 fileid; // 文件唯一标识符,识别是否为同一个文件 + + // 0x38 + u8 reserved1[0x40-0x38]; // 保留区1 + + // 0x40 + s32 anchorX; // 定位点坐标X + s32 anchorY; // 定位点坐标Y + + // 0x48 + s32 beginX; // 数据起点坐标X + s32 beginY; // 数据起点坐标Y + s32 beginR; // 数据起点坐标R + + // 0x54 + s32 minX; + s32 maxX; + s32 minY; + s32 maxY; // 轮廓范围 + + // 0x64 + u32 sizeX; + u32 sizeY; // 裁片大小 + + // 0x6C + s32 anchorX2; // 定位点坐标X2 + s32 anchorY2; // 定位点坐标Y2 + s32 beginX2; // 数据起点坐标X2 + s32 beginY2; // 数据起点坐标Y2 + s32 beginR2; // 数据起点坐标Z2 + + // 0x80 + u32 runAct; // 附加动作, + // bit0: 0:完成后不拍照 1:完成后拍照 + + // 0x84 + // bit0,偏移点X向允许 0,不允许 1,允许 + // bit1,偏移点Y向允许 0,不允许 1,允许 + // bit2,反复优先级 0,X向优先 1,Y向优先 + // bit3,二次剪线 0,不允许 1,允许 + u32 EnFlag; // + + s32 offsetX; // 偏移点X + s32 offsetY; + + // 0x90 + u8 xRepeatNums; // X向反复次数,范围0-99,默认0 + u8 yRepeatNums; // Y向反复次数 + s32 xRepeatDistance; // X向反复距离,单位mm,精度0.01,范围-100000-100000,默认0 + s32 yRepeatDistance; // Y向反复距离 + + // 0x9A + u8 reserved2[0x200-0x9A]; + + // 0x200 + u8 switchNeedleTable[0x400-0x200]; // 色序设定表, 支持512个色序设定 + +}__attribute__ ((packed)) DataDs16FileHead;//下发给主控的ds16文件头 +#pragma pack(1)//恢复对齐状态 + +typedef struct +{ + // 0 + char HMIVerStr[16]; // 界面版本 + + // 4 + u32 machineNumber; // 机器编号 + + // 5 + u16 motorNum; //电机个数 + u16 debugProgress; //调试进度 + // 6 + char fileName[32]; // 文件名称 + +#if(0) + // 52 + char sensorStartBtn; // 启动按钮1 + char sensorStopBtn; // 暂停按钮1 + char sensorJogBtn; // 点动按钮1 + char sensorMainFrameXZeroPos; // 主框架X零位 + char sensorMainFrameYZeroPos; // 主框架Y零位 + char sensorMainFrameXNegLimit; // 主框架X负限位 + char sensorMainFrameYNegLimit; // 主框架Y负限位 + char sensorMainFrameXPosLimit; // 主框架X正限位 + char sensorMainFrameYPosLimit; // 主框架Y正限位 + char sensorScissorsReturn; // 剪刀回位 +#endif + + //14 + char deliveryTime[32]; //交付日期 + + //22 + u32 workProgress; //机器工作进度(花样执行进度) + + //26 + u32 workState; //工作状态 + + //27 + u32 startPins; //开始针数 + + //28 + u32 endPins; //结束针数 + + //29 + quint64 startTime; //开始时间 + + //31 + quint64 endTime; //结束时间 + + //33 + u32 outCounter; //产量统计 + + //34 + u32 rev2[256-34]; + +} __attribute__ ((packed)) HMILotData; // 界面物联网数据 + +//------------------------------------------------------------------------- + + +// 升级文件头 +typedef struct +{ + // 0x00 + char fileName[32]; // 文件名称 + // 0x20 + u32 dataSize; // 数据字节数 + u32 dataChecksum; // 数据累加校验和 + + // 0x28 + u8 reserved1[0x30-0x28]; // 保留区1 + // 0x30 + u8 reserved2[0x64-0x30]; // 保留区1 + + // 0x64 + u8 reserved3[0x80-0x64]; // 保留区2 + + // 0x80 + u8 reserved4[0x100-0x80]; +}__attribute__ ((packed)) AppFileHead; + + +// 文件参数结构 +typedef struct +{ + // 0x00 + u8 hdIdenti[0x40]; + + // 0x40 + s32 anchorX; // 定位点坐标X + s32 anchorY; // 定位点坐标Y + // 0x48 + s32 beginX; // 数据起点坐标X + s32 beginY; // 数据起点坐标Y + s32 beginR; // 数据起点坐标Z + + // 0x54 + s32 minX; + s32 maxX; + s32 minY; + s32 maxY; // 轮廓范围 + + // 0x64 + u32 sizeX; + u32 sizeY; // 裁片大小 + + // 0x6C + s32 anchorX2; // 定位点坐标X2 + s32 anchorY2; // 定位点坐标Y2 + s32 beginX2; // 数据起点坐标X2 + s32 beginY2; // 数据起点坐标Y2 + s32 beginR2; // 数据起点坐标Z2 + + // 0x80 + u8 reserved0[0x200-0x80]; + // 0x200 + u8 reserved1[0x400-0x200]; + +}__attribute__ ((packed)) DataFilePara; + + +typedef struct +{ + s32 anchorX; // 定位点坐标X + s32 anchorY; // 定位点坐标Y + s32 beginX; // 数据起点坐标X + s32 beginY; // 数据起点坐标Y + +}__attribute__ ((packed)) DataFilePos; +//------------------------------------------------------------------------- + +// 文件执行参数结构 +typedef struct +{ + u32 newIdx; + s32 newXPos; + s32 newYPos; + s32 newRPos; + u32 newColorIdx; // 新针位 + u32 rev[256-5]; +}__attribute__ ((packed)) FileExecPara; + +//------------------------------------------------------------------------- + +//参数文件头 +struct ParaFile +{ + unsigned char s_head[4] ; // 默认 PARA + int s_type ; // 默认 0 + int s_len ; // 数据 默认 4096 + + unsigned int s_para_buff[1024] ; //工作 参数体 + + unsigned short s_crc ; //参数体的CRC + + unsigned short rev ; //预留 保持 结构体四字节对齐 +}; + +//------------------------------------------------------------------------- + +#endif + + diff --git a/machine/comm/protocol.h b/machine/comm/protocol.h new file mode 100644 index 0000000..591c5ff --- /dev/null +++ b/machine/comm/protocol.h @@ -0,0 +1,2033 @@ +#ifndef __PROTOCOL_H__ +#define __PROTOCOL_H__ + +#include "comm.h" +#include "datadef.h" + +#pragma pack(1)//设定为1字节对齐 + +// 和下位机的通讯协议 + +/* +// 通讯数据包定义 + +一、数据包格式 + + 1. 固定长度数据包格式 + + |-------------------------------------------------------------------|-----------| + | 数据识别序列 | 数据内容 | 校验字 | + |-------------------------------------------------------------------|-----------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 B8 B9 B10 B11 B12 B13 | B14 B15 | + |-------------------------------------------------------------------|-----------| + | 固定序列如下 | | 参数,不同命令定义不同 | B4--B13的 | + | | 数据包ID | 具体定义参考命令详细说明 | | + | 'F','L','D','P' | | | 16位CRC | + |-------------------------------------------------------------------|-----------| + + 2. 可变长度数据包格式 + + |---------------------------------------------------------------------------|-----------|---------------- + | 数据识别序列 | 数据内容 | 校验字 | 附加数据 | + |---------------------------------------------------------------------------|-----------|---------------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 B12 B13 | B14 B15 | B16--Bn | + |---------------------------------------------------------------------------|-----------|---------------| + | 固定序列如下 | | 附加 | 附加 | 参数,不同命令 | B4--B13的 | 数据内容 | + | | 数据包ID | 数据 | 数据 | 定义不同,定义 | | | + | 'V','L','D','P' | | 长度 | 校验字 | 参考命令详细说明 | 16位CRC | | + |---------------------------------------------------------------------------|-----------|---------------| + + 附加数据长度取值范围为 0--1024 + + +//------------------------------------ +二、通讯命令一览表 + + 1. 上位机发送命令 + + 名称 符号 代码 类型 回复 说明 + 读取机器信息 UCMD_GET_MC_INFO 0x0001 FLDP 有 机器信息包括机器种类,配置,控制系统版本等信息 + 读取机器状态 UCMD_GET_MC_STATUS 0x0002 FLDP 有 读取机器的运行状态,包括机器工作状态,常用输入状态,电机位置,工作进度,文件信息等。 + 读取机器参数 UCMD_GET_MC_PARAS 0x0003 FLDP 有 读取内存中机器参数列表 + 读取内存数据 UCMD_GET_MEM_DATA 0x0004 FLDP 有 读取机器存储器数据,包括片内SRAM,片外SRAM,NAND FLASH等的内容 + 读取传感信号 UCMD_GET_SENSORS 0x0005 FLDP 有 读取IO信号状态及电机位置,编码器位置等信息 + 读取文件信息 UCMD_GET_FILE_INFO 0x0006 FLDP 有 读取数据文件的信息 + 读取传输结果 UCMD_GET_TRANS_RESULT 0x0007 FLDP 有 读取文件传输的结果位图,包括数据文件和升级文件 + 读取传感器位图 UCMD_GET_SENSOR_BMP 0x0008 FLDP 有 读取传感器配置位图 + + 设置机器配置 UCMD_SET_MC_CONFIG 0x0101 VLDP 无 设置机器的配置,包括信号使用的端口等信息 + 设置机器状态 UCMD_SET_MC_STATUS 0x0102 FLDP 无 设置机器的工作状态,包括是否允许工作,清除报警等。 + 设置机器参数 UCMD_SET_MC_PARAS 0x0103 VLDP 无 传输机器参数列表到下位机 + 设置内存数据 UCMD_SET_MEM_DATA 0x0104 FLDP 无 改变某个内存单元的数据内容 + 设置文件参数 UCMD_SET_FILE_PARAS 0x0105 FLDP 无 设置文件参数 + 设置执行进度 UCMD_SET_EXEC_PROGRESS 0x0106 FLDP 无 设置文件执行进度 + 设置分期密码 UCMD_SET_INSTALLMENT 0x0107 FLDP 无 设置分期密码 + 设置经过的时间 UCMD_SET_ELAPSED_TIME 0x0108 FLDP 无 设置经过的时间 + 设置默认参数 UCMD_SET_DEF_PARA 0x0109 FLDP 无 设置默认参数 + + 手动控制命令 UCMD_ACT_BYHAND 0x0201 FLDP 无 手动控制电机转动,OUTPUT信号开关等动作 + 机器工作命令 UCMD_MC_WORK 0x0202 FLDP 无 控制机器的工作命令,包括启动,停止,结束,或运动到某个位置等 + 移动XY命令 UCMD_MOVE_TO 0x0203 FLDP 无 移动XY到坐标 + + 启动文件传输 UCMD_START_TRANS 0x0301 VLDP 无 启动文件传输 + 文件传输命令 UCMD_TRANS_FILE_DATA 0x0302 VLDP 无 传输文件数据包 + 设置文件列表 UCMD_SET_FILE_LIST 0x0304 VLDP 无 设置文件列表 + 获取文件列表 UCMD_GET_FILE_LIST 0x0305 FLDP 有 获取下位机文件列表 + + 下位机升级 UCMD_MC_UPDATE 0x0401 VLDP 无 包括升级主控,外围板控制器等 + + 2. 下位机发送命令 + + 名称 符号 代码 类型 回复 说明 + 发送机器信息 DCMD_SEND_MC_INFO 0x8001 VLDP 无 发送机器信息包括机器种类,配置,控制系统版本等信息 + 发送机器状态 DCMD_SEND_MC_STATUS 0x8002 VLDP 无 发送取机器的运行状态,包括机器工作状态,常用输入状态,电机位置,工作进度,文件信息等。 + 发送机器参数 DCMD_SEND_MC_PARAS 0x8003 VLDP 无 发送内存中机器参数列表 + 发送内存数据 DCMD_SEND_MEM_DATA 0x8004 VLDP 无 发送机器存储器数据,包括片内SRAM,片外SRAM,NAND FLASH等的内容 + 发送传感信号 DCMD_SEND_SENSORS 0x8005 VLDP 无 发送IO信号状态及电机位置,编码器位置等信息 + 发送文件信息 DCMD_SEND_FILE_INFO 0x8006 VLDP 无 发送数据文件的信息 + 发送传输结果 DCMD_SEND_TRANS_RESULT 0x8007 VLDP 无 发送文件传输的结果位图 + 发送传感器位图 DCMD_SEND_SENSOR_BMP 0x8008 VLDP 无 发送传感器配置位图 + 发送张力传感器值 DCMD_SEND_TENSION 0x8009 VLDP 无 发送张力传感器值 +*/ + +// 上位机发送命令 +#define UCMD_GET_MC_INFO 0x0001 // 读取机器信息 +#define UCMD_GET_MC_STATUS 0x0002 // 读取机器状态 +#define UCMD_GET_MC_PARAS 0x0003 // 读取机器参数 +#define UCMD_GET_SENSORS 0x0005 // 读取传感信号 +#define UCMD_GET_TRANS_RESULT 0x0007 // 读取传输结果 +#define UCMD_GET_SENSOR_BMP 0x0008 // 读取传感器位图 +#define UCMD_GET_TENSION_DAT 0x0009 // 读取张力数据 +#define UCMD_GET_LOT_DATA 0x000D // 读取物联网数据 +#define UCMD_SET_MC_CONFIG 0x0101 // 设置机器配置 +#define UCMD_SET_MC_STATUS 0x0102 // 设置机器状态 +#define UCMD_SET_MC_PARAS 0x0103 // 设置机器参数 +#define UCMD_SET_MEM_DATA 0x0104 // 设置内存数据 +#define UCMD_SET_FILE_PARAS 0x0105 // 设置文件参数 +#define UCMD_SET_EXEC_PROGRESS 0x0106 // 设置执行进度 +#define UCMD_SET_INSTALLMENT 0x0107 // 设置分期密码 +#define UCMD_SET_ELAPSED_TIME 0x0108 // 设置经过的时间 +#define UCMD_SET_DEF_PARA 0x0109 // 设置默认参数 +#define UCMD_ACT_BYHAND 0x0201 // 手动控制命令 +#define UCMD_MC_WORK 0x0202 // 机器工作命令 +#define UCMD_MOVE_TO 0x0203 // 移动XY到坐标 +#define UCMD_MOVE_OFST 0x0205 // XY移动偏移量 +#define UCMD_START_TRANS 0x0301 // 启动文件传输 +#define UCMD_TRANS_FILE_DATA 0x0302 // 文件传输命令 +//#define UCMD_TRANS_FILE_DATA 0x0303 // 文件失效命令 +#define UCMD_SET_FILE_LIST 0x0304 // 设置文件列表 +#define UCMD_GET_FILE_LIST 0x0305 // 获取下位机文件列表 +#define UCMD_MC_UPDATE 0x0401 // 下位机升级 + + +// 下位机发送命令 +#define DCMD_REQUEST_DAT 0x8000 // 请求文件数据 +#define DCMD_SEND_MC_INFO 0x8001 // 发送机器信息 +#define DCMD_SEND_MC_STATUS 0x8002 // 发送机器状态 +#define DCMD_SEND_MC_PARAS 0x8003 // 发送机器参数 + +#define DCMD_SEND_SENSORS 0x8005 // 发送传感信号 +#define DCMD_SEND_FILE_INFO 0x8006 // 发送文件信息 +#define DCMD_SEND_TRANS_RESULT 0x8007 // 发送传输结果 +#define DCMD_SEND_SENSOR_BMP 0x8008 // 发送传感器位图 +#define DCMD_SEND_DEBUG_INFO 0x8010 // 调试信息发送 +#define DCMD_SEND_LOTDATA 0x800D // 发送物联网数据 + + + +// 三、命令详解 +/* + 工作流程 + 1. 上位机发送 UCMD_GET_MC_INFO 命令, 命令格式如下: + + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + | 数据识别序列 | 数据内容 | 校验字 | + |-------------------|-----------------------------------------------------------------------|-----------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 B10 B11 B12 B13 | B14 B15 | + |-------------------|-------------------|-------------------|-------------------------------|-----------| + | 固定序列如下 | 数据包ID | 命令切换标志字 | 保留 | B4--B13的 | + | |-------------------|-------------------|-------------------------------| | + | 'F','L','D','P' | UCMD_GET_MC_INFO | 可能是随机数 | | 16位CRC | + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + + 2. 下位机收到后,回复 DCMD_SEND_MC_INFO 命令, 格式定义如下 + + |-----------------------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------|-----------|---------------| + | 数据识别序列 | 数据内容 | 校验字 | 附加数据 | + |-------------------------------------------------------------------------------------------|-----------|---------------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 | B12 B13 | B14 B15 | B16--Bn | + |-------------------------------------------------------------------------------------------|-----------|---------------| + | 固定序列如下 | | 附加 | 附加 | 和上位机命令 | | B4--B13的 | 机器信息结构 | + | | DCMD_SEND_MC_INFO | 数据 | 数据 | 相同的 | 保留 | | | + | 'V','L','D','P' | | 长度 | 校验字 | 命令切换标志字 | | 16位CRC | | + |-------------------------------------------------------------------------------------------|-----------|---------------| + |-----------------------------------------------------------------------------------------------------------------------| + + 3. 上位机收到下位机的回复命令后,通过比对 命令标志切换字 , 可以确认是否是刚刚发送命令的回复(对于连续发送命令有用),根据情况确定是否重新发送命令。 + + 注意: + 对于没有时序要求的数据包,可以不在意 命令标志切换字。 +*/ + +// 机器信息结构定义 +typedef struct +{ + // 0 + char mBoardVerStr[16]; // 主板(n1)板卡版本 + char exBoardVerStr[16]; // 扩展板(n1-1)板卡版本 + char softwareVerStr[64]; // 软件版本 + char buildInfoStr[32]; // 编译日期信息 + char boardId[32]; // 板卡ID + char installment[32]; // 最后一次的分期密码字符串 + // 192 + char rev1[512-192]; + + // 512 + u32 localIP; // 板卡IP地址 + u32 submask; // 子网掩码 + u32 gateIP; // 网关IP + + // 524 + u8 rev2[1024-524]; + + /* + // 0 + char mBoardVerStr[16]; // 主板(n1)板卡版本 + char exBoardVerStr[16]; // 扩展板(n1-1)板卡版本 + char softwareVerStr[32]; // 软件版本 + char buildInfoStr[32]; // 编译日期信息 + char boardId[32]; // 板卡ID + char installment[32]; // 最后一次的分期密码字符串 + // 176 + char rev1[512-160]; + + // 512 + u32 localIP; // 板卡IP地址 + u32 submask; // 子网掩码 + u32 gateIP; // 网关IP + + // 524 + u8 curN1Ver; //软件编译N1板卡版本 + // 525 + u8 rev2[1024-525]; + */ + +} __attribute__ ((packed)) MCInfo; + +typedef struct +{ + char debugInfoStr[1024]; // 调试信息 + +} __attribute__ ((packed)) DebugInfo; // 调试信息 + +typedef struct +{ + // 0 + char mBoardVerStr[16]; // 主板(n1)板卡版本 + + // 4 + char exBoardVerStr[16]; // 扩展板(n1-1)板卡版本 + + // 8 + char softwareVerStr[32]; // 软件版本 + + // 16 + char boardId[32]; // 板卡ID + + // 24 + char installment[32]; // 最后一次的分期密码字符串 + + // 32 + u32 rev10[32]; + + // 64 + u32 errorCode; // 报警信息 + s32 workableTimer; // 可工作时间计数器,剩余时间计数(分钟为单位) + u32 bootTimer; // 开机时间(单位分钟) + u32 workTimer; // 工作时间(单位分钟) + u32 workRpm; // 工作转速 + u32 curOutCounter; // 当前产量计数,由界面记录 + u32 totalOutCounter; // 累计产量计数 + u32 expectedOutput; // 产量预设 + + u32 spindleZeroSta; // 主轴零位状态 + // bit0:绣花主轴 + // bit1:冲孔主轴 + // bit2:缝纫主轴 + + u32 spindleAngle; // 主轴角度 + s32 motosPos[6]; // 电机坐标 + + // 80 + u32 sensorSignal[8]; // 传感器信号 + + // 88 + u32 machinecfg; //机器配置 + //勾线模式 bit0 0:单独勾线;1:集中勾线 + //锁头模式 bit1 0:电机锁头;1电磁铁锁头 + //89 + u32 sewHeadNumbers;//缝纫机头个数 + //90 + u32 embHeadNumbers; //绣花机头个数 + //91 + u32 embneedleNumbers;//绣花机针个数 + //92 + u32 punchHeadNumbers;//冲孔机头个数 + //93 + u32 punchneedleNumbers;//冲孔机针个数 + //94 + u32 sensonNumbers;//传感器信号总数 + + u32 rev20[128-95]; + + // 128 + u32 rev30[192-128]; + + //192 + u32 rev40[256-192]; + +} __attribute__ ((packed)) McLotData; // 主控物联网数据 + + +#define BOARD_VER_LEN 32 // 外围板程序版本长度 +#define MAX_SUPPORT_N5 48 +#define MAX_SUPPORT_N6 2 +#define MAX_SUPPORT_D86 1 + +#define PARA_NUM 256 + +//动框角度参数 +#define MAX_HOR 12 // 横,下标2最大值,针步 +#define MAX_VER 21 // 竖,下标1最大值,转速 + +typedef struct +{ + char softwareVerStr[BOARD_VER_LEN]; // 机头板程序版本 + u32 paraBuf[PARA_NUM]; //机头板参数 + u8 nodeType; // 节点类型 +}__attribute__ ((packed)) HeadInfo; + +typedef struct +{ + char softwareVerStr[BOARD_VER_LEN]; // 勾剪扣换控制板程序版本 + u32 paraBuf[PARA_NUM]; //换色板参数 +}__attribute__ ((packed)) HcpsInfo; + +typedef struct +{ + char softwareVerStr[BOARD_VER_LEN]; // D86程序版本 + u32 paraBuf[PARA_NUM]; //换色板参数 +}__attribute__ ((packed)) D86Info; + +typedef struct +{ + HeadInfo headInfo[MAX_SUPPORT_N5]; //最大支持32个机头 + HcpsInfo hcpsInfo[MAX_SUPPORT_N6]; //最大支持2个N6 + D86Info d86Info[MAX_SUPPORT_D86]; //1 + +}__attribute__ ((packed)) ExBoardInfo; + + +/* + 流程 + 1. 上位机发送命令 UCMD_SET_MC_CONFIG, 命令结构定义如下: + + |---------------------------------------------------------------------------------------------------------------| + |-----------------------------------------------------------------------------------|-----------|---------------| + | 数据识别序列 | 数据内容 | 校验字 | 附加数据 | + |-----------------------------------------------------------------------------------|-----------|---------------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 B12 B13 | B14 B15 | B16--Bn | + |-----------------------------------------------------------------------------------|-----------|---------------| + | 固定序列如下 | | 附加 | 附加数据 | | B4--B13的 | 机器信息结构 | + | | UCMD_SET_MC_CONFIG | 数据 | 校验字或 | 保留 | | | + | 'V','L','D','P' | | 长度 | 字段ID | | 16位CRC | | + |-----------------------------------------------------------------------------------|-----------|---------------| + |---------------------------------------------------------------------------------------------------------------| + + 附加数据结构定义和MCInfo相同。不过前面512字节是只读的信息,不能改变。 + + 2. 下位机收到命令后,设置相关配置。 + +*/ + +// 读取机器状态 +/* + 工作流程 + 1. 上位机发送 UCMD_GET_MC_STATUS 命令, 命令格式如下: + + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + | 数据识别序列 | 数据内容 | 校验字 | + |-------------------|-----------------------------------------------------------------------|-----------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 B10 B11 B12 B13 | B14 B15 | + |-------------------|---------------------|-----------------|-------------------------------|-----------| + | 固定序列如下 | 数据包ID | 命令切换标志字 | 保留 | B4--B13的 | + | |---------------------|-----------------|-------------------------------| | + | 'F','L','D','P' | UCMD_GET_MC_STATUS | 可能是随机数 | | 16位CRC | + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + + 2. 下位机收到后,回复 DCMD_SEND_MC_STATUS 命令, 格式定义如下 + + |-----------------------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------|-----------|---------------| + | 数据识别序列 | 数据内容 | 校验字 | 附加数据 | + |-------------------------------------------------------------------------------------------|-----------|---------------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 | B12 B13 | B14 B15 | B16--Bn | + |-------------------------------------------------------------------------------------------|-----------|---------------| + | 固定序列如下 | | 附加 | 附加 | 和上位机命令 | | B4--B13的 | 机器状态结构 | + | | DCMD_SEND_MC_STATUS | 数据 | 数据 | 相同的 | 保留 | | | + | 'V','L','D','P' | | 长度 | 校验字 | 命令切换标志字 | | 16位CRC | | + |-------------------------------------------------------------------------------------------|-----------|---------------| + |-----------------------------------------------------------------------------------------------------------------------| + + 3. 上位机收到下位机的回复命令后,通过比对 命令标志切换字 , 可以确认是否是刚刚发送命令的回复(对于连续发送命令有用),根据情况确定是否重新发送命令。 + + 注意: + 1. 对于没有时序要求的数据包,可以不在意 命令标志切换字。 + 2. 下位机会在状态发生变化的时候主动发送 DCMD_SEND_MC_STATUS 命令 + +*/ + +// 机器状态数据结构定义 +typedef struct +{ + // 0 + u32 workStatus; // 工作状态位图 + // .0 允许时限。=0,使用时限已到,不允许下位机工作;=1,允许下位机工作; + // .1 允许状态。=0,界面钳制,不允许下位机工作;=1,允许下位机工作; + // .2 机器状态。=0,手动工作状态; =1,自动工作状态 + // .3 钥匙状态。=0,关闭状态; =1,打开状态 + // .4 文件接收标志。= 0,初始状态。= 1,收到了文件 + // .5 参数接收标志。= 0,初始状态。= 1,收到了参数 + // .6 正在忙标志。= 0,空闲(可以接收文件和参数)。= 1,工作中(不会接收文件和参数) + // .7 上料状态。=0,手动上料状态; =1,自动上料状态 + // .8 参数更新标志。 =1,下位机更新了参数 + // .9 模拟工作标志。=1, 处于模拟工作状态 + // .10 允许扫描条码状态。=1, 允许 + // .11 允许拍照状态。=1, 允许 + // .12 正在工作标志 + // .13 传感信号扫描中标志 + // .14 相机校准模式中标志 + // .15 + // .16 + // .17 + // .18 + // .19 取模板框状态 + // .20 放模板框状态 + // .21 匹绣, 0:退出匹绣,主轴归零 1:进入匹绣,扎针,允许移框 + // .22 断线检测, 0:退出断线检测状态, 1:进入断线检测状态 + + // 1 + u32 errorCode; // 错误代码 + u32 fileIdx; // 文件序号 + u32 dataIdx; // 数据索引 + u32 runSpeed; // 运动速度 主轴转速 + u32 runAction; // 执行动作代码 * + u32 runSteps; // 当前执行步骤 * + u32 outCounter; // 产量计数 + + // 8 + s32 xPos; // x电机当前坐标 + s32 yPos; // y电机当前坐标 + s32 motosPos3; //轴3 + s32 motosPos4; //轴4 + s32 motosPos5; //轴5 + s32 motosPos6; //轴6 + + u32 traverseState; // 机头板遍历状态 + u32 workTimer; // 工作时长 + u32 showSta; // bit0是平绣ZP主轴是否在位,0是在位,1是不在位 + u32 UThreadBkSta; // 面线断线状态,每一位对应一个机头 + u32 DThreadBkSta; // 底线断线状态,每一位对应一个机头 + u32 tempdat2; // 自定义状态2 + + // 20 + s32 btrdPics; // 底线片数计数 + s32 btrdLength; // 底线长度计数 + + // 22 + u32 colorIdx; // 色序编码 + s32 needleIdx; // 针位号 + + // 24 + u32 potval; //电位器值 + u32 tempdat3; // 提升电机档位值或松紧线位置 + + // 26 + //u32 laserIntensity; // 激光强度 + u32 iterationsNum; // 反复绣,当前反复次数 + + // 27 + s32 workableTimer; // 可工作时间计数器(分钟) + + u32 needleNum; // 缝纫针数 + + u32 UThreadBkSta1[32-29]; + + //32 + s32 x2Pos; // x2电机当前坐标 + + u32 tempdat4[7]; + + u32 tempdat5[8]; + + u32 tempdat6[8]; + + u32 tempdat7[8]; + +} __attribute__ ((packed)) MCStatus; + + +//机器状态 +#define WORK_STA_ENTIME 0x00000001 // 允许时限 +#define WORK_STA_ENSTATE 0x00000002 // 允许状态 +#define WORK_STA_WKAUTO 0x00000004 // 工作状态,手动自动 +#define WORK_STA_KEYEN 0x00000008 // 钥匙开关状态 +#define WORK_STA_FILEOK 0x00000010 // 文件接收标志。= 0,初始状态。= 1,收到了文件 +#define WORK_STA_PARAOK 0x00000020 // 参数接收标志。= 0,初始状态。= 1,收到了参数 +#define WORK_STA_BUSY 0x00000040 // 正在忙标志。= 0,空闲(可以接收文件和参数)。= 1,忙中(不会接收文件和参数) +#define WORK_STA_FEED 0x00000080 // 上料状态。=0,手动上料状态; =1,自动上料状态 +#define WORK_STA_NEW_PARA 0x00000100 // 参数更新标志。 =1,下位机更新了参数。上位机需要读取下位机的参数文件并更新 +#define WORK_STA_SIMULATE 0x00000200 // 模拟工作标志。 =1,机器处于模拟工作 +#define WORK_STA_EN_SCAN 0x00000400 // 扫码允许。 =1,允许扫码状态 +#define WORK_STA_EN_PHOTO 0x00000800 // 拍照允许。 =1,允许拍照状态 +#define WORK_STA_WORKING 0x00001000 // 工作标志。= 1,工作中 + + +//通用错误 +#define ERR_NONE 0x0000 // 没有错误 +#define ERR_NO_POWER 0x0001 // 没有上电 +#define ERR_NO_AIR 0x0002 // 气压不足 +#define ERR_NOT_SAFE 0x0003 // 安全区域介入 +#define ERR_EXPIRATION 0x0004 // 使用时限已到 +#define ERR_DRIVER 0x0005 // 驱动器报警 +#define ERR_FILL_DATA 0x0006 // 填充数据错误 +#define ERR_NOT_ALLOWED 0x0007 // 不允许工作状态 +#define ERR_CTRL_ERR 0x0008 // 控制错误 +#define ERR_FPGA_ERR 0x0009 // 运动控制芯片版本错误 +#define ERR_BUTTON_NOUP 0x000A // 等待按钮抬起超时 +#define ERR_FPGA_RESET 0x000B // FPGA复位错误 +#define ERR_NO_READY 0x000C // 外设未就绪 +#define ERR_NO_SEND_ERR 0x000D // 传输数据错误 +#define ERR_EDTION_ERR 0x000E // 程序版本错误 +#define ERR_WORK_DONE 0x000F // 完成产量 +#define ERR_LMT_POSITIVE 0x0010 // 正向限位 +#define ERR_LMT_NEGATIVE 0x0011 // 反向限位 +#define ERR_RUN_ALM 0x0012 // 运动报警 +#define ERR_RUN_LIMIT 0x0013 // 运动限位 +#define ERR_RUN_EMS 0x0014 // 运动急停 +#define ERR_MV_PARA 0x0015 // 运动参数错误 +#define ERR_MC_PARA 0x0016 // 机器参数错误 +#define ERR_IN_PARA 0x0017 // 输入参数错误 +#define ERR_NOT_WORKSTA 0x001A // 不能工作状态 +#define ERR_NOT_MOVESTA 0x001B // 禁止移框状态 +#define ERR_MTZ_RIGHT 0x001F // 归零成功 +#define ERR_MTZ_ERROR 0x0020 // 归零错误 +#define ERR_COOR_SYSTM 0x0021 // 坐标系统错误 +#define ERR_OUT_RANGE 0x0022 // 目标位置越界 +#define ERR_X_LIT_POSI 0x0023 // X正向限位 +#define ERR_X_LIT_NEGA 0x0024 // X反向限位 +#define ERR_Y_LIT_POSI 0x0025 // Y正向限位 +#define ERR_Y_LIT_NEGA 0x0026 // Y反向限位 +#define ERR_ALM_WATERTANK 0x002A // 水箱报警 +#define ERR_ALM_COVEROPEN 0x002B // 开盖报警 +#define ERR_LIGHTCURTAINS1 0x002C // 光幕1介入 +#define ERR_LIGHTCURTAINS2 0x002D // 光幕2介入 +#define ERR_AIR_POWER 0x002E // 气压不足 +#define ERR_NO_DATA 0x0040 // 无数据 +#define ERR_DATA_ERROR 0x0041 // 数据错误 +#define ERR_GRAPH_OUT_RANGE 0x0042 // 图形超出范围 +#define ERR_MS_NOT_ZERO 0x0050 // 主轴不在零位 +#define ERR_HK_NOT_ZERO 0x0051 // 旋梭不在零位 +#define ERR_MS_NOT_SYNC 0x0052 // 针梭不同步 +#define ERR_RO_NOT_SYNC 0x0053 // 旋转不同步 +#define ERR_CUTTER_NOT_POS 0x0054 // 剪刀不在回位 +#define ERR_HEAD_NOT_HIGH 0x0055 // 机头不在高位 +#define ERR_HEAD_NOT_LOW 0x0056 // 机头不在低位 +#define ERR_LIGHTCURTAINS 0x0057 // 光幕介入 +#define ERR_UPER_TBREAK 0x0058 // 面线断线 +#define ERR_BOBBIN_TBREAK 0x0059 // 底线断线 +#define ERR_NEEDLE_NOT_HIGH 0x005A // 机针不在高位 +#define ERR_SEND_N1CMD_TIMOUT 0x005B // 发送主轴命令超时 +#define ERR_SEND_N1CMD_FAIL 0x005C // 发送主轴命令失败 +#define ERR_TRANS_TIMEOUT 0x005D // 执行命令超时 +#define ERR_NOT_AT_POS 0x005E // 模版不到位 +#define ERR_LIFT_TIMEOUT 0x005F // 机头升降超时 +#define ERR_YZR_NOT_SYNC 0x020B // Y向电机不同步 +#define ERR_HEAD_NOT_SAFE 0x0060 // 机头不在安全区域 +#define ERR_HD1_ND_NOT_ZERO 0x0061 // 机头1针不在零位 +#define ERR_HD1_CUTTER_NOT_POS 0x0071 // 机头1剪刀不在回位 +#define ERR_R_LIT_POSI 0x0081 // 旋转正向限位 +#define ERR_R_LIT_NEGA 0x0082 // 旋转反向限位 +#define ERR_XY_NOT_WP 0x0085 // XY不在工作位置 +#define ERR_HEAD_NOT_POS 0x0086 // 机头不到位 +#define ERR_TO_ZERO_TIMOUT 0x008E // 等待运动结束超时 +#define ERR_MOVE_POS_ERR 0x008F // 移动位置错误 +#define ERR_FOOT_POS 0x0093 // 压脚位置错误 +#define ERR_FOOT_OUT_RANGE 0x0094 // 压脚电机位置越界 +#define ERR_LIFT_OUT_RANGE 0x0095 // 机头升降位置越界 +#define ERR_ROT_OUT_RANGE 0x0096 // 旋转位置越界 +#define ERR_ROT_ECD_ERROR 0x0097 // 旋转编码器错误 +#define ERR_LIFT_ULIMIT 0x0098 // 机头升降上限位 +#define ERR_LIFT_DLIMIT 0x0099 // 机头升降下限位 +#define ERR_LIFT_SYNC_ERR 0x009A // 机头升降同步错误 +#define ERR_NOTIN_SAFE_AREA 0x009E // 机头不在安全区域 +#define ERR_LIFT_COOR_SYSTM 0x00CC // 升降电机坐标系统错误 +#define ERR_BUS_ERR 0x00AD // 总线错误 +#define ERR_CHANGE_BOBBIN 0x00F0 // 更换梭芯 +#define ERR_CHANGE_BOBBIN_A 0x00F1 // 更换梭芯A +#define ERR_CHANGE_BOBBIN_B 0x00F2 // 更换梭芯B +#define ERR_CHANGE_BOBBIN_STA 0x00F3 // 机器处于更换梭芯状态 +#define ERR_WORK_HEAD 0x00D6 // 工作机头错误 +#define ERR_CHANGE_SHUT 0x00D7 // 换梭异常 +#define ERR_ROT_COOR_SYSTM 0x00CB // 旋转电机坐标系统错误 + +#define ERR_FEEDPRESS_NOT_HIGH 0x0D20 // 进料压料不在高位 +#define ERR_FEEDPRESS_NOT_LOW 0x0D21 // 进料压料不在低位 +#define ERR_PULLPRESS_NOT_HIGH 0x0D22 // 拉料压料不在高位 +#define ERR_PULLPRESS_NOT_LOW 0x0D23 // 拉料压料不在低位 +#define ERR_CLAMPCLOTH_NOT_TIGHTEN 0x0D24 // 夹布不在拉紧位 +#define ERR_CLAMPCLOTH_NOT_LOOSEN 0x0D25 // 夹布不在放松位 +#define ERR_CLAMPCLOTH_NOT_OPEN 0x0D26 // 夹布不在打开位 +#define ERR_CLAMPCLOTH_NOT_CLOSE 0x0D27 // 夹布不在关闭位 +#define ERR_PEN_NOT_HIGH 0x0D28 // 画笔不在高位 +#define ERR_PEN_NOT_LOW 0x0D29 // 画笔不在低位 +#define ERR_UCUT_NOT_HIGH 0x0D2A // 上剪刀不在高位 +#define ERR_UCUT_NOT_LOW 0x0D2B // 上剪刀不在低位 +#define ERR_INSTALLMENT_OK 0x0300 // 密码设置成功 +#define ERR_INSTALLMENT_FAIL 0x0301 // 密码设置失败 + +#define ERR_CHB_SWAY 0x0219 // 换梭摆动装置 异常 +#define ERR_CHB_PUSH 0x021A // 换梭推动装置 异常 +#define ERR_CHB_SHUT 0x021C // 梭壳检测 异常 + +#define ERR_CHB_SPIN 0x0230 // 换梭旋转装置 异常 +#define ERR_CHB_DPUSH 0x0231 // 换梭扣线伸缩装置 异常 +#define ERR_WIRE_ALARM 0x00C9 // 扎线报警 +#define ERR_HEAD_NOT_SAFE 0x0060 // 机头不在安全区域 +#define ERR_MS_COOR_SYSTM 0x00CF // 主轴坐标系统错误 + +// 标准绗缝机型专用报警--------------------------------------------- +#define ERRQUI_NONE 0x00010000 // 没有错误 +#define ERRQUI_NO_POWER 0x00010001 // 没有上电 +#define ERRQUI_NO_AIR 0x00010002 // 气压不足 +#define ERRQUI_NOT_SAFE 0x00010003 // 安全区域介入 +#define ERRQUI_EXPIRATION 0x00010004 // 使用时限已到 +#define ERRQUI_DRIVER 0x00010005 // 驱动器报警 +#define ERRQUI_FILL_DATA 0x00010006 // 填充数据错误 +#define ERRQUI_NOT_ALLOWED 0x00010007 // 不允许工作状态 +#define ERRQUI_CTRL_ERR 0x00010008 // 控制错误 +#define ERRQUI_FPGA_ERR 0x00010009 // 运动控制芯片版本错误 +#define ERRQUI_BUTTON_NOUP 0x0001000A // 等待按钮抬起超时 +#define ERRQUI_FPGA_RESET 0x0001000B // FPGA复位错误 +#define ERRQUI_NO_READY 0x0001000C // 外设未就绪 +#define ERRQUI_NO_SEND_ERR 0x0001000D // 传输数据错误 +#define ERRQUI_EDTION_ERR 0x0001000E // 程序版本错误 +#define ERRQUI_WORK_DONE 0x0001000F // 完成产量 + +#define ERRQUI_LMT_POSITIVE 0x00010010 // 正向限位 +#define ERRQUI_LMT_NEGATIVE 0x00010011 // 反向限位 +#define ERRQUI_RUN_ALM 0x00010012 // 运动报警 +#define ERRQUI_RUN_LIMIT 0x00010013 // 运动限位 +#define ERRQUI_RUN_EMS 0x00010014 // 运动急停 +#define ERRQUI_MV_PARA 0x00010015 // 运动参数错误 +#define ERRQUI_MC_PARA 0x00010016 // 机器参数错误 +#define ERRQUI_IN_PARA 0x00010017 // 输入参数错误 +#define ERRQUI_CUTTER_NORMAL 0x00010018 // 文件正确 +#define ERRQUI_CUTTER_WAIT 0x00010019 // 等待文件 + + +#define ERRQUI_MTZ_RIGHT 0x0001001F // 归零成功 +#define ERRQUI_MTZ_ERROR 0x00010020 // 归零错误 +#define ERRQUI_COOR_SYSTM 0x00010021 // 坐标系统错误 +#define ERRQUI_OUT_RANGE 0x00010022 // 目标位置越界 +#define ERRQUI_X_LIT_POSI 0x00010023 // X正向限位 +#define ERRQUI_X_LIT_NEGA 0x00010024 // X反向限位 +#define ERRQUI_Y_LIT_POSI 0x00010025 // Y正向限位 +#define ERRQUI_Y_LIT_NEGA 0x00010026 // Y反向限位 + +#define ERRQUI_NO_DATA 0x00010040 // 无数据 +#define ERRQUI_DATA_ERROR 0x00010041 // 数据错误 +#define ERR_PEN_TIMEOUT 0x00010042 // 画笔升降超时 +#define ERR_PENHAT_TIMEOUT 0x00010043 // 画笔笔帽超时 + +#define ERRQUI_MS_NOT_ZERO 0x00010050 // 主轴不在零位 +#define ERRQUI_HK_NOT_ZERO 0x00010051 // 旋梭不在零位 +#define ERRQUI_MS_NOT_SYNC 0x00010052 // 针梭不同步 +#define ERRQUI_RO_NOT_SYNC 0x00010053 // 旋转不同步 +#define ERRQUI_CUTTER_NOT_POS 0x00010054 // 剪刀不在回位(注:该报错码是缝纫剪刀) +#define ERRQUI_HEAD_NOT_HIGH 0x00010055 // 机头不在高位 +#define ERRQUI_HEAD_NOT_LOW 0x00010056 // 机头不在低位 +#define ERRQUI_LIGHTCURTAINS 0x00010057 // 光幕介入 +#define ERRQUI_UPER_TBREAK 0x00010058 // 面线断线 +#define ERRQUI_BOBBIN_TBREAK 0x00010059 // 底线断线 +#define ERRQUI_UPER_TBREAK1 0x0001005A // 机头1面线断线 +#define ERRQUI_UPER_TBREAK2 0x0001005B // 机头2面线断线 +#define ERRQUI_LIFT_TIMEOUT 0x0001005F // 机头升降超时 +#define ERRQUI_CHANGE_BOBBIN 0x000100F0 // 更换梭芯 +#define ERRQUI_CHANGE_ERR 0x000100F1 // 换梭装置报警 +#define ERRQUI_CHANGE_SHUTDISK 0x000100F2 // 更换梭盘 +#define ERR_UPER_TBREAK_UP 0x000100F3 // 上排线断线 +#define ERR_UPER_TBREAK_DW 0x000100F4 // 下排线断线 +#define ERR_PRODUCTION_LINE 0x000100F5 // 产线报警 + +#define ERRQUI_FEED_ROLLER 0x00010200 // 进料压辊 异常 +#define ERRQUI_DIS_ROLLER 0x00010201 // 出料压辊 异常 +#define ERRQUI_DIS_MATERIAL 0x00010202 // 出料压料 异常 +#define ERRQUI_TENS_DEVICE 0x00010203 // 张紧装置 异常 +#define ERRQUI_CLOTH_DEVICE 0x00010204 // 夹布装置 异常 +#define ERRQUI_EDGE_MOTOR 0x00010205 // 边切电机 阻塞 +#define ERRQUI_CROSS_MOTOR 0x00010206 // 横切电机 异常 + +#define ERR_BEDSEET_ERR1 0x00010221 // 裁切超声波升降气缸 +#define ERR_BEDSEET_ERR2 0x00010222 // 裁切切刀升降气缸 +#define ERR_BEDSEET_ERR3 0x00010223 // 裁切顶出气缸 +#define ERR_BEDSEET_ERR4 0x00010224 // 裁切前夹料气缸 +#define ERR_BEDSEET_ERR5 0x00010225 // 裁切后上夹料气缸 +#define ERR_BEDSEET_ERR6 0x00010226 // 裁切后下夹料气缸 +#define ERR_BEDSEET_ERR7 0x00010227 // 裁切夹爪 +#define ERR_BEDSEET_ERR8 0x00010228 // 拉料电机位置异常 +#define ERR_BEDSEET_ERR9 0x00010229 // 横切电机位置异常 +#define ERR_BEDSEET_ERRA 0x0001022A // 储料停止 +#define ERR_BEDSEET_ERRB 0x0001022B // 右边缝断线 +#define ERR_BEDSEET_ERRC 0x0001022C // 左边缝断线 +#define ERR_BEDSEET_ERRD 0x0001022D // 更换梭芯 +#define ERR_BEDSEET_ERRE 0x0001022E // 未满足拉料条件 +#define ERR_BEDSEET_ERRF 0x0001022F // 物料输送超时 +#define ERR_BEDSEET_ERR10 0x00010230 // 物料未取走 +#define ERR_BEDSEET_ERR11 0x00010231 // 送料限位 +#define ERR_BEDSEET_ERR12 0x00010232 // 机头缺料 + +#define ERRQUI_INSTALLMENT_OK 0x00010300 // 密码设置成功 +#define ERRQUI_INSTALLMENT_FAIL 0x00010301 // 密码设置失败 + +#define ERRQUI_MOTO_N_ALM 0x00011001 // 针电机报警 +#define ERRQUI_MOTO_H_ALM 0x00011002 // 梭电机报警 +#define ERRQUI_MOTO_X_ALM 0x00011003 // X电机报警 +#define ERRQUI_MOTO_Y_ALM 0x00011004 // Y电机报警 +#define ERRQUI_MOTO_U_ALM 0x00011005 // U电机报警 + +#define ERRQUI_MOTO_N_FZ 0x00011011 // 针电机归零失败 +#define ERRQUI_MOTO_H_FZ 0x00011012 // 梭电机归零失败 +#define ERRQUI_MOTO_X_FZ 0x00011013 // X电机归零失败 +#define ERRQUI_MOTO_Y_FZ 0x00011014 // Y电机归零失败 +#define ERRQUI_MOTO_U_ALM 0x00011005 // 升降电机报警 + +#define ERRQUI_CS_TIMEOUT 0x00012000 // 从板通讯超时 +#define ERRQUI_MOTO_X_ZERO 0x00012001 // X电机不在零位 +// ---------------------------------------------标准绗缝机型专用报警 + +// 设置机器状态 +/* + 工作流程 + 1. 上位机发送命令 UCMD_SET_MC_STATUS, 命令结构定义如下: + + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + | 数据识别序列 | 数据内容 | 校验字 | + |-------------------|-----------------------------------------------------------------------|-----------| + | B0 B1 B2 B3 | B4 B5 | B6 B7 | B8 B9 | B10 B11 B12 B13 | B14 B15 | + |-------------------|--------------------|------------------|-----------|-------------------|-----------| + | 固定序列如下 | 数据包ID | 状态码 | 参数 | 保留 | B4--B13的 | + | |--------------------|------------------|-----------|-------------------| | + | 'F','L','D','P' | UCMD_SET_MC_STATUS | | | | 16位CRC | + |-------------------------------------------------------------------------------------------------------| + |-------------------------------------------------------------------------------------------------------| + + + 2. 下位机收到命令后,根据状态码设置相关状态。 + +*/ + +// 状态码定义如下-设置 +#define MC_STA_CLENA_ERR 0x0000 // 清除错误 +#define MC_STA_EN_WORK 0x0001 // 允许工作(状态) +#define MC_STA_DIS_WORK 0x0002 // 禁止工作(状态) +#define MC_STA_EN_TIME 0x0003 // 允许工作(时间) +#define MC_STA_DIS_TIME 0x0004 // 禁止工作(时间) +#define MC_CLEAN_COUNT 0x0005 // 产量计数清零 +#define MC_STA_MANUAL 0x0006 // 手动工作状态 +#define MC_STA_AUTO 0x0007 // 自动工作状态 +#define MC_FILE_SWITCH 0x0008 // 文件切换 +#define MC_INVALID_FILE 0x0009 // 文件失效命令 +#define MC_CLEAN_PARA_REF 0x000A // 清除刷新参数标志 +#define MC_SET_TO_NORMAL 0x000B // 设置为正常工作状态 +#define MC_SET_TO_SIMULATE 0x000C // 设置为模拟工作状态 +#define MC_SET_ERR_STA 0x000D // 设置为错误状态(报错) +#define MC_SEL_WORK_HEADS 0x000E // 设置工作机头 +#define MC_CLEAN_FIDX 0x000F // 索引复位 +#define MC_CLEAN_BOBBIN 0x0010 // 底线计数复位 +#define MC_SET_ENTRY_SCAN_SENSOR 0x0011 // 设置为 进入 扫描传感器状态 +#define MC_SET_EXIT_SCAN_SENSOR 0x0012 // 设置为 退出 扫描传感器状态 +#define MC_SET_ENTER_TEST_OUTPUT 0x0013 // 设置为 进入 测试输出状态 +#define MC_SET_EXIT_TEST_OUTPUT 0x0014 // 设置为 退出 测试输出状态 +#define MC_STA_EXIT_THREADBK 0x0024 // 退出断线测试 +#define STA_NORMAL_STOP 0x0100 // 正常停止 +#define STA_MTZ_SUCCESS 0x0101 // 归零成功 +#define STA_WORK_PAUSE 0x0102 // 工作暂停 +#define STA_WORK_OVER 0x0103 // 工作结束 +#define STA_WORK_FINISH 0x0104 // 工作完成 +#define STA_WORK_DONE 0x0105 // 完成产量 +#define STA_EXEC_SUCCESS 0x0106 // 执行成功 +#define STA_EXEC_FAILED 0x0107 // 执行失败 +#define STA_WAIT_FILE 0x0108 // 等待文件 +#define STA_CHANGE_BOBBIN 0x0109 // 更换梭芯 +#define STA_PROCESS_FINISH 0x010A // 执行完成 +#define STA_PROCESS_RUNNING 0x010B // 执行过程中 +#define STA_LINE_TBREAK 0x0152 // 断线停止 + + +typedef struct +{ + u32 buf[PARA_NUM]; +} __attribute__ ((packed)) ParaStruct; + + + +// 参数类型定义 +#define SEW_MCPARA_MACH 0 // 缝纫机器参数 +#define SEW_MCPARA_WORK 1 // 缝纫工作参数 +#define SEW_MCPARA_DEF_MC 2 // 出厂默认机器配置参数(读取有效) +#define SEW_MCPARA_DEF_WK 3 // 出厂默认机器工作参数(读取有效) +#define SEW_REVMCPARA_MACH 0x07 // 预留机器配置参数 +#define SEW_REVMCPARA_WORK 0x08 // 预留机器工作参数 + +//平板机 +#define DCMD_SEND_MOTO_GAINPARA 0x10 // 电机增益参数(xy) +//五头机 +#define SEW_MCPARA_EX1 0x20 // 机器扩展参数1 +#define SEW_MCPARA_EX2 0x21 // 机器扩展参数2 + +// 缝纫机器参数 +typedef struct +{ +// 0 + u32 machineType; // 机器类型 + u32 productType; // 产品类型 + u32 headNumbers; // 机头个数 + u32 needleNumbers; // 每头机针个数 +// 4 + u32 rev0[10-0]; + +// 10 + u32 xConfig; // x配置 + u32 yConfig; // y配置 + u32 x2Config; // x2配置 + u32 y2Config; // y2配置 + + // config.0, = 0, 无该轴; = 1, 有该轴; + // config.1, = 0, 单电机驱动; = 1, 双电机驱动; + // config.2, = 0, 坐标系统为正; = 1, 坐标系统为反; + // config.3, = 0, 移动对象为机头 = 1, 移动对象为框; + // config.4, = 0, 没有零位传感器; = 1, 有零位传感器; + // config.5, = 0, 没有降速传感器; = 1, 有降速传感器; + // config.6, = 0, 没有正向限位传感器; = 1, 有正向限位传感器; + // config.7, = 0, 没有负向限位传感器; = 1, 有负向限位传感器; + // config.8, = 0, 向负方向找零位传感器; = 1, 向正方向找零位传感器; + // config.9, = 0, 零位单独起作用; = 1, 零位和降速一起起作用; + + u32 mConfig; // 缝纫主轴配置 + // config.0, = 0, 无该轴; = 1, 有该轴; + // config.1, = 0, 针梭一体; = 1, 针梭分离(双电机); + + u32 uConfig; // 升降电机配置 + // config.0, = 0, 无该轴; = 1, 有该轴; + + u32 fConfig; // 压脚电机配置 + // config.0, = 0, 无该轴; = 1, 有该轴; + + u32 rConfig; // 旋转电机配置 + // config.0, = 0, 无该轴; = 1, 有该轴; + // config.1, = 0, 单电机驱动; = 1, 双电机驱动; + // config.2, = 0, 坐标系统为正; = 1, 坐标系统为反; + // config.3, = 0, 转动对象为机头 = 1, 转动对象为框; + // config.4, = 0, 无旋转范围限制 = 1, 有旋转范围限制; +// 18 + u32 cutDTrdDev; // 下剪刀驱动装置选择, 0, 无下剪线装置; 1, 气缸; 2, 交流电机; 3, 步进电机; 4, 电磁铁 + u32 cutDTrdMode; // 下剪线模式选择, 0, 静态剪线; 1, 动态剪线; 2, 凸轮剪线; 3, 凸轮分别剪线 + u32 cutUTrdDev; // 上剪刀驱动装置选择, 0, 无上剪线装置; 1, 气缸; +// 21 + u32 utbdDev; // 面线断线检测装置选择; 0, 无装置; 1, 挑线簧; 2, 电子断线器; + u32 dtbdDev; // 底线断线检测装置选择; 0, 无装置, 1, 光栅轮; 2, 磁编码器; + u32 tbdMode; // 断线检测模式选择; 0, 直接检测; 1, 外围板检测; +// 24 + u32 hookTrdDev; // 勾面线装置选择, 0, 无勾面线装置; 1, 气缸; 2, 电磁铁 + u32 looseTrdDev; // 松面线装置选择, 0, 无松线装置; 1, 气缸; 2, 电磁铁 + u32 pullTrdDev; // 拉面线装置选择, 0, 无拉面线装置; 1, 气缸; + u32 pushTrdDev; // 扣底线装置选择, 0, 无扣底线装置; 1, 气缸; 2, 电磁铁 + u32 looseTrdDev2; // 第二松面线装置选择, 0, 无松线装置; 1, 气缸; 2, 电磁铁 + u32 templateId; // 模版识别装置, 0, 无识别装置; 1, 条形码; 2, 编码孔 + +// 30 + u32 hookFaceTo; // 旋梭面对方向, 0, 向前; 1, 向左; 2, 向右; 3, 向上 +// 31 + u32 templateDect; // 模版检测装置, 0, 无检测装置; 1, 检测 + u32 rev1[50-32]; + +// 50 + // 位置,尺寸 + s32 xSensorPos; // X框传感器坐标,单位 0.01mm + s32 ySensorPos; // Y框传感器坐标,单位 0.01mm + s32 mStopAng; // 主轴停车传感器角度,单位 0.01度 + s32 uSensorPos; // 升降传感器坐标,单位 0.01mm + s32 fSensorPos; // 压脚传感器坐标,单位 0.01mm + s32 rSensorAng; // 旋转传感器角度,单位 0.01度 +// 56 + s32 mHkSensorAng; // 主轴勾线传感器角度,单位 0.01度 +// 57 + s32 pStopAng; // 冲头停车角度,单位 0.01度 +// 58 + s32 cStopAng; // 裁刀主轴停车角度 +// 59 + s32 x2SensorPos; // X2框传感器坐标,单位 0.01mm + s32 y2SensorPos; // Y2框传感器坐标,单位 0.01mm + s32 plSensorPos; // 拉料电机传感器坐标,单位 0.01mm +// 62 + s32 mJogSensorAng; // 主轴点动停车角度,单位 0.01度 + s32 emStopAng; // 平绣主轴停车角度,单位 0.01度 + +// 64 + u32 rev2[70-64]; + +// 70 + s32 xNegaBorder; // x可移动区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + s32 xPosiBorder; // x可移动区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + s32 yNegaBorder; // y可移动区域负边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + s32 yPosiBorder; // y可移动区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + +// 74 + s32 headudUper; // 机头升降可移动上边界,单位0.01mm + s32 headudLower; // 机头升降可移动下边界,单位0.01mm + +// 76 + s32 footudUper; // 压脚升降可移动上边界,单位0.01mm + s32 footudLower; // 压脚升降可移动下边界,单位0.01mm + u32 fppmmNumerator; // 电机压脚脉冲当量分子 + u32 fppmmDenominator; // 电机压脚脉冲当量分母 + +// 80 + s32 rLimitAnglePosi; // 旋转范围正向限制角度,单位 0.01度 + s32 rLimitAngleNega; // 旋转范围正向限制角度,单位 0.01度 + +// 82 + s32 punchOffsetX; // 冲孔机头偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 punchOffsetY; // 冲孔机头偏移Y, 范围 -2147483648--2147483647,单位0.01mm + s32 sewingAreaXN; // x可缝纫区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + s32 sewingAreaXP; // x可缝纫区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + s32 sewingAreaYN; // y可缝纫区域负边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + s32 sewingAreaYP; // y可缝纫区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + s32 punchAreaXN; // x可冲孔区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + s32 punchAreaXP; // x可冲孔区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + s32 punchAreaYN; // y可冲孔区域负边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + s32 punchAreaYP; // y可冲孔区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + + s32 sewingROffsetX; // 缝纫右机头偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 sewingROffsetY; // 缝纫右机头偏移Y, 范围 -2147483648--2147483647,单位0.01mm + + s32 cutterOffsetX; // 切刀机头偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 cutterOffsetY; // 切刀机头偏移Y, 范围 -2147483648--2147483647,单位0.01mm + + s32 cuttingAreaXN; // x可裁切区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + s32 cuttingAreaXP; // x可裁切区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + s32 cuttingAreaYN; // y可裁切区域负边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + s32 cuttingAreaYP; // y可裁切区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + +// u32 rev3[100-100]; + +// 100 + // 速度参数 + u32 xymvstspSpd; // xy启动停止速度, 范围 1--100,单位mm/s,默认 10 + u32 xymvzSpd; // xy归零运行速度, 范围 1--100,单位mm/s,默认 100 + u32 xymvlSpd; // xy空走运行速度, 范围 1--1000,单位mm/s,默认 300 + u32 xymvSAdd; // xy行走加速度, 范围 1--10000,单位mm/s2,默认 1000 + u32 xymvbrkAdd; // xy刹车加速度 1--10000,单位mm/s2,默认 10000 + u32 xymvhSpd1; // xy手动移动速度1, 范围 1--1000,单位mm/s,默认 10 + u32 xymvhSpd2; // xy手动移动速度2, 范围 1--1000,单位mm/s,默认 100 + u32 xymvhSpd3; // xy手动移动速度3, 范围 1--1000,单位mm/s,默认 300 + u32 xymaxSpd; // xy最高移动速度, 范围 1--1000,单位mm/s,默认 300 + +// 109 + u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + u32 mstzRpm; // 主轴归零转速, 范围 1--3000,单位r/min,默认 120 + u32 msrunRpm; // 主轴运转转速, 范围 1--3000,单位r/min,默认 300 + u32 msrAddRpss; // 主轴运转加速度, 范围 1--100,单位r/ss,默认 50 + u32 msrbrkAdd; // 主轴刹车加速度, 范围 1--100,单位r/ss,默认 100 + u32 msHightRpm; // 主轴缝纫最高转速, 范围 1--3000,单位r/min,默认 3000 + +// 115 + u32 ustspSpd; // 机头升降起停速度, 范围 1--250,单位mm/s,默认 10 + u32 umvtzSpd; // 机头升降归零速度, 范围 1--250,单位mm/s,默认 50 + u32 umoveSpd; // 机头升降行走速度, 范围 1--250,单位mm/s,默认 200 + u32 uliftAdd; // 机头升降行走加速度, 1--10000,单位mm/s2,默认 500 + u32 uBrkAdd; // 机头升降刹车加速度, 1--10000,单位mm/s2,默认 1000 + +// 120 + u32 fstspSpd; // 压脚升降起停速度, 范围 1--100,单位mm/s,默认 10 + u32 fmvtzSpd; // 压脚升降归零速度, 范围 1--100,单位mm/s,默认 30 + u32 fmoveSpd; // 压脚升降行走速度, 范围 1--100,单位mm/s,默认 100 + u32 fliftAdd; // 压脚升降行走加速度, 1--10000,单位mm/s2,默认 500 + u32 fBrkAdd; // 压脚升降刹车加速度, 1--10000,单位mm/s2,默认 1000 + +// 125 + u32 rotstspDps; // 机头旋转启动停止速度, 范围 1--720, 单位 deg/s(度/秒),默认 10 + u32 rottzDps; // 机头旋转归零速度, 1--720, 单位 deg/s(度/秒),默认 50 + u32 rotrunDps; // 机头旋转运转速度, 范围 1--720, 单位 deg/s(度/秒),默认 360 + u32 rotAddDpss; // 机头旋转运动加速度, 范围 1--10000, 单位 deg/s(度/秒方),默认 500 + u32 rotBrkDpss; // 机头旋转刹车加速度, 范围 1--10000, 单位 deg/s(度/秒方),默认 5000 + u32 rotmaxDps; // 机头旋转最高速度, 范围 1--720,单位 deg/s,默认 720 + +// 131 + u32 minDrawSpd; // 最小画笔绘画速度, 范围 1--100,单位mm/s,默认 10 + u32 maxDrawSpd; // 最大画笔绘画速度, 范围 1--1200,单位mm/s,默认 1000 + u32 drawAdd; // 画笔绘画加速度, 范围 1--4000,单位mm/s2,默认 500 + u32 drawSlowAngle; // 画笔绘画降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + +// 135 + u32 rev4[150-135]; + +// 150 + s32 embOffsetX; // 平绣机头偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 embOffsetY; // 平绣机头偏移Y, 范围 -2147483648--2147483647,单位0.01mm + s32 embAreaXN; // 平绣x可绣花区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + s32 embAreaXP; // 平绣x可绣花区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + s32 embAreaYN; // 平绣y可绣花区域负边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + s32 embAreaYP; // 平绣y可绣花区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + // 156 + u32 rev5[200-156]; + +// 200 + s32 penOffsetX; // 画笔偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 penOffsetY; // 画笔偏移Y, 范围 -2147483648--2147483647,单位0.01mm + s32 PressOffsetX; // 压枣偏移X, 范围 -2147483648--2147483647,单位0.01mm + s32 PressOffsetY; // 压枣偏移Y, 范围 -2147483648--2147483647,单位0.01mm + +// 204 + u32 EncoderMolecule; // 编码器系数分子, 范围 1--100000,单位 无 + u32 EncoderDeno; // 编码器系数分母, 范围 1--100000,单位 无 + u32 ZeroCutDistance; // 零切距离, 范围 1--500000,单位 0.01mm + u32 FeedClothDev; // 进料装置选择, 0, 无进料装置; 1, 有进料装置 + u32 CrossCutDev; // 横切装置选择, 0, 无横切装置; 1, 有横切装置 + u32 ClipClothDev; // 夹布装置选择, 0, 无夹布装置; 1, 有夹布装置 + u32 TensionDev; // 张紧装置选择, 0, 无张紧装置; 1, 有张紧装置 + u32 SideCutDev; // 边切装置选择, 0, 无边切装置; 1, 有边切装置 + +// 212 + u32 rev6[256-212]; + +} __attribute__ ((packed)) SewingMcPara; + + + +// 缝纫工作参数 +typedef struct +{ +// 0 + u32 msWorkRpm; // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认 2000 + u32 mscutRpm; // 主轴剪线转速, 范围 1--500,单位r/min,默认 120 + u32 msRevRpm; // 主轴回针转速, 范围 1--500,单位r/min,默认 200 + u32 msStSlowRpm; // 主轴启动慢动转速, 范围 1--500,单位r/min,默认 200 + u32 msBackEquRpm; // 倒车等效主轴转速,, 范围 1--3000,单位r/min,默认 1000 +// 5 + u32 sewMoveType; // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; + // bit2 = 0, 机头连续旋转; bit2 = 1, 机头间歇式旋转; + // bit3 = 0, 机头间歇式脉冲无加减速; bit3 = 1, 间歇式脉冲正弦加减速; + u32 sewMoveStAng; // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + u32 sewMoveCtnAng;// 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 +// 8 + u32 stSlowNum; // 起针慢动针数, 0--10,单位 针, ,默认 3 + u32 actionWhenStart; // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; bit0, 松线允许; bit1, 顶线允许; bit2, 夹线允许; + +// 10 + u32 cutTrdEn; // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 数据剪线 ,默认1 + u32 cutTrdDivAngle; // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 + u32 cutTrdEndAngle; // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 + u32 actionWhenCut; // 剪线时动作允许, 位图选择, bit0, 松线允许; bit1, 拉线允许; bit2, 夹线允许; + +// 14 + u32 tbdNumber; // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数,默认3 + u32 tbdAngle; // 断线检测主轴角度,0--36000, 单位 0.01度,默认 3000 + +// 16 + u32 changeBobbinMode; // 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + u32 changeBobbinLength; // 底线长度, 单位 0.01mm,默认 10000000 + u32 cblenFixed; // 每针底线修正量, 单位 0.01mm,默认 0 + u32 changeBobbinNums; // 换梭片数计数, 单位 次,默认 0 + +// 20 + u32 oilMode; // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 + u32 addOilGapStitch; // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 + u32 addOilGapTime; // 加油时间间隔, 单位秒, 加油方式为按工作时间加油时有用; + u32 addOilTime; // 加油持续时长, 单位秒, + +// 24 + u32 finishStopSel; // 完成后停车位置选择, 0, 当前位置; 1,起点,2,定位点,3,上料点; 4,偏移点 + +// 25 + u32 offsetEn; // 偏移点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 + s32 offsetX; + s32 offsetY; // 偏移点坐标 +// 28 + u32 fixPosEn; // 穿线点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 + s32 fixPosX; + s32 fixPosY; // 穿线点坐标 +// 31 + s32 headLowPos; // 机头升降低位高度 + s32 headHighPos; // 机头升降高位高度 + +// 33 + u32 expectedOutput; // 产量预设 +// 34 + u32 lightingBrightness; // 照明亮度,0--255; 默认128 +// 35 + u32 delayAfterFrameClose; // 气框关闭后延时, 0--2000, 单位ms, 默认500 +// 36 + u32 msAddRpss; // 缝纫加速度, 1--100, 单位r/ss , 默认5 +// 37 + u32 cutXYMovement; // 剪线动框位移, 1--1000, 单位0.01mm, 默认500 +// 38 + u32 sewingBlowEn; // 缝纫吹气允许, 0, 不允许; 1, 允许 + u32 punchBlowEn; // 冲孔吹气允许, 0, 不允许; 1, 允许 + u32 cleanerCloseDelay; // 吸尘器关闭延时,单位秒 +// 41 + u32 pmWorkRpm; // 冲孔主轴工作转速, 范围 1--3000,单位r/min,默认 2000 + u32 pmAddRpss; // 冲孔加速度, 1--100, 单位r/ss , 默认20 + + u32 pmMoveType; // 冲孔动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; + u32 pmMoveStAng; // 冲孔动框起始角度, 0--36000, 单位 0.01度,默认 24000 + u32 pmMoveCtnAng; // 冲孔动框持续角度, 0--36000, 单位 0.01度,默认 15000 + +// 46 + u32 liftHeadWhenSewing; // 缝纫间越框机头升降, 0, 不允许; 1, 允许 + u32 liftHeadWhenPunch; // 冲孔间越框机头升降, 0, 不允许; 1, 允许 +// 48 + u32 actionWhenMove; // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; bit0, 松线允许; bit2, 夹线允许; +// 49 + u32 softwareLimit; // 软件限位; 位图选择, 0, 不允许; 1, 允许; bit0, xy移动; bit1, 缝纫头升降限制; bit2, 冲孔头升降限制; bit3, 裁刀机头升降限制 + +// 50 + s32 changeBobbinAng; // 换梭旋转机头角度, 0--36000, 单位 0.01度,默认 18000 + u32 rotMoveCtnAng; // 旋转持续角度, 0--36000, 单z位 0.01度,默认 36000 +// 52 + u32 hookThreadNum; // 面线勾线针数,1--5,单位 针,默认1 + u32 sewFootHeight; // 缝纫工作时压脚高度,单位 0.01mm + u32 simuHeadHeight; // 模拟工作时机头高度,单位 0.01mm +// 55 + u32 cutterWorkRpm; // 切刀工作转速, 范围 1--3000,单位r/min,默认 1200 + u32 cutterAddRpss; // 切刀加速度, 1--100, 单位r/ss , 默认20 + +// 57 + u32 cutMoveDir; // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + +// 58 + u32 pressKnotHigh; // 压枣升降行程,单位 0.01mm + +// 59 + u32 msCornerRpm; // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + u32 slowAngle; // 降速最小偏差角度,单位度,范围0--180,默认 180 + +// 61 + u32 rev2[100-61]; +// 100 + u32 workHeadSel; // 工作机头选择,位图选择,共支持32个机头; 0, 不允许工作; 1, 允许工作; bit0 第一个机头, bit1, 第二个机头...... + u32 safetyEn; // 安全输入允许,位图选择,0, 不允许; 1, 允许; bit0 光幕; bit1, 气压; bit2 上电信号 + u32 autoFrameEn; // 自动气框允许,0, 不允许; 1, 允许; + u32 autoFrameDelay; // 自动气框闭合延时,单位ms + u32 sewoffsetAsCmd; // 线迹偏移功能,0, 不允许; 1, 允许; + u32 autoworkstart; // 循环工作功能,0, 不允许; 1, 允许; + u32 workHeadSelR; // 右工作机头选择,位图选择,共支持32个机头; 0, 不允许工作; 1, 允许工作; bit0 第一个机头, bit1, 第二个机头...... + u32 PullingPos; // 拉料电机拉料位置,单位 0.01mm + u32 pullingLength; // 拉料长度,单位 0.01mm + u32 cuttingLength; // 裁切长度,单位 0.01mm + +// 110 + u32 addOilHookTime; // 梭加油持续时长, 单位秒, (针梭独立加油时有效) + u32 clampingForce1; // 夹线力度1: 0~100 % + u32 clampingForce2; // 夹线力度2: 0~100 % + u32 clampingForce3; // 夹线力度3: 0~100 % + u32 clampingForce4; // 夹线力度4: 0~100 % + +// 115 + u32 emWorkRpm; // 平绣主轴工作转速, 范围 1--3000,单位r/min,默认 1000 + u32 emAddRpss; // 平绣加速度, 1--100, 单位r/ss , 默认5 + + u32 emMoveType; // 平绣动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; + u32 emMoveStAng; // 平绣动框起始角度, 0--36000, 单位 0.01度,默认 24000 + u32 emMoveCtnAng; // 平绣动框持续角度, 0--36000, 单位 0.01度,默认 20000 +// 120 + u32 rev3[150-120]; + +// 150 + u32 rev4[200-150]; +// 200 + u32 rev5[256-200]; + +} __attribute__ ((packed)) SewingWkPara; + + +//回复的定义 +#define REV_TYPE_ONCE 0 // 单次回复;下位机收到命令后发送一次回复数据 +#define REV_TYPE_BEGIN 1 // 多次回复;下位机收到命令后,会主动开始发送回复数据,直到被其他命令打断。 + + +// 传感信号位定义,传感器信号位图和传感器信号的位定义相同 +typedef struct +{ +// 0 + u8 bitmap[1024]; + +} __attribute__ ((packed)) SensorsBitmap; + + +// 传输文件类型 +#define FILE_TYPE_DAT 0x00 // 数据文件 +#define FILE_TYPE_PGM 0x02 // 升级文件 + + +// 文件传输控制结构 +#define LEN_RSV_BMP MAX_EXDP_LEN // 位图大小 +#define MAX_FILE_SIZE (LEN_RSV_BMP*MAX_EXDP_LEN*16) // 最大文件字节数 按位图大小设定 + +typedef struct +{ + int transphase; + int filetransing; + int waitcount; + + u8 transActive; // 传输结构有效 + u8 transflag; // 接收进度标志 = 0, 接收未开始; = 1, 正在接收; = 2,接收完成。 + u8 fileType; // 文件类型 + u8 fileIdx; // 为文件编号,最多支持16个文件 + u16 fileId; // 文件ID + u16 packetSize; // 包的大小 + u32 packetNum; // 包的个数 + + DataDs16FileHead * pFileHead; + AppFileHead * pAppHead; + + u8 * pDatBuff; + + u16 lenBmp; // 位图有效长度 + u8 rsvBitmap[LEN_RSV_BMP]; // 文件接收进度标志位图 + +}FileTransCtrl; + +// 传输有效标志定义 +#define TRANS_NONE 0x00 // 无效 +#define TRANS_ACTIVE 0x5A // 有效 + +// 传输结果代码定义 +#define TRANS_NOT_BEG 0x00 // 没有收到启动命令 +#define TRANS_READY 0x01 // 准备好接收 +#define TRANS_DOING 0x02 // 正在接收 +#define TRANS_DONE 0x03 // 接收完成 +#define TRANS_REQUEST 0x04 // 请求传输模式 + +// 控制动作定义 +#define MOTO_TO_ZERO 0x0001 // 电机归零(辅助调试的功能,无安全保护和逻辑关系) +#define MOVE_BY_HAND 0x0002 // 电机手动移动(辅助调试的功能,无安全保护和逻辑关系) +#define OUTPUT_CTRL 0x0003 // 输出控制(辅助调试的功能,无安全保护和逻辑关系) +#define MOTO_EN_CTRL 0x0004 // 电机使能控制(辅助调试的功能,无安全保护和逻辑关系) +#define MANUAL_ACTION 0x0005 // 手动动作功能(日常使用功能,有安全保护和逻辑时序关系) +#define TEST_OUTPUT 0x0006 // 测试输出OUTPUT端口(obj输出端口 1~26:主板output1~26 101~356:扩展板output1~256) +#define TEST_THREADBK 0x0007 // 测试断线检测 + +// 归零和手动移动和电机使能的 控制参数1 定义 +#define MT_LX 0x0001 // X向移动电机 +#define MT_LY 0x0002 // Y向移动电机 +#define MT_LM 0x0003 // 主轴电机 +#define MT_LN 0x0004 // 针电机 +#define MT_LU1 0x0003 // U1电机 +#define MT_LU2 0x0004 // U2电机 +#define MT_LH 0x0005 // 梭电机 +#define MT_LU 0x0006 // 升降电机 +#define MT_LX2 0x0007 // X2向移动电机 +#define MT_ALLZ 0x0004 // 所有主轴 零位 +#define MT_ALLG 0x0005 // 所有主轴 勾线 +#define MT_ALLM 0x0006 // 所有主轴 点动 +#define MT_LF 0x0007 // 压脚电机 +#define MT_LRR 0x0008 // 旋转电机 +#define MT_LRU 0x0009 // 上旋转电机 +#define MT_LRD 0x000A // 下旋转电机 +#define MT_LM2 0x0013 // 主轴2电机 +#define MT_LB 0x0014 // 传送带 找零 正反转 +#define MT_LIN 0x0016 // 进料电机 +#define MT_LPL 0x0017 // 拉料电机 +#define MT_LOT 0x0018 // 出料电机 + +#define CUT_THREAD 0x0001 // 手动剪线 +#define ALL_MS_RUN 0x0002 // 所有主轴研车 +//#define ROTATE_ADJUST 0x0003 // 旋转校对 +#define HEAD_LIFT_UP 0x0004 // 机头上升 +#define HEAD_LIFT_DOWN 0x0005 // 机头下降 +#define HEAD_LIFT_UPDW 0x0006 // 机头升降 +#define HEAD_LIFT_UP2 0x0009 // 机头2上升 +#define HEAD_LIFT_DOWN2 0x000A // 机头2下降 +#define MAINSHAFT_ADJUST_GLASS 0x0007 // 针梭校对(玻璃纤维) +#define MAINSHAFT_ADJUST 0x0003 // 针梭校对 +#define SEWING_MS_RUN 0x0009 // 缝纫主轴研车 +#define SEWING_MS_JOG 0x0084 // 缝纫机头点动 +#define SEW_HEAD_LIFT 0x0012 // 缝纫机头升降(根据传感器状态确定上升还是下降) +#define SEW_MS_RESET 0x0013 // 缝纫针梭复位(回到停车位) +#define SEW_MS_TO_FIX 0x0014 // 缝纫针梭去穿线位(回到穿线位) +#define SEW_LOCLIP_TRD 0x0015 // 松紧线(根据状态松线或紧线) +#define XY_MOVE_LEFT 0x0016 // X左移 +#define XY_MOVE_RIGHT 0x0017 // X右移 +#define XY_MOVE_FRONT 0x0018 // Y前移 +#define XY_MOVE_BACK 0x0019 // Y后移 + +//平板切割机电机移动 +#define XY_MOVE_LEFT_CUTTING 0x0016 // +#define XY_MOVE_RIGHT_CUTTING 0x0017 // +#define XY_MOVE_FRONT_CUTTING 0x0019 // +#define XY_MOVE_BACK_CUTTING 0x0018 // + +#define MAKEUP_NOHEAD 0x0020 // 取消补缝 +#define MAKEUP_HEAD1 0x0021 // 机头1补缝 +#define MAKEUP_HEAD2 0x0022 // 机头2补缝 +#define MAKEUP_HEAD3 0x0023 // 机头3补缝 +#define MAKEUP_HEAD4 0x0024 // 机头4补缝 +#define MAKEUP_HEAD5 0x0025 // 机头5补缝 + +#define ThreadCuttingAction1 0x0011 // 机头1 剪线动作 (使能) +#define ThreadCuttingAction2 0x0012 // 机头2 剪线动作 +#define ThreadCuttingAction3 0x0013 // 机头3 剪线动作 +#define ThreadCuttingAction4 0x0014 // 机头4 剪线动作 +#define ThreadCuttingAction5 0x0015 // 机头5 剪线动作 + +#define XY_MOVE_STOP 0x001A // XY停止 +#define SET_WORK_AREA 0x0001 // 设置可工作区域 手动控制功能,para2是机头 para3选X- X+ Y- Y+,分别对应1234 +#define ALL_MOVE_STOP 0x0040 // 移动停止 +#define AUTO_CHANGE_ONE_SHUT 0x0060 // 自动换一个梭 +#define INSTALL_FIRST_BOBBIN 0x0061 // 安装第一个梭壳 +#define SHUT_FROM_PLATE_TO_HEAD 0x0062 // 将旋梭从梭盘拿到机头 +#define MT_SPREAD 0x0062 // 展布电机-转动 +#define SHUT_FROM_HEAD_TO_PLATE 0x0063 // 将旋梭从机头拿到梭盘 +#define SHUT_INTO_TAKE_PLATE 0x0065 // 进入换梭盘状态 +#define SHUT_INTO_INDX_STA 0x0066 // 进入缝纫状态 +#define HEAD_MOVING_MOTOR 0x0067 //机头移动电机 + +// 手动控制功能的 代码(控制参数1) 定义 +#define KNIFE_COLLECT 0x0005 // 刀压采集 +#define KNIFE_U1_TEST 0x0006 // 刀座1刀压测试 +#define KNIFE_U2_TEST 0x0007 // 刀座2刀压测试 + +#define SET_KNIFETEST_DOT 0x0008 // 设置刀压检测点 +#define SET_KNIFETEST_POS 0x0009 // 设置刀压检测位置 +#define SET_KNIFEROT_POS 0x000A // 设置被动刀旋转位置 +#define PASSIVE_KNIFE_ROT 0x000B // 被动刀旋转 +#define CROSS_CUT 0x000C // 横切 +#define U1_PASSIVE_KNIFE_ROT 0x000D // 刀座1被动刀旋转 +#define U2_PASSIVE_KNIFE_ROT 0x000E // 刀座2被动刀旋转 +#define SET_KNIFETEST_FLATNESS 0x000F // 平整度检测 +#define MILLING_HIGH_TEST 0x0101 // 铣刀高度测试(刀压采集) +#define MILLING_TEST 0x0102 // 铣刀深度测试 +#define DRILL_HIGH_TEST 0x0103 // 钻头高度测试 + +#define MOTO_LOW_POS 0x000 // 翻板到低位 +#define MOTO_MID_POS 0x001 // 翻板到中位 + +#define MT_MANUAL_A1 0x0431 // 全部复位 +#define MT_MANUAL_A2 0x0432 // 一键拉料 +#define MT_MANUAL_A3 0x0433 // 一键横切 +#define MT_MANUAL_A4 0x0434 // 底线清空计数 + +#define CTB_INTO_SEW_STA 0x0092 // 进入绗缝状态 +#define CTB_INTO_PULL_STA 0x0094 // 进入拉料状态 +#define CTB_ONEKEY_CROSSCUT 0x0095 // 一键横切 + +// 手动 控制参数2 定义 +#define MT_MOVE_DIR_STOP 0x0000 // 停止转动 +#define MT_MOVE_DIR_POSI 0x0001 // 正向移动(x向右,y向上,升降向上) +#define MT_MOVE_DIR_NEGA 0x0002 // 反向移动(x向左,y向下,升降向下) +#define MT_SERVO_ON 0x0001 // 电机使能开 +#define MT_SERVO_OFF 0x0002 // 电机使能关 + +//粗线布线机 手动控制功能的 代码(控制参数1) 定义 +#define HEAD_LIFT 0x000A // 机头升降 +#define MS_TO_ANGLE 0x0001 // 主轴去指定角度 +#define WIRE_MS_RUN 0x0002 // 主轴研车 +#define ROT_TO_ANGLE 0x0003 // 旋转电机去指定角度 +#define AUTO_PULL 0x0004 // 自动拉料 +#define CUT_UD 0x0005 // 剪底面线 +#define CUT_WIRE 0x0006 // 剪电阻丝 +#define GOTO_PULLPOS 0x0007 // 回拉料起始点 +#define JAW_WORK 0x0008 // 夹布工作状态 +#define JAW_FEED 0x0009 // 夹布上料状态 +#define ZIGZAG_POS1 0x000A // 去摆动位1 +#define ZIGZAG_POS2 0x000B // 去摆动位2 + +#define XY_MOVE_LEFT 0x0016 // X左移 +#define XY_MOVE_RIGHT 0x0017 // X右移 +#define XY_MOVE_FRONT 0x0018 // Y前移 +#define XY_MOVE_BACK 0x0019 // Y后移 +#define XY_MOVE_STOP 0x001A // XY停止 +#define YPB_MOVE 0x001A // Y 手动拉料 环带 + +#define MT_LYPB 0x000C // +#define MT_LINKRE 0x000D // 联动退料,只写退料动作 +#define MT_LFW 0x000E // 送电阻丝 + +#define AUTO_CHANGE_ONE_SHUT 0x0060 // 自动换一个梭 +#define INSTALL_FIRST_BOBBIN 0x0061 // 安装第一个梭壳 +#define SHUT_FROM_PLATE_TO_HEAD 0x0062 // 将旋梭从梭盘拿到机头 +#define SHUT_FROM_HEAD_TO_PLATE 0x0063 // 将旋梭从机头拿到梭盘 +#define SHUT_INTO_TAKE_PLATE 0x0065 // 进入更换梭盘状态 +#define SHUT_INTO_INDX_STA 0x0066 // 进入缝纫状态 +#define SHUT_FEED_STATE 0x000B // 进入送料状态 +#define SHUT_BACK_STATE 0x000C // 进入收料状态 + +// 通用输出控制定义 +// 输出控制参数1代码定义 +#define OT_LOOSE_THREAD 0x0001 // 松紧线 +#define OT_UCUTTER_LIFT 0x0002 // 上剪刀升降 +#define OT_UCUT_THREAD 0x0003 // 上剪刀剪线 +#define OT_DCUT_THREAD 0x0004 // 下剪刀剪线 +#define OT_FRAME 0x0005 // 气框 +#define OT_OIL 0x0006 // 加油 +#define OT_LIGHT 0x0007 // 照明灯 +#define OT_BIT_FOOT 0x0008 // 大压脚 +#define OT_MID_FOOT 0x0009 // 中压脚 +#define OT_PUSH_BTRD 0x000A // 扣底线 +#define OT_STAND_BTRD 0x000B // 顶底线 +#define OT_CLIP_UTRD 0x0003 // 夹面线 打开 关闭 +#define OT_CLIP_UTRD_OUT 0x0002 // 夹面线 伸出 收回 +#define OT_LOOSE_UTRD2 0x000D // 松紧线2 +#define OT_SEW_LIFT 0x000E // 缝纫机头升降 +#define OT_SEW_BLOW 0x0010 // 缝纫吹气 +#define OT_HEAD_L_CLUTH 0x001A // 左机头主轴离合 +#define OT_HEAD_R_CLUTH 0x001B // 右机头主轴离合 +#define OT_CLIP_EXTEND 0x0024 // 勾线动作-伸出 +#define OT_CLIP_EXTEND_R 0x0025 // 右机头勾线动作 +#define OT_CLIP_OPEN 0x0026 // 勾线动作-开合 +#define OT_CHBOB_GRAB_OPEN 0x0070 // 换梭装置抓取 +#define OT_CHBOB_SWAY_PUSH 0x0071 // 换梭装置摆动 +#define OT_CHBOB_PUSH_PUSH 0x0072 // 换梭装置推动 +#define OT_CHBOB_SPIN 0x0073 // 换梭装置旋转 +#define MAIN_TO_CUSP 0x0090 // 主轴去勾线位 +#define MAIN_TO_STOP 0x0091 // 主轴去停车位 +#define OT_LASER_CTRL 0x00F0 // 激光控制 +#define OT_LASER_BLOW 0x00F1 // 激光吹气 +// 输出控制的 控制参数1 定义 +#define OT_MAINADSORB 0x0001 // 吸附总开关 +#define OT_ADSORB1 0x0002 // 吸附1开关 +#define OT_ADSORB2 0x0003 // 吸附2开关 +#define OT_ADSORB3 0x0004 // 吸附3开关 +#define OT_ADSORB4 0x0005 // 吸附4开关 +#define OT_U1_LIFT 0x0006 // U1升降 +#define OT_U2_LIFT 0x0007 // U2升降 +// 输出控制的 控制参数1 定义 +#define OT_U_LIFT 0x0001 // U升降 +// 输出参数2 +#define OT_STOP 0x0000 // 停止 +#define UP_OPEN_ON 0x0001 // 上升、打开、放松、伸出 +#define DOWN_CLOSE_OFF 0x0002 // 下降、关闭、加紧、收回 +#define OT_ACTION 0x0003 // 动作 +#define OT_PEN_DOWN 0x0001 // 画笔 上升/下降 +#define OT_MILLING_MOTO 0x0002 // 铣刀 打开/关闭 +#define OT_CLEANER 0x0003 // 吸尘器 打开/关闭 +#define OT_FAN_CTRL 0x0004 // 吸风 打开/关闭 +#define OT_DRILL_MOTO 0x0005 // 电钻电机 + +// 通用工作控制功能 +#define WORK_START 0x0001 // 启动工作 +#define WORK_PAUSE 0x0002 // 暂停工作 +#define WORK_FINISH 0x0003 // 结束工作(流程复位) +#define WORK_FIND_ZERO 0x0004 // 自动找零 +#define WORK_GOTO_START 0x0005 // 回起点 +#define WORK_GOTO_ANCHOR 0x0006 // 回定位点 +#define WORK_GOTO_OFFSET 0x0007 // 回偏移点 +#define WORK_CHECK_FRAME 0x0008 // 边框检查 +#define WORK_CUT_FRAME 0x0009 // 边框切割 +#define WORK_CUT_XLINE 0x000A // 手动断布 +#define WORK_FAST_JUMP 0x000B // 快速进退 +#define WORK_GOTO_WKPOS 0x000C // 回工作点 +#define WORK_GOTO_FEEDT 0x000D // 回穿线点 +#define WORK_GOTO_CHGBO 0x000E // 回换梭位 +#define WORK_FEED_MOVE 0x000F // 进料退料 +#define WORK_GOTO_FINISH 0x0011 // 回结束点 +#define WORK_GOTO_ZERO 0x0012 // 回零点(框架归零)(回绣框原点) +#define WORK_GOTO_GORNER 0x0013 // 回角点 +#define WORK_MS_JOG 0x0013 // 主轴点动 +#define WORK_FIX_MVFRAME 0x0017 // 定量移框 +#define WORK_RPM_CHG 0x0020 // 速度改变 +#define WORK_SIMULATION_FRAME 0x0026 // 空走边框 +#define WORK_GOTO_FEED 0x0027 // 回上料点 +#define WORK_SET_OFFSET 0x0028 // 定偏移点 +#define WORK_SET_FEED 0x0029 // 定上料点 +#define WORK_ACT_OIL 0x0050 // 工作中加油 +#define AUTO_CHANGE_ONE_SHUT 0x0060 // 自动换一个梭 +#define RESET_SHUT_COUNTER 0x0067 // 梭盘计数复位 + +// 启动工作的参数1定义 +#define WKMD_NORMAL 1 // 正常 +#define WKMD_SIMULATION 2 // 模拟(空走) +#define WKMD_BACKWORD 3 // 回退 + + + +// 命令结构定义 +typedef union +{ + DataPacket packet; + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 toggle; + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) getMcInfo; // UCMD_GET_MC_INFO 读取机器信息 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 toggle; + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) getMcStatus; // UCMD_GET_MC_STATUS 读取机器状态 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 paraType; + u16 paraId; + u8 rev[4]; + u16 crc; + } __attribute__ ((packed)) getMcParas; // UCMD_GET_MC_PARAS 读取机器参数 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 fromObj; + u32 begAddr; + u16 rdSize; + u16 crc; + } __attribute__ ((packed)) getMemData; // UCMD_GET_MEM_DATA 读取内存数据 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 backType; + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) getSensors; // UCMD_GET_SENSORS 读取传感信号 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 fileType; + u8 fileIdx; + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) getFileInfo; // UCMD_GET_FILE_INFO 读取文件信息 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 fileId; + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) getTransResult; // UCMD_GET_TRANS_RESULT 读取传输结果 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 rev[8]; + u16 crc; + } __attribute__ ((packed)) getSensorBmp; // UCMD_GET_SENSOR_BMP 读取传感信号 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 cfgItem; + u8 rev[2]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) setMcConfig; // UCMD_SET_MC_CONFIG 设置机器配置 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 staCode; + u16 para; + u8 rev[4]; + u16 crc; + } __attribute__ ((packed)) setMcStatus; // UCMD_SET_MC_STATUS 设置机器状态 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 paraType; + u16 paraId; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) setParas; // UCMD_SET_MC_PARAS 设置下位机参数 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 setObj; + u8 setWord; + u32 setAddr; + u16 setData; + u16 crc; + } __attribute__ ((packed)) setMemData; // UCMD_SET_MEM_DATA 设置内存数据 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 fileType; + u8 fileIdx; + u16 fileId; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) setFileParas; // UCMD_SET_FILE_PARAS 设置文件参数 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 fileType; + u8 fileIdx; + u16 fileId; + + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + + } __attribute__ ((packed)) setExecProgress; // UCMD_SET_EXEC_PROGRESS 设置进度命令 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 rev[4]; + + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + + } __attribute__ ((packed)) setInstallment; // UCMD_SET_INSTALLMENT 设置分期密码 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 type; + u32 time; + + u8 rev[3]; + u16 crc; + + } __attribute__ ((packed)) setElapsedTime; // UCMD_SET_ELAPSED_TIME 设置经过的时间 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + u8 id; + u8 nodeType; + u8 rev[6]; + u16 crc; + + } __attribute__ ((packed)) setDefParas; // UCMD_SET_DEF_PARA 设置默认参数 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 actCode; + u16 para1; + u16 para2; + u16 para3; + u16 crc; + } __attribute__ ((packed)) actByhand; // UCMD_ACT_BYHAND 手动动作功能 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 workCode; + u32 para1; + u16 para2; + u16 crc; + } __attribute__ ((packed)) mcWork; // UCMD_MC_WORK 机器工作命令 + +#pragma pack(1)//设定为1字节对齐 + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + s32 posx; + s32 posy; + u16 crc; + } __attribute__ ((packed)) moveFrameTo; // UCMD_MOVE_TO 移动框架到位置命令 +#pragma pack(1)//设定为1字节对齐 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 fileType; + u8 fileIdx; + u16 fileId; + + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) startTrans; // UCMD_START_TRANS 启动文件传输 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 pktIdx; + u16 fileId; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) transFileData; // UCMD_TRANS_FILE_DATA 文件数据传输 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u32 fileIdxMap; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) setFilesList; // UCMD_SET_FILE_LIST 设置文件列表 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 rev[8]; + + u16 crc; + + } __attribute__ ((packed)) getFilesList; // UCMD_GET_FILE_LIST 读取文件列表 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 upObj; + u16 upFileID; + u32 checksum; + u16 crc; + } __attribute__ ((packed)) mcUpdate; // UCMD_MC_UPDATE 系统升级 + + + //---------------------------------- + // 下位机发送命令 + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 fileType; + u8 fileIdx; + u16 fileId; + u32 datBlockIdx; // 数据包索引(每个包1024字节) + + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dRequestDatBlock; // DCMD_REQUEST_DAT 请求文件数据 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 toggle; + u8 rev[2]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendMcInfo; // DCMD_SEND_MC_INFO 发送机器信息 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + u16 exLen; + u16 exCrc; + u8 rev[4]; + u16 crc; + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) sendDebugInfo; // 发送调试信息 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 toggle; + u8 rev[2]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendMcStatus; // DCMD_SEND_MC_STATUS 发送机器状态 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 paraType; + u16 paraId; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendMcParas; // DCMD_SEND_MC_PARAS 发送机器参数 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u32 begAddr; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendMemData; // DCMD_SEND_MEM_DATA 发送内存数据 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 rev[4]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendSensors; // DCMD_SEND_SENSORS 发送传感信号 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 fileType; + u8 fileIdx; + u8 rev[2]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendFileInfo; // DCMD_SEND_FILE_INFO 发送文件信息 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u16 fileId; + u8 active; + u8 result; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendTransResult; // DCMD_SEND_TRANS_RESULT 发送传输结果 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + + u16 exLen; + u16 exCrc; + + u8 rev[4]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) dSendSensorBmp; // DCMD_SEND_SENSOR_BMP 发送传输结果 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 fileType; + u8 fileIdx; + u16 fileId; + + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + + } __attribute__ ((packed)) setMacKey; // setMacKey + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 protocolType; // 协议类型 + u8 nodeType; // 遍历节点类型 + u8 traNum; // 遍历个数 + u8 nodeId; // 遍历起始节点ID + u8 rev[4]; + u16 crc; + } __attribute__ ((packed)) traverse; // 遍历命令 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 rev[8]; + u16 crc; + } __attribute__ ((packed)) rdBoardVer; // 读取外围板程序版本 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u8 protocolType; // 协议类型 + u8 nodeId; // 节点ID + u8 rev[6]; + u16 crc; + } __attribute__ ((packed)) updateBoard; // 升级外围板 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 protocolType; + u8 nodeId; //节点ID + u8 nodeType; //节点类型 -rq + u8 rev; + u16 crc; + + u32 ver[8]; + u8 exData[MAX_EXDP_LEN-32]; + } __attribute__ ((packed)) sendBoardVer; // 发送外围板程序版本 + + struct + { + u8 sync[DP_SYNC_LEN]; + u16 cmdCode; + + u16 exLen; + u16 exCrc; + + u8 nodeId; + u8 nodeType; // 节点类型 + u8 rev[2]; + u16 crc; + + u8 exData[MAX_EXDP_LEN]; + } __attribute__ ((packed)) boardPara; // 发送外围板非易失性参数 + +}OperPacket; +#pragma pack(1)//设定为1字节对齐 + + +#endif diff --git a/machine/comm/typedef.h b/machine/comm/typedef.h new file mode 100644 index 0000000..cf4918e --- /dev/null +++ b/machine/comm/typedef.h @@ -0,0 +1,107 @@ +#ifndef TYPEDEF_H +#define TYPEDEF_H + +//--------------------------------------------------------------- + + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +//--------------------------------------------------------------- + + +#define DATA_VALID 0x55AA + +//--------------------------------------------------------------- + +typedef int BOOL; +typedef unsigned char BYTE; +typedef unsigned short int WORD; +typedef unsigned long int DWORD; + +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned int u32; +typedef char s8; +typedef short int s16; +typedef int s32; + +//--------------------------------------------------------------- + +#define U8_MAX ((u8)255) +#define S8_MAX ((s8)127) +#define S8_MIN ((s8)(-128)) +#define U16_MAX ((u16)65535u) +#define S16_MAX ((s16)32767) +#define S16_MIN ((s16)(-32768)) +#define U32_MAX ((u32)4294967295uL) +#define S32_MAX ((s32)2147483647uL) +#define S32_MIN ((s32)(-2147483648uL)) + +//--------------------------------------------------------------- +#ifndef LOBYTE +#define LOBYTE(w) ((BYTE)(((WORD)(w)) & 0xff)) +#endif + +#ifndef HIBYTE +#define HIBYTE(w) ((BYTE)((((WORD)(w)) >> 8) & 0xff)) +#endif + +#ifndef LOWORD +#define LOWORD(l) ((WORD)(((DWORD)(l)) & 0xffff)) +#endif + +#ifndef HIWORD +#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xffff)) +#endif + +#ifndef MAKEWORD +#define MAKEWORD(a, b) ((WORD)((BYTE)(a)) | (((WORD)((BYTE)(b))) << 8)) +#endif + +#ifndef MAKEDWORD +#define MAKEDWORD(a, b) ((DWORD)((WORD)(a)) | (((DWORD)((WORD)(b))) << 16)) +#endif + +#ifndef LOHFBYTE +#define LOHFBYTE(b) ((BYTE)((b) & 0x0f)) +#endif + +#ifndef HIHFBYTE +#define HIHFBYTE(b) ((BYTE)(((b) >> 4) & 0x0f)) +#endif + +#ifndef MAKEBYTE +#define MAKEBYTE(a, b) ((BYTE)((BYTE)((a) & 0x0f)) | ((BYTE)(((BYTE)((b) & 0x0f)) << 4))) +#endif + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +//--------------------------------------------------------------- + +#ifndef PI + +#define PI 3.1415926535897932 + +#endif + + + + +#endif // TYPEDEF_H diff --git a/machine/comport.cpp b/machine/comport.cpp new file mode 100644 index 0000000..f2a29d8 --- /dev/null +++ b/machine/comport.cpp @@ -0,0 +1,157 @@ +#include "comport.h" +#include +#include + +//----------------------------------------------------------------------------------------------------- + +ComPort::ComPort(QObject *parent) : + QObject(parent), + m_pSerialport(NULL), + m_running(0), + m_pReadTimer(NULL) +{ + m_pReadTimer = new QTimer(this); + m_pReadTimer->setInterval(20); + connect(m_pReadTimer, SIGNAL(timeout()), this, SLOT(getDataFromPort())); +} + +ComPort::~ComPort() +{ + m_pReadTimer->stop(); + delete m_pReadTimer; + + if (m_pSerialport != NULL) + { + m_pSerialport->close(); + delete m_pSerialport; + m_pSerialport = NULL; + } +} + +void ComPort::setComPortName(QString portName) +{ + m_portName.clear(); + + if(portName.length() > 0)//串口名称不为空 + { + m_portName = portName; + return; + } + + //windows平台下 +#ifdef Q_OS_WIN + //得到串口设备 + QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM"; + QSettings *settings = new QSettings(path,QSettings::NativeFormat); + QStringList key = settings->allKeys(); + int num = (int)key.size(); + + //打开注册表 + unsigned long keysize,type,valuesize; + wchar_t keyname[256]; //键名数组 + char keyvalue[256]; //键值数组 + keysize = sizeof(keyname); + valuesize = sizeof(keyvalue); + int indexnum; + HKEY hKey; + QString commresult = ""; + QString valuemessage = "";//键值 + QString strkey = "HARDWARE\\DEVICEMAP\\SERIALCOMM";//子键路径 + LPCWSTR subkey = reinterpret_cast(strkey.utf16()); + + if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0) + { + return; + } + + //循环得到串口设备的名称 + for(int i = 0; i < num; i++) + { + valuemessage.clear(); + commresult.clear(); + keysize=sizeof(keyname); + valuesize=sizeof(keyvalue); + indexnum=i;//要读取键值的索引号 + + if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize) == 0)//列举键名和值 + { + for(unsigned int j = 0; j < valuesize; j++) + { + if(keyvalue[j]!=0x00) + { + valuemessage.append(keyvalue[j]); + } + } + if(m_portName.length() <= 0) + { + m_portName = valuemessage; + } + } + else + { + commresult="nokey"; + } + } + ::RegCloseKey(hKey);//关闭注册表 +#endif + +#ifdef Q_OS_LINUX + m_portName = COMNAME; +#endif + return; +} + +void ComPort::initComm() +{ + if (m_running == 0) + { + qDebug() << "InitComm ComPort at thread" << QThread::currentThread() << "name" << m_portName; + + struct PortSettings myComSetting = {BAUD115200, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 0, 20}; + m_pSerialport = new QextSerialPort(m_portName, myComSetting); + bool bOpen = m_pSerialport->open(QIODevice::ReadWrite | QIODevice::Unbuffered); + if(bOpen == false) + { + emit siSerialPortOpenState(m_running); + qDebug()<<"m_pSerialport->open fail "; + return; + }else + { + qDebug()<<"m_pSerialport->open success "; + } + + qDebug() << "Start timer"; + + m_pReadTimer->start(); + m_running = 1; + emit siSerialPortOpenState(m_running); + } +} + +void ComPort::getDataFromPort() +{ +// qDebug("GetDataFromPort"); +// qDebug() << "ComPort GetDataFromPort" << QThread::currentThread(); + + if (m_running != 0 && m_pSerialport != NULL) + { + QByteArray dat = m_pSerialport->readAll(); + if (dat.size() != 0) + { + //qDebug()<<"dat.size()="<readAll() :"<write(dat.data(), dat.size()); + } +} diff --git a/machine/comport.h b/machine/comport.h new file mode 100644 index 0000000..6b32e0f --- /dev/null +++ b/machine/comport.h @@ -0,0 +1,43 @@ +#ifndef COMPORT_H +#define COMPORT_H + + +#include +#include +#include + +#include "qextserial/qextserialport.h" + +#ifdef Q_OS_LINUX +#define COMNAME "/dev/ttyS1" +#define COMNAME485 "/dev/ttyS2" +#endif + +class ComPort : public QObject +{ + Q_OBJECT +public: + explicit ComPort(QObject *parent = 0); + ~ComPort(); +private: + QextSerialPort * m_pSerialport; + int m_running; + QTimer * m_pReadTimer; + QString m_portName; + +public: + void setComPortName(QString portName);//获取所有串口名称 + +private slots: + void getDataFromPort(); + +signals: + void siReceiveData(QByteArray dat); + void siSerialPortOpenState(int val); + +public slots: + void initComm(); + void slotSendData(QByteArray dat); +}; + +#endif // COMTHREAD_H diff --git a/machine/error.cpp b/machine/error.cpp new file mode 100644 index 0000000..24f91ef --- /dev/null +++ b/machine/error.cpp @@ -0,0 +1,518 @@ + +#include "error.h" +#include "comm/protocol.h" +#include + +#define CASE_OP(cd, str) \ +{\ + case cd:\ + errinfo = str;\ + break;\ +} + + +#define ERR_NONE 0x0000 // 没有错误 +#define ERR_NO_POWER 0x0001 // 没有上电 +#define ERR_NO_AIR 0x0002 // 气压不足 +#define ERR_NOT_SAFE 0x0003 // 安全区域介入 +#define ERR_EXPIRATION 0x0004 // 使用时限已到 +#define ERR_DRIVER 0x0005 // 驱动器报警 +#define ERR_FILL_DATA 0x0006 // 填充数据错误 +#define ERR_NOT_ALLOWED 0x0007 // 不允许工作状态 +#define ERR_CTRL_ERR 0x0008 // 控制错误 +#define ERR_FPGA_ERR 0x0009 // FPGA软件版本错误 +#define ERR_BUTTON_NOUP 0x000A // 等待按钮抬起超时 +#define ERR_FPGA_RESET 0x000B // FPGA复位错误 +#define ERR_NO_READY 0x000C // 外设未就绪 +#define ERR_NO_SEND_ERR 0x000D // 传输数据错误 +#define ERR_EDTION_ERR 0x000E // 程序版本错误 +#define ERR_WORK_DONE 0x000F // 完成产量 + +#define ERR_LMT_POSITIVE 0x0010 // 正向限位 +#define ERR_LMT_NEGATIVE 0x0011 // 反向限位 +#define ERR_RUN_ALM 0x0012 // 运动报警 +#define ERR_RUN_LIMIT 0x0013 // 运动限位 +#define ERR_RUN_EMS 0x0014 // 运动急停 +#define ERR_MV_PARA 0x0015 // 运动参数错误 +#define ERR_MC_PARA 0x0016 // 机器参数错误 +#define ERR_IN_PARA 0x0017 // 输入参数错误 +#define ERR_FPGA_HARD_ERR 0x0018 // FPGA硬件版本错误 + +#define ERR_NOT_WORKSTA 0x001A // 不能工作状态 +#define ERR_NOT_MOVESTA 0x001B // 禁止移框状态 +#define ERR_NOFAM_ZERO 0x001C // 归零前需要卸下模板 +#define ERR_NO_ADDAIR 0x001D // 没有加气 + +#define ERR_MTZ_RIGHT 0x001F // 归零成功 +#define ERR_MTZ_ERROR 0x0020 // 归零错误 +#define ERR_COOR_SYSTM 0x0021 // 坐标系统错误 +#define ERR_OUT_RANGE 0x0022 // 目标位置越界 +#define ERR_X_LIT_POSI 0x0023 // X正向限位 +#define ERR_X_LIT_NEGA 0x0024 // X反向限位 +#define ERR_Y_LIT_POSI 0x0025 // Y正向限位 +#define ERR_Y_LIT_NEGA 0x0026 // Y反向限位 + +#define ERR_FEED_MANUAL 0x0027 // 进料处于手动状态 +#define ERR_MC_MANUAL 0x0028 // 机器处于手动状态 +#define ERR_KEY_SW_OFF 0x0029 // 机器钥匙开关关闭 +#define ERR_ALM_WATERTANK 0x002A // 水箱报警 +#define ERR_ALM_COVEROPEN 0x002B // 开盖报警 +#define ERR_LIGHTCURTAINS1 0x002C // 光幕1介入 +#define ERR_LIGHTCURTAINS2 0x002D // 光幕2介入 +#define ERR_AIR_POWER 0x002E // 气压不足 +#define ERR_PRESS_SENSOR 0x002F // 压料传感器错误 +#define ERR_CLIP_SENSOR 0x0030 // 夹布传感器错误 +#define ERR_NO_MATERIEL 0x0031 // 缺料报警 +#define ERR_CUTFRAME 0x0032 // 边框切割错误 +#define ERR_MC_AUTO 0x0033 // 机器处于自动状态 +#define ERR_DOOR_TIMEOUT 0x0034 // 开关门超时 +#define ERR_NOT_AT_OFFSET 0x0035 // 不在偏移点 +#define ERR_NO_PHOTO_FILE 0x0036 // 没有拍照文件 +#define ERR_FEED_AUTO 0x0037 // 进料处于自动状态 +#define ERR_GANTRY_NOT_POS 0x0038 // 龙门不到位 +#define ERR_GUARDRAIL_OPEN 0x0039 // 安全门未关闭 + +#define ERR_LIGHTCURTAINS3 0x003A // 光幕3介入 +#define ERR_LIGHTCURTAINS4 0x003B // 光幕4介入 +#define ERR_PRINT_ERROR 0x003C // 喷墨异常 +#define ERR_PRINT_NOT_AT_BAK 0x003D // 喷墨不在停止位置 + +#define ERR_LOAD_EMPTY 0x003E // 上料储料空料 +#define ERR_RECV_FULL 0x003F // 收料储料满料 + +#define ERR_NO_DATA 0x0040 // 无数据 +#define ERR_DATA_ERROR 0x0041 // 数据错误 +#define ERR_GRAPH_OUT_RANGE 0x0042 // 图形超出范围 +#define ERR_CUTTER2_ERROR 0x0043 // 切割机2故障 +#define ERR_PHOTO_ERROR 0x0044 // 拍照识别错误 +#define ERR_CUT_RANGE_OVERFLOW 0x0045 // 切割范围重叠 +#define ERR_CUTTER1_ERROR 0x0046 // 切割机1故障 +#define ERR_CUTTER1_CLEERR 0x0047 // 切割机1故障 失效 +#define ERR_CUTTER2_CLEERR 0x0048 // 切割机2故障 失效 +#define ERR_CUTTER_WASTE 0x0049 // 切割机废料 +#define ERR_INPUT_EDGE 0x004A // 进料偏移 +#define ERR_INPUT_TIMEOUT 0x004B // 进料超时 +#define ERR_EDGE_TBREAK 0x004E // 边缝机头断线 +#define ERR_CHANGE_MAR 0x004F // 更换料盘 + +#define ERR_MS_NOT_ZERO 0x0050 // 主轴不在零位 +#define ERR_HK_NOT_ZERO 0x0051 // 旋梭不在零位 +#define ERR_MS_NOT_SYNC 0x0052 // 针梭不同步 +#define ERR_RO_NOT_SYNC 0x0053 // 旋转不同步 +#define ERR_CUTTER_NOT_POS 0x0054 // 剪刀不在回位(注:该报错码是缝纫剪刀) +#define ERR_HEAD_NOT_HIGH 0x0055 // 机头不在高位 +#define ERR_HEAD_NOT_LOW 0x0056 // 机头不在低位 +#define ERR_LIGHTCURTAINS 0x0057 // 光幕介入 +#define ERR_UPER_TBREAK 0x0058 // 面线断线 +#define ERR_BOBBIN_TBREAK 0x0059 // 底线断线 +#define ERR_NEEDLE_NOT_HIGH 0x005A // 机针不在高位 +#define ERR_SEND_N1CMD_TIMOUT 0x005B // 发送主轴命令超时 +#define ERR_SEND_N1CMD_FAIL 0x005C // 发送主轴命令失败 +#define ERR_TRANS_TIMEOUT 0x005D // 执行命令超时 +#define ERR_NOT_AT_POS 0x005E // 模版不到位 +#define ERR_LIFT_TIMEOUT 0x005F // 机头升降超时 + +#define ERR_HEAD_NOT_SAFE 0x0060 // 机头不在安全区域 +#define ERR_HD1_ND_NOT_ZERO 0x0061 // 机头1针不在零位 +#define ERR_HD2_ND_NOT_ZERO 0x0062 // 机头2针不在零位 +#define ERR_HD3_ND_NOT_ZERO 0x0063 // 机头3针不在零位 +#define ERR_HD4_ND_NOT_ZERO 0x0064 // 机头4针不在零位 +#define ERR_HD5_ND_NOT_ZERO 0x0065 // 机头5针不在零位 +#define ERR_HD6_ND_NOT_ZERO 0x0066 // 机头6针不在零位 +#define ERR_HD7_ND_NOT_ZERO 0x0067 // 机头7针不在零位 +#define ERR_HD8_ND_NOT_ZERO 0x0068 // 机头8针不在零位 +#define ERR_HD9_ND_NOT_ZERO 0x0069 // 机头9针不在零位 + +#define ERR_HD1_CUTTER_NOT_POS 0x0071 // 机头1剪刀不在回位 +#define ERR_HD2_CUTTER_NOT_POS 0x0072 // 机头2剪刀不在回位 +#define ERR_HD3_CUTTER_NOT_POS 0x0073 // 机头3剪刀不在回位 +#define ERR_HD4_CUTTER_NOT_POS 0x0074 // 机头4剪刀不在回位 +#define ERR_HD5_CUTTER_NOT_POS 0x0075 // 机头5剪刀不在回位 +#define ERR_HD6_CUTTER_NOT_POS 0x0076 // 机头6剪刀不在回位 +#define ERR_HD7_CUTTER_NOT_POS 0x0077 // 机头7剪刀不在回位 +#define ERR_HD8_CUTTER_NOT_POS 0x0078 // 机头8剪刀不在回位 +#define ERR_HD9_CUTTER_NOT_POS 0x0079 // 机头9剪刀不在回位 + +#define ERR_PUNCH_NOT_ZERO 0x0080 // 冲孔主轴不在零位 + +#define ERR_R_LIT_POSI 0x0081 // 旋转正向限位 +#define ERR_R_LIT_NEGA 0x0082 // 旋转反向限位 + +#define ERR_PUNCH2_NOT_ZERO 0x0083 // 冲孔2主轴不在零位 +#define ERR_CUTTER_NOT_ZERO 0x0084 // 裁刀主轴不在零位 +#define ERR_XY_NOT_WP 0x0085 // XY不在工作位置 +#define ERR_HEAD_NOT_POS 0x0086 // 机头不到位 + +#define ERR_X2_LIT_POSI 0x0087 // X2正向限位 +#define ERR_X2_LIT_NEGA 0x0088 // X2反向限位 +#define ERR_Y2_LIT_POSI 0x0089 // Y2正向限位 +#define ERR_Y2_LIT_NEGA 0x008A // Y2反向限位 +#define ERR_PRESS_NOT_POS 0x008B // 压料龙门不到位 +#define ERR_PRESS_LIFT_TIMOUT 0x008C // 压料升降超时 +#define ERR_PRESS_LIFT_NOT_POS 0x008D // 压料升降不到位 +#define ERR_TO_ZERO_TIMOUT 0x008E // 等待运动结束超时 +#define ERR_MOVE_POS_ERR 0x008F // 移动位置错误 + +#define ERR_CLUTH_TIMOUT 0x0090 // 等待离合超时 +#define ERR_CLUTH1_NOT_POS 0x0091 // 机头1离合不到位 +#define ERR_CLUTH2_NOT_POS 0x0092 // 机头2离合不到位 + +#define ERR_FEED_ROLLER 0x0200 // 进料压辊 异常 +#define ERR_DIS_ROLLER 0x0201 // 出料压辊 异常 +#define ERR_DIS_MATERIAL 0x0202 // 出料压料 异常 +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 +#define ERR_FCLAMP_LIFT 0x0207 // 前夹升降气缸 异常 +#define ERR_FCLAMP_OPCL 0x0208 // 前夹开合气缸 异常 +#define ERR_PULL_CLAMP 0x0209 // 机械手上夹气缸 异常 +#define ERR_PULL_CLIP 0x020A // 机械手下夹气缸 异常 +#define ERR_YZR_NOT_SYNC 0x020B // 右框电机不同步 +#define ERR_CHIP_ERROR 0x020C // 夹线装置位置 异常 +#define ERR_FIXTURE1_ERROR 0x020D // 工装1传感器错误 +#define ERR_FIXTURE2_ERROR 0x020E // 工装2传感器错误 +#define ERR_CLASH_ERROR 0x020F // 工装防撞未就绪 + + +#define ERR_NW_NOT_POS 0x0210 // 近端压轮升降不到位 +#define ERR_FW_NOT_POS 0x0211 // 远端压轮升降不到位 +#define ERR_SENDGIVE_NOT_POS 0x0212 // 送边条气缸不到位 +#define ERR_FPHD_NOT_POS 0x0213 // 机头伸缩不到位 +#define ERR_INPRESS_ERR 0x0214 // 里压料气缸 异常 +#define ERR_OUTPRESS_ERR 0x0215 // 外压料气缸 异常 + + +#define ERR_TENS_AND_CLOTH 0x0216 // 当前夹布和张紧位置不允许移动机头 +#define ERR_RETURN_LIFT 0x0217 // 退料升降装置 异常 +#define ERR_CLOTH_EMPTY 0x0218 // 送边条装置缺料 +#define ERR_CHB_SWAY 0x0219 // 换梭摆动装置 异常 +#define ERR_CHB_PUSH 0x021A // 换梭推动装置 异常 +#define ERR_CHB_ROTATE 0x021B // 换梭旋转装置 异常 +#define ERR_CHB_SHUT 0x021C // 梭壳检测 异常 +#define ERR_XP_LIT_POSI 0x021D // XP正向限位 +#define ERR_XP_LIT_NEGA 0x021E // XP反向限位 +#define ERR_YP_LIT_POSI 0x021F // YP正向限位 +#define ERR_YP_LIT_NEGA 0x0220 // YP反向限位 +#define ERR_1UP_SEND_C 0x0221 // 送压布条1上气缸 异常 +#define ERR_1UP_PUSH_S 0x0222 // 压布条1上气缸 异常 +#define ERR_1UP_SEND_P 0x0223 // 送内压布1上气缸 异常 +#define ERR_1UP_PUSH_C 0x0224 // 压布1上气缸 异常 +#define ERR_1UP_IN_PUSH_C 0x0225 // 内压布1上气缸 异常 +#define ERR_1DW_SEND_C 0x0226 // 送压布条1下气缸 异常 +#define ERR_1DW_PUSH_S 0x0227 // 压布条1下气缸 异常 +#define ERR_1DW_SEND_P 0x0228 // 送内压布1下气缸 异常 +#define ERR_1DW_PUSH_C 0x0229 // 压布1下气缸 异常 +#define ERR_1DW_IN_PUSH_C 0x022A // 内压布1下气缸 异常 +#define ERR_TENS1_ERR 0x022B // 张力传感器1通讯 异常 +#define ERR_TENS2_ERR 0x022C // 张力传感器2通讯 异常 +#define ERR_FEED_LIMT 0x022D // 上料架对边限位 +#define ERR_IN_WAIT_AREA 0x022E // 进入等待区域 +#define ERR_HOT_LINE 0x022F // 烫线气缸未到位 + +#define ERR_CHB_SPIN 0x0230 // 换梭旋转装置 异常 +#define ERR_CHB_DPUSH 0x0231 // 换梭扣线伸缩装置 异常 + +#define ERR_PUNCH3_NOT_ZERO 0x0232 // 冲孔3主轴不在零位 +#define ERR_PUNCH4_NOT_ZERO 0x0233 // 冲孔4主轴不在零位 + +#define ERR_CUT_PRESS 0x0250 // 覆膜切料压杠装置 异常 +#define ERR_LAMIN_FILM1 0x0251 // 覆膜夹膜装置1 异常 +#define ERR_LAMIN_FILM2 0x0252 // 覆膜夹膜装置2 异常 +#define ERR_FEED_EMP 0x0253 // 覆膜送料空位 异常 + + +QString getErrStr(u32 code) +{ + QString errinfo; + errinfo.clear(); + QString errorCode; + errorCode.clear(); + + switch (code) + { + //通用的错误代码 + CASE_OP(ERR_NONE, QObject::tr("no error")); // 没有错误 + CASE_OP(ERR_NO_POWER, QObject::tr("no power")); // 没有上电 + CASE_OP(ERR_NO_AIR, QObject::tr("insufficient air pressure"));// 气压不足 + CASE_OP(ERR_NOT_SAFE, QObject::tr("safe area error")); // 安全区域介入 + CASE_OP(ERR_EXPIRATION, QObject::tr("Expiration of use")); // 使用时限已到 + CASE_OP(ERR_DRIVER, QObject::tr("Driver alarm")); // 驱动器报警 + CASE_OP(ERR_FILL_DATA, QObject::tr("Fill data error")); // 填充数据错误 + CASE_OP(ERR_NOT_ALLOWED, QObject::tr("Not allowed to work")); // 不允许工作状态 + CASE_OP(ERR_CTRL_ERR, QObject::tr("Control error")); // 控制错误 + CASE_OP(ERR_FPGA_ERR, QObject::tr("FPGA software version error"));// FPGA软件版本错误 + CASE_OP(ERR_BUTTON_NOUP, QObject::tr("Button release timeout")); // 等待按钮抬起超时 + CASE_OP(ERR_FPGA_RESET, QObject::tr("FPGA reset error")); // FPGA复位错误 + CASE_OP(ERR_NO_READY, QObject::tr("Peripheral not ready")); // 外设未就绪 + CASE_OP(ERR_NO_SEND_ERR, QObject::tr("Data transmission error")); // 传输数据错误 + CASE_OP(ERR_EDTION_ERR, QObject::tr("Program version error")); // 程序版本错误 + CASE_OP(ERR_WORK_DONE, QObject::tr("Work completed")); // 完成产量 + + CASE_OP(ERR_LMT_POSITIVE, QObject::tr("positive limit")); // 正向限位 + CASE_OP(ERR_LMT_NEGATIVE, QObject::tr("negative limit")); // 反向限位 + CASE_OP(ERR_RUN_ALM, QObject::tr("motion alarm")); // 运动报警 + CASE_OP(ERR_RUN_LIMIT, QObject::tr("motion limit")); // 运动限位 + CASE_OP(ERR_RUN_EMS, QObject::tr("motion emergency stop")); // 运动急停 + CASE_OP(ERR_MV_PARA, QObject::tr("motion parameter error")); // 运动参数错误 + CASE_OP(ERR_MC_PARA, QObject::tr("machine parameter error")); // 机器参数错误 + CASE_OP(ERR_IN_PARA, QObject::tr("input parameter error")); // 输入参数错误 + CASE_OP(ERR_FPGA_HARD_ERR, QObject::tr("FPGA hardware version error"));// FPGA硬件版本错误 + + CASE_OP(ERR_NOT_WORKSTA, QObject::tr("not allowed to work")); // 不能工作状态 + CASE_OP(ERR_NOT_MOVESTA, QObject::tr("move frame prohibited")); // 禁止移框状态 + CASE_OP(ERR_NOFAM_ZERO, QObject::tr("need to remove template before zeroing")); // 归零前需要卸下模板 + CASE_OP(ERR_NO_ADDAIR, QObject::tr("No gas added")); // 没有加气 + + CASE_OP(ERR_MTZ_RIGHT, QObject::tr("zeroing successful")); // 归零成功 + CASE_OP(ERR_MTZ_ERROR, QObject::tr("zeroing error")); // 归零错误 + CASE_OP(ERR_COOR_SYSTM, QObject::tr("coordinate system error")); // 坐标系统错误 + CASE_OP(ERR_OUT_RANGE, QObject::tr("target position out of range")); // 目标位置越界 + CASE_OP(ERR_X_LIT_POSI, QObject::tr("X positive limit")); // X正向限位 + CASE_OP(ERR_X_LIT_NEGA, QObject::tr("X negative limit")); // X反向限位 + CASE_OP(ERR_Y_LIT_POSI, QObject::tr("Y positive limit")); // Y正向限位 + CASE_OP(ERR_Y_LIT_NEGA, QObject::tr("Y negative limit")); // Y反向限位 + + CASE_OP(ERR_FEED_MANUAL, QObject::tr("feed in manual mode")); // 进料处于手动状态 + CASE_OP(ERR_MC_MANUAL, QObject::tr("machine in manual mode")); // 机器处于手动状态 + CASE_OP(ERR_KEY_SW_OFF, QObject::tr("key switch off")); // 机器钥匙开关关闭 + CASE_OP(ERR_ALM_WATERTANK, QObject::tr("water tank alarm")); // 水箱报警 + CASE_OP(ERR_ALM_COVEROPEN, QObject::tr("cover open alarm")); // 开盖报警 + CASE_OP(ERR_LIGHTCURTAINS1, QObject::tr("light curtain 1 triggered")); // 光幕1介入 + CASE_OP(ERR_LIGHTCURTAINS2, QObject::tr("light curtain 2 triggered")); // 光幕2介入 + CASE_OP(ERR_AIR_POWER, QObject::tr("air pressure insufficient")); // 气压不足 + CASE_OP(ERR_PRESS_SENSOR, QObject::tr("pressure sensor error")); // 压料传感器错误 + CASE_OP(ERR_CLIP_SENSOR, QObject::tr("clip sensor error")); // 夹布传感器错误 + CASE_OP(ERR_NO_MATERIEL, QObject::tr("material shortage alarm")); // 缺料报警 + CASE_OP(ERR_CUTFRAME, QObject::tr("cut frame error")); // 边框切割错误 + CASE_OP(ERR_MC_AUTO, QObject::tr("machine in auto mode")); // 机器处于自动状态 + CASE_OP(ERR_DOOR_TIMEOUT, QObject::tr("door timeout")); // 开关门超时 + CASE_OP(ERR_NOT_AT_OFFSET, QObject::tr("not at offset point")); // 不在偏移点 + CASE_OP(ERR_NO_PHOTO_FILE, QObject::tr("no photo file")); // 没有拍照文件 + CASE_OP(ERR_FEED_AUTO, QObject::tr("feed in auto mode")); // 进料处于自动状态 + CASE_OP(ERR_GANTRY_NOT_POS, QObject::tr("gantry not in position")); // 龙门不到位 + CASE_OP(ERR_GUARDRAIL_OPEN, QObject::tr("safety door not closed")); // 安全门未关闭 + + CASE_OP(ERR_LIGHTCURTAINS3, QObject::tr("light curtain 3 triggered")); // 光幕3介入 + CASE_OP(ERR_LIGHTCURTAINS4, QObject::tr("light curtain 4 triggered")); // 光幕4介入 + CASE_OP(ERR_PRINT_ERROR, QObject::tr("inkjet error")); // 喷墨异常 + CASE_OP(ERR_PRINT_NOT_AT_BAK, QObject::tr("inkjet not at stop position")); // 喷墨不在停止位置 + CASE_OP(ERR_LOAD_EMPTY, QObject::tr("loading storage empty")); // 上料储料空料 + CASE_OP(ERR_RECV_FULL, QObject::tr("receiving storage full")); // 收料储料满料 + + CASE_OP(ERR_NO_DATA, QObject::tr("no data")); // 无数据 + CASE_OP(ERR_DATA_ERROR, QObject::tr("data error")); // 数据错误 + + CASE_OP(ERR_PEN_TIMEOUT, QObject::tr("Brush lifting timeout")); // 画笔升降超时 + CASE_OP(ERR_PENHAT_TIMEOUT, QObject::tr("Pen cap timeout")); // 画笔笔帽超时 + + CASE_OP(ERR_GRAPH_OUT_RANGE, QObject::tr("graphic out of range")); // 图形超出范围 + CASE_OP(ERR_CUTTER2_ERROR, QObject::tr("cutter 2 error")); // 切割机2故障 + CASE_OP(ERR_PHOTO_ERROR, QObject::tr("photo recognition error")); // 拍照识别错误 + CASE_OP(ERR_CUT_RANGE_OVERFLOW, QObject::tr("cut range overlap")); // 切割范围重叠 + CASE_OP(ERR_CUTTER1_ERROR, QObject::tr("cutter 1 error")); // 切割机1故障 + CASE_OP(ERR_CUTTER1_CLEERR, QObject::tr("cutter 1 error invalid")); // 切割机1故障 失效 + CASE_OP(ERR_CUTTER2_CLEERR, QObject::tr("cutter 2 error invalid")); // 切割机2故障 失效 + CASE_OP(ERR_CUTTER_WASTE, QObject::tr("cutter waste")); // 切割机废料 + CASE_OP(ERR_INPUT_EDGE, QObject::tr("feeding offset")); // 进料偏移 + CASE_OP(ERR_INPUT_TIMEOUT, QObject::tr("feeding timeout")); // 进料超时 + CASE_OP(ERR_EDGE_TBREAK, QObject::tr("edge machine head wire break")); // 边缝机头断线 + CASE_OP(ERR_CHANGE_MAR, QObject::tr("material tray change")); // 更换料盘 + + CASE_OP(ERR_MS_NOT_ZERO, QObject::tr("spindle not at zero")); // 主轴不在零位 + CASE_OP(ERR_HK_NOT_ZERO, QObject::tr("shuttle not at zero")); // 旋梭不在零位 + CASE_OP(ERR_MS_NOT_SYNC, QObject::tr("needle and shuttle not synced")); // 针梭不同步 + CASE_OP(ERR_RO_NOT_SYNC, QObject::tr("rotation not synced")); // 旋转不同步 + CASE_OP(ERR_CUTTER_NOT_POS, QObject::tr("scissor not in position")); // 剪刀不在回位(缝纫剪刀) + CASE_OP(ERR_HEAD_NOT_HIGH, QObject::tr("head not at high position")); // 机头不在高位 + CASE_OP(ERR_HEAD_NOT_LOW, QObject::tr("head not at low position")); // 机头不在低位 + CASE_OP(ERR_LIGHTCURTAINS, QObject::tr("light curtain triggered")); // 光幕介入 + CASE_OP(ERR_UPER_TBREAK, QObject::tr("upper thread break")); // 面线断线 + CASE_OP(ERR_BOBBIN_TBREAK, QObject::tr("bobbin thread break")); // 底线断线 + CASE_OP(ERR_NEEDLE_NOT_HIGH, QObject::tr("needle not at high position")); // 机针不在高位 + CASE_OP(ERR_SEND_N1CMD_TIMOUT, QObject::tr("send spindle command timeout")); // 发送主轴命令超时 + CASE_OP(ERR_SEND_N1CMD_FAIL, QObject::tr("send spindle command failed")); // 发送主轴命令失败 + CASE_OP(ERR_TRANS_TIMEOUT, QObject::tr("execute command timeout")); // 执行命令超时 + CASE_OP(ERR_NOT_AT_POS, QObject::tr("template not in position")); // 模版不到位 + CASE_OP(ERR_LIFT_TIMEOUT, QObject::tr("head lift timeout")); // 机头升降超时 + + CASE_OP(ERR_PUNCH_NOT_ZERO, QObject::tr("punch spindle not at zero")); // 冲孔主轴不在零位 + CASE_OP(ERR_R_LIT_POSI, QObject::tr("rotation positive limit")); // 旋转正向限位 + CASE_OP(ERR_R_LIT_NEGA, QObject::tr("rotation negative limit")); // 旋转反向限位 + CASE_OP(ERR_PUNCH2_NOT_ZERO, QObject::tr("punch 2 spindle not at zero")); // 冲孔2主轴不在零位 + CASE_OP(ERR_CUTTER_NOT_ZERO, QObject::tr("cutter spindle not at zero")); // 裁刀主轴不在零位 + CASE_OP(ERR_XY_NOT_WP, QObject::tr("XY not at work position")); // XY不在工作位置 + CASE_OP(ERR_HEAD_NOT_POS, QObject::tr("head not in position")); // 机头不到位 + CASE_OP(ERR_X2_LIT_POSI, QObject::tr("X2 positive limit")); // X2正向限位 + CASE_OP(ERR_X2_LIT_NEGA, QObject::tr("X2 negative limit")); // X2反向限位 + CASE_OP(ERR_Y2_LIT_POSI, QObject::tr("Y2 positive limit")); // Y2正向限位 + CASE_OP(ERR_Y2_LIT_NEGA, QObject::tr("Y2 negative limit")); // Y2反向限位 + CASE_OP(ERR_PRESS_NOT_POS, QObject::tr("press gantry not in position")); // 压料龙门不到位 + CASE_OP(ERR_PRESS_LIFT_TIMOUT, QObject::tr("press lift timeout")); // 压料升降超时 + CASE_OP(ERR_PRESS_LIFT_NOT_POS, QObject::tr("press lift not in position")); // 压料升降不到位 + CASE_OP(ERR_TO_ZERO_TIMOUT, QObject::tr("wait motion end timeout")); // 等待运动结束超时 + CASE_OP(ERR_MOVE_POS_ERR, QObject::tr("move position error")); // 移动位置错误 + + CASE_OP(ERR_CLUTH_TIMOUT, QObject::tr("clutch wait timeout")); // 等待离合超时 + CASE_OP(ERR_CLUTH1_NOT_POS, QObject::tr("head 1 clutch not in position")); // 机头1离合不到位 + CASE_OP(ERR_CLUTH2_NOT_POS, QObject::tr("head 2 clutch not in position")); // 机头2离合不到位 + + CASE_OP(ERR_FOOT_POS, QObject::tr("presser foot position error")); // 压脚位置错误 + CASE_OP(ERR_FOOT_OUT_RANGE, QObject::tr("presser motor position out of range"));// 压脚电机位置越界 + CASE_OP(ERR_LIFT_OUT_RANGE, QObject::tr("head lift position out of range")); // 机头升降位置越界 + CASE_OP(ERR_ROT_OUT_RANGE, QObject::tr("rotation position out of range")); // 旋转位置越界 + CASE_OP(ERR_ROT_ECD_ERROR, QObject::tr("rotation encoder error")); // 旋转编码器错误 + CASE_OP(ERR_LIFT_ULIMIT, QObject::tr("head lift upper limit")); // 机头升降上限位 + CASE_OP(ERR_LIFT_DLIMIT, QObject::tr("head lift lower limit")); // 机头升降下限位 + CASE_OP(ERR_LIFT_SYNC_ERR, QObject::tr("head lift sync error")); // 机头升降同步错误 + CASE_OP(ERR_NOTIN_SAFE_AREA, QObject::tr("head not in safe area")); // 机头不在安全区域 + + CASE_OP(ERR_BUS_ERR, QObject::tr("bus error")); // 总线错误 + CASE_OP(ERR_WIRE_ALARM, QObject::tr("wire tying alarm")); // 扎线报警 + + CASE_OP(ERR_ROT_COOR_SYSTM, QObject::tr("rotation motor coordinate system error")); // 旋转电机坐标系统错误 + CASE_OP(ERR_LIFT_COOR_SYSTM, QObject::tr("lift motor coordinate system error")); // 升降电机坐标系统错误 + CASE_OP(ERR_MS_COOR_SYSTM, QObject::tr("spindle coordinate system error")); // 主轴坐标系统错误 + CASE_OP(ERR_WORK_HEAD, QObject::tr("working head error")); // 工作机头错误 + CASE_OP(ERR_CHANGE_SHUT, QObject::tr("shuttle change error")); // 换梭异常 + + CASE_OP(ERR_CHANGE_BOBBIN, QObject::tr("change bobbin")); // 更换梭芯 + CASE_OP(ERR_CHANGE_BOBBIN_A, QObject::tr("change bobbin A")); // 更换梭芯A + CASE_OP(ERR_CHANGE_BOBBIN_B, QObject::tr("change bobbin B")); // 更换梭芯B + CASE_OP(ERR_CHANGE_BOBBIN_STA, QObject::tr("machine in bobbin change state")); // 机器处于更换梭芯状态 + + CASE_OP(ERR_FEED_ROLLER, QObject::tr("feed roller error")); // 进料压辊 异常 + CASE_OP(ERR_DIS_ROLLER, QObject::tr("discharge roller error")); // 出料压辊 异常 + CASE_OP(ERR_DIS_MATERIAL, QObject::tr("discharge material error")); // 出料压料 异常 + CASE_OP(ERR_TENS_DEVICE, QObject::tr("tension device error")); // 张紧装置 异常 + CASE_OP(ERR_CLOTH_DEVICE, QObject::tr("cloth clamping device error")); // 夹布装置 异常 + CASE_OP(ERR_EDGE_MOTOR, QObject::tr("edge motor blockage")); // 边切电机 阻塞 + CASE_OP(ERR_CROSS_MOTOR, QObject::tr("cross cut motor error")); // 横切电机 异常 + CASE_OP(ERR_FCLAMP_LIFT, QObject::tr("front clamp lift cylinder error")); // 前夹升降气缸 异常 + CASE_OP(ERR_FCLAMP_OPCL, QObject::tr("front clamp open/close cylinder error")); // 前夹开合气缸 异常 + CASE_OP(ERR_PULL_CLAMP, QObject::tr("robot arm upper clamp cylinder error"));// 机械手上夹气缸 异常 + CASE_OP(ERR_PULL_CLIP, QObject::tr("robot arm lower clamp cylinder error")); // 机械手下夹气缸 异常 + CASE_OP(ERR_YZR_NOT_SYNC, QObject::tr("right frame motor out of sync")); // 右框电机不同步 + CASE_OP(ERR_CHIP_ERROR, QObject::tr("wire clamping device position error")); // 夹线装置位置 异常 + CASE_OP(ERR_FIXTURE1_ERROR, QObject::tr("fixture 1 sensor error")); // 工装1传感器错误 + CASE_OP(ERR_FIXTURE2_ERROR, QObject::tr("fixture 2 sensor error")); // 工装2传感器错误 + CASE_OP(ERR_CLASH_ERROR, QObject::tr("fixture anti-collision not ready")); // 工装防撞未就绪 + + + CASE_OP(ERR_NW_NOT_POS, QObject::tr("near-end pressure roller lift not in position")); // 近端压轮升降不到位 + CASE_OP(ERR_FW_NOT_POS, QObject::tr("far-end pressure roller lift not in position")); // 远端压轮升降不到位 + CASE_OP(ERR_SENDGIVE_NOT_POS, QObject::tr("edge feeding cylinder not in position")); // 送边条气缸不到位 + CASE_OP(ERR_FPHD_NOT_POS, QObject::tr("head telescoping not in position")); // 机头伸缩不到位 + CASE_OP(ERR_INPRESS_ERR, QObject::tr("inner pressure cylinder error")); // 里压料气缸 异常 + CASE_OP(ERR_OUTPRESS_ERR, QObject::tr("outer pressure cylinder error")); // 外压料气缸 异常 + + CASE_OP(ERR_TENS_AND_CLOTH, QObject::tr("current cloth clamp and tension position disallow head movement")); // 当前夹布和张紧位置不允许移动机头 + CASE_OP(ERR_RETURN_LIFT, QObject::tr("return lift device error")); // 退料升降装置 异常 + CASE_OP(ERR_CLOTH_EMPTY, QObject::tr("edge feeding device out of material")); // 送边条装置缺料 + CASE_OP(ERR_CHB_SWAY, QObject::tr("shuttle change swinging device error")); // 换梭摆动装置 异常 + CASE_OP(ERR_CHB_PUSH, QObject::tr("shuttle change pushing device error")); // 换梭推动装置 异常 + CASE_OP(ERR_CHB_ROTATE, QObject::tr("shuttle change rotating device error")); // 换梭旋转装置 异常 + CASE_OP(ERR_CHB_SHUT, QObject::tr("shuttle shell detection error")); // 梭壳检测 异常 + CASE_OP(ERR_XP_LIT_POSI, QObject::tr("XP positive limit")); // XP正向限位 + CASE_OP(ERR_XP_LIT_NEGA, QObject::tr("XP negative limit")); // XP反向限位 + CASE_OP(ERR_YP_LIT_POSI, QObject::tr("YP positive limit")); // YP正向限位 + CASE_OP(ERR_YP_LIT_NEGA, QObject::tr("YP negative limit")); // YP反向限位 + CASE_OP(ERR_1UP_SEND_C, QObject::tr("upper 1 cloth feeding cylinder error")); // 送压布条1上气缸 异常 + CASE_OP(ERR_1UP_PUSH_S, QObject::tr("upper 1 cloth pressing cylinder error")); // 压布条1上气缸 异常 + CASE_OP(ERR_1UP_SEND_P, QObject::tr("upper 1 inner cloth feeding cylinder error")); // 送内压布1上气缸 异常 + CASE_OP(ERR_1UP_PUSH_C, QObject::tr("upper 1 cloth pressing cylinder error")); // 压布1上气缸 异常 + CASE_OP(ERR_1UP_IN_PUSH_C, QObject::tr("upper 1 inner cloth pressing cylinder error")); // 内压布1上气缸 异常 + CASE_OP(ERR_1DW_SEND_C, QObject::tr("lower 1 cloth feeding cylinder error")); // 送压布条1下气缸 异常 + CASE_OP(ERR_1DW_PUSH_S, QObject::tr("lower 1 cloth pressing cylinder error")); // 压布条1下气缸 异常 + CASE_OP(ERR_1DW_SEND_P, QObject::tr("lower 1 inner cloth feeding cylinder error")); // 送内压布1下气缸 异常 + CASE_OP(ERR_1DW_PUSH_C, QObject::tr("lower 1 cloth pressing cylinder error")); // 压布1下气缸 异常 + CASE_OP(ERR_1DW_IN_PUSH_C, QObject::tr("lower 1 inner cloth pressing cylinder error")); // 内压布1下气缸 异常 + CASE_OP(ERR_TENS1_ERR, QObject::tr("tension sensor 1 communication error")); // 张力传感器1通讯 异常 + CASE_OP(ERR_TENS2_ERR, QObject::tr("tension sensor 2 communication error")); // 张力传感器2通讯 异常 + CASE_OP(ERR_FEED_LIMT, QObject::tr("feeding rack edge limit")); // 上料架对边限位 + CASE_OP(ERR_IN_WAIT_AREA, QObject::tr("entered waiting area")); // 进入等待区域 + CASE_OP(ERR_HOT_LINE, QObject::tr("hot line cylinder not in position")); // 烫线气缸未到位 + + CASE_OP(ERR_CHB_SPIN, QObject::tr("shuttle change rotating device error")); // 换梭旋转装置 异常 + CASE_OP(ERR_CHB_DPUSH, QObject::tr("shuttle change thread pushing telescopic device error")); // 换梭扣线伸缩装置 异常 + + CASE_OP(ERR_PUNCH3_NOT_ZERO, QObject::tr("punch 3 spindle not at zero position")); // 冲孔3主轴不在零位 + CASE_OP(ERR_PUNCH4_NOT_ZERO, QObject::tr("punch 4 spindle not at zero position")); // 冲孔4主轴不在零位 + + CASE_OP(ERR_CUT_PRESS, QObject::tr("lamination cutting press bar device error")); // 覆膜切料压杠装置 异常 + CASE_OP(ERR_LAMIN_FILM1, QObject::tr("lamination clamping device 1 error")); // 覆膜夹膜装置1 异常 + CASE_OP(ERR_LAMIN_FILM2, QObject::tr("lamination clamping device 2 error")); // 覆膜夹膜装置2 异常 + CASE_OP(ERR_FEED_EMP, QObject::tr("lamination feeding empty slot error")); // 覆膜送料空位 异常 + + CASE_OP(ERRQUI_UPER_TBREAK1, QObject::tr("Head 1 has a broken surface wire")); // 机头1面线断线 + CASE_OP(ERRQUI_UPER_TBREAK2, QObject::tr("Head 2 has a broken surface wire")); // 机头2面线断线 + CASE_OP(ERRQUI_LIFT_TIMEOUT, QObject::tr("Head lifting timeout")); // 机头升降超时 + CASE_OP(ERRQUI_CHANGE_BOBBIN, QObject::tr("Replacing the shuttle core")); // 更换梭芯 + CASE_OP(ERRQUI_CHANGE_ERR, QObject::tr("Shuttle Change Device Alarm")); // 换梭装置报警 + CASE_OP(ERRQUI_CHANGE_SHUTDISK, QObject::tr("Replace Shuttle Disk")); // 更换梭盘 + CASE_OP(ERR_UPER_TBREAK_UP, QObject::tr("The upper cable is broken")); // 上排线断线 + CASE_OP(ERR_UPER_TBREAK_DW, QObject::tr("Offline broken wire")); // 下排线断线 + CASE_OP(ERR_PRODUCTION_LINE, QObject::tr("Production line alarm")); // 产线报警 + + CASE_OP(ERRQUI_FEED_ROLLER, QObject::tr("Feed pressure roller error")); // 进料压辊异常 + CASE_OP(ERRQUI_DIS_ROLLER, QObject::tr("Discharge pressure roller error")); // 出料压辊异常 + CASE_OP(ERRQUI_DIS_MATERIAL, QObject::tr("Discharging and pressing materials error")); // 出料压料异常 + CASE_OP(ERRQUI_TENS_DEVICE, QObject::tr("Tensioning device error")); // 张紧装置异常 + CASE_OP(ERRQUI_CLOTH_DEVICE, QObject::tr("Cloth clamping device error")); // 夹布装置异常 + CASE_OP(ERRQUI_EDGE_MOTOR, QObject::tr("Edge cutting motor blockage")); // 边切电机阻塞 + CASE_OP(ERRQUI_CROSS_MOTOR, QObject::tr("Transverse motor error")); // 横切电机异常 + + CASE_OP(ERR_BEDSEET_ERR1, QObject::tr("Abnormal cutting ultrasonic lifting cylinder")); // 裁切超声波升降气缸异常 + CASE_OP(ERR_BEDSEET_ERR2, QObject::tr("Abnormal lifting cylinder of cutting blade")); // 裁切切刀升降气缸异常 + CASE_OP(ERR_BEDSEET_ERR3, QObject::tr("Abnormal cutting and ejection cylinder")); // 裁切顶出气缸异常 + CASE_OP(ERR_BEDSEET_ERR4, QObject::tr("Abnormal clamping cylinder before cutting")); // 裁切前夹料气缸异常 + CASE_OP(ERR_BEDSEET_ERR5, QObject::tr("Abnormal feeding cylinder after cutting")); // 裁切后上夹料气缸异常 + CASE_OP(ERR_BEDSEET_ERR6, QObject::tr("Abnormal lower clamping cylinder after cutting")); // 裁切后下夹料气缸异常 + CASE_OP(ERR_BEDSEET_ERR7, QObject::tr("Abnormal cutting gripper")); // 裁切夹爪异常 + CASE_OP(ERR_BEDSEET_ERR8, QObject::tr("Abnormal position of the material pulling motor")); // 拉料电机位置异常 + CASE_OP(ERR_BEDSEET_ERR9, QObject::tr("Abnormal position of cross cutting motor")); // 横切电机位置异常 + CASE_OP(ERR_BEDSEET_ERRA, QObject::tr("Stop material storage")); // 储料停止 + CASE_OP(ERR_BEDSEET_ERRB, QObject::tr("Right seam broken line")); // 右边缝断线 + CASE_OP(ERR_BEDSEET_ERRC, QObject::tr("Left seam broken line")); // 左边缝断线 + CASE_OP(ERR_BEDSEET_ERRD, QObject::tr("Replace the shuttle core")); // 更换梭芯 + CASE_OP(ERR_BEDSEET_ERRE, QObject::tr("Not meeting the material pulling conditions")); // 未满足拉料条件 + CASE_OP(ERR_BEDSEET_ERRF, QObject::tr("Material delivery timeout")); // 物料输送超时 + CASE_OP(ERR_BEDSEET_ERR10, QObject::tr("Materials not taken away")); // 物料未取走 + CASE_OP(ERR_BEDSEET_ERR11, QObject::tr("Feeding limit")); // 送料限位 + CASE_OP(ERR_BEDSEET_ERR12, QObject::tr("The machine head is short of material")); // 机头缺料 + + CASE_OP(ERRQUI_INSTALLMENT_OK, QObject::tr("Password set successfully")); // 密码设置成功 + CASE_OP(ERRQUI_INSTALLMENT_FAIL, QObject::tr("Password setting failed")); // 密码设置失败 + CASE_OP(ERRQUI_MOTO_N_ALM, QObject::tr("Needle motor alarm")); // 针电机报警 + CASE_OP(ERRQUI_MOTO_H_ALM, QObject::tr("Shuttle motor alarm")); // 梭电机报警 + CASE_OP(ERRQUI_MOTO_X_ALM, QObject::tr("X motor alarm")); // X电机报警 + CASE_OP(ERRQUI_MOTO_Y_ALM, QObject::tr("Y motor alarm")); // Y电机报警 + CASE_OP(ERRQUI_MOTO_U_ALM, QObject::tr("U motor alarm")); // U电机报警 + CASE_OP(ERRQUI_MOTO_N_FZ, QObject::tr("Needle motor zeroing failure")); // 针电机归零失败 + CASE_OP(ERRQUI_MOTO_H_FZ, QObject::tr("Shuttle motor zeroing failure")); // 梭电机归零失败 + CASE_OP(ERRQUI_MOTO_X_FZ, QObject::tr("Zero reset failure of X motor")); // X电机归零失败 + CASE_OP(ERRQUI_MOTO_Y_FZ, QObject::tr("Y motor zeroing failed")); // Y电机归零失败 + CASE_OP(ERRQUI_CS_TIMEOUT, QObject::tr("Communication timeout from the board")); // 从板通讯超时 + CASE_OP(ERRQUI_MOTO_X_ZERO, QObject::tr("X motor is not at zero position")); // X电机不在零位 + + //通用的状态信息 + CASE_OP(STA_NORMAL_STOP, QObject::tr("Normal stop")); // 正常停止 + CASE_OP(STA_MTZ_SUCCESS, QObject::tr("Find zero success")); // 归零成功 + CASE_OP(STA_WORK_PAUSE, QObject::tr("work pause")); // 工作暂停 + CASE_OP(STA_WORK_OVER, QObject::tr("End of work")); // 工作结束 + CASE_OP(STA_WORK_FINISH, QObject::tr("Work done")); // 工作完成 + CASE_OP(STA_WORK_DONE, QObject::tr("Complete production")); // 完成产量 + CASE_OP(STA_EXEC_SUCCESS, QObject::tr("Execute success")); // 执行成功 + CASE_OP(STA_EXEC_FAILED, QObject::tr("Execute false")); // 执行失败 + CASE_OP(STA_WAIT_FILE, QObject::tr("wait file")); // 等待文件 + CASE_OP(STA_CHANGE_BOBBIN, QObject::tr("change the bobbin")); // 更换梭芯 + CASE_OP(STA_PROCESS_FINISH, QObject::tr("Execute finish")); // 执行完成 + CASE_OP(STA_PROCESS_RUNNING, QObject::tr("Execute runnibng")); // 执行过程中 + + default: + //errorCode.sprintf("CODE 0x%x", code); + //errinfo.append(QObject::tr("Undefined error,") + errorCode); + break; + } + return errinfo; +} diff --git a/machine/error.h b/machine/error.h new file mode 100644 index 0000000..4f642db --- /dev/null +++ b/machine/error.h @@ -0,0 +1,11 @@ +#ifndef ERROR_H +#define ERROR_H + +#include +#include "comm/typedef.h" + + +QString getErrStr(u32 code); + + +#endif // ERROR_H diff --git a/machine/gatewaytcpclient.cpp b/machine/gatewaytcpclient.cpp new file mode 100644 index 0000000..8317e42 --- /dev/null +++ b/machine/gatewaytcpclient.cpp @@ -0,0 +1,334 @@ +#include "gatewaytcpclient.h" + +#include +#include +#include + +GatewayTcpClient::GatewayTcpClient(QObject *parent) : + QObject(parent), + m_pClientSocket(NULL), + m_pConnectCheckTimer(NULL), + m_connected(0), + m_pConnectDetectThread(NULL), + m_pConnectDetect(NULL), + m_detect(0), + m_localip(DEF_LOCAL_IP), + m_localport(DEF_LOCAL_PORT), + m_serverip(DEF_SERVER_IP), + m_serverport(DEF_SERVER_PORT) +{ + m_pClientSocket = new QBindTcpSocket(this); + m_pClientSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + connect(m_pClientSocket, SIGNAL(readyRead()), this, SLOT(receiveServerData())); + connect(m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(displaySocketError(QAbstractSocket::SocketError))); + // connect(m_pClientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(netStateChanged(QAbstractSocket::SocketState))); + + m_pConnectCheckTimer = new QTimer(this); + connect(m_pConnectCheckTimer, SIGNAL(timeout()), this, SLOT(connectCheck())); + + + m_pConnectDetectThread = new QThread(); +} + +GatewayTcpClient::~GatewayTcpClient() +{ + m_pConnectCheckTimer->stop(); + delete m_pConnectCheckTimer; + + m_pClientSocket->disconnectFromHost(); + m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + delete m_pClientSocket; + + if (m_connected != 0) + { + m_pConnectDetectThread->quit(); + m_pConnectDetectThread->wait(); + } + + delete m_pConnectDetectThread; +} + +void GatewayTcpClient::setConfigFileName(QString configfilename) +{ + m_configFileName = configfilename; +} + +void GatewayTcpClient::connectToServer() +{ + if (m_pClientSocket == NULL) + { + qDebug() << "m_pClientSocket not alloc"; + return; + } + + if (m_connected == 0) + { + loadIpAndPort(); + if (m_pConnectDetect == NULL) + { + m_pConnectDetect = new TcpConnectDetect; + } + qDebug() << "GatewayTcpClient::connectToServer()"; + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + + m_pConnectDetect->setIpAndPort(m_localip, m_localport, m_serverip, m_serverport); + + m_pConnectDetect->moveToThread(m_pConnectDetectThread); + + connect(this, SIGNAL(siDetectHost()), m_pConnectDetect, SLOT(connectDetect()), Qt::QueuedConnection); + connect(m_pConnectDetect, SIGNAL(siConnectSta(int)), this, SLOT(detectStatus(int)), Qt::QueuedConnection); + + // 20191226由于检测线程会造成网络重连,所以将检测线程注释 lft +/* + connect(m_pConnectDetectThread, SIGNAL(started()), m_pConnectDetect, SLOT(detectStart()) ); + connect(m_pConnectDetectThread, SIGNAL(finished()), m_pConnectDetect, SLOT(deleteLater()) ); // 退出删除对象 + + m_pConnectDetectThread->start(); // 启动线程 +*/ + m_pConnectCheckTimer->start(1000); + m_connected = 1; + m_detect = 1; + } +} + +void GatewayTcpClient::disConnectFromServer() +{ + if (m_connected != 0) + { + m_pConnectCheckTimer->stop(); + + if (m_pClientSocket != NULL) + { + m_pClientSocket->disconnectFromHost(); + m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + } + + m_pConnectDetectThread->quit(); + m_pConnectDetectThread->wait(); + + m_connected = 0; + m_detect = 0; + } +} + +void GatewayTcpClient::loadIpAndPort() +{ + if (!m_configFileName.isEmpty()) + { + //物联网客户端与mqtt网关服务器建立连接 + QSettings configIni(m_configFileName, QSettings::IniFormat); + QString serverip, localip; + quint16 serverport, localport; + + serverip = configIni.value("server/ip", QVariant("192.168.1.128")).toString(); //coco 临时更改物联网服务器IP,之前IP和主板相同,导致界面重启后无法和主板联网 + serverport = configIni.value("server/port", QVariant(8001)).toInt(); + localip = configIni.value("local/ip", QVariant("192.168.16.41")).toString(); + localport = configIni.value("local/port", 5001).toInt(); + + // 回写参数 + configIni.setValue("server/ip", serverip); + configIni.setValue("server/port", serverport); + configIni.setValue("local/ip", localip); + configIni.setValue("local/port", localport); + + m_localip = localip; + m_localport = localport; + m_serverip = serverip; + m_serverport = serverport; + } +} + +// 发送数据的槽 +void GatewayTcpClient::slotSendData(QByteArray dat) +{ + if (m_pClientSocket != NULL) + { + m_pClientSocket->write(dat); + } +} + +// 自动检测连接 +void GatewayTcpClient::connectCheck() +{ + if (m_pClientSocket == NULL) + { + qDebug() << "Socket is not alloced"; + return; + } + +// qDebug() << "check client connect"; + if (m_connected == 1) + { + if (m_localip.isEmpty() == false) + { + m_pClientSocket->bindAddrAndPort(m_localip, m_localport); + } + m_pClientSocket->abort(); + m_pClientSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + m_pClientSocket->connectToHost(m_serverip, m_serverport); + int rslt = m_pClientSocket->waitForConnected(2000); + if (rslt == 0) + { + + } + /* + qDebug("bind connect and waitForConnected 2000, rslt=%d", rslt); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + */ + m_connected = 2; + } + else if (m_connected != 0) + { + switch(m_pClientSocket->state()) + { + case QAbstractSocket::ConnectedState: + { + if (m_connected != 3) + { + /* + qDebug() << "net State is Connected"; + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + */ + m_connected = 3; // 检测连接状态 + } + + break; + } + case QAbstractSocket::ConnectingState: + { + if (m_connected != 2) + { + qDebug() << "net State is Connecting"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + } + m_connected = 2; + break; + } + case QAbstractSocket::UnconnectedState: + { + if (m_connected != 1) + { + // qDebug() << "net State is unconnected"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + } + m_connected = 1; + break; + } + default: + { + /* + QAbstractSocket::HostLookupState + QAbstractSocket::BoundState + QAbstractSocket::ListeningState + QAbstractSocket::ClosingState + */ + { + qDebug("net State is %d\r\n", m_pClientSocket->state()); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + } + m_connected = 1; + } + } + } + else + { + + } + + if (m_connected == 3) // 已连接 + { + if (m_detect == 1) + { + // qDebug() << "Machine " << QThread::currentThread(); + m_detect = 0; + emit(siDetectHost()); + // qDebug() << "after send SiDetectHost "; + } + } + + emit (siConnectSta(m_connected)); // 网络连接信号 +} + +void GatewayTcpClient::detectStatus(int sta) +{ + // qDebug("host detect sta=%d", sta); + + m_detect = 1; + if (sta == 1) // 网络已断开 + { + qDebug("disconnect ClientSocket by detect"); + m_pClientSocket->disconnectFromHost(); +// m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + m_connected = 1; + } + else if (sta == 2) // 网络连接还在 + { + + } + else + { + + } +} + +void GatewayTcpClient::receiveServerData() +{ + if (m_pClientSocket != NULL) + { + QByteArray tmpDat; + tmpDat = m_pClientSocket->readAll(); // 读取 +// qDebug("ReceiveServerData, size = %d", tmpDat.size()); +// PrintAsHex(&tmpDat); + + emit(siReceiveData(tmpDat)); // 发送收到数据信号 + } +} + +void GatewayTcpClient::displaySocketError(QAbstractSocket::SocketError err) +{ + QString errinfo; + + errinfo.sprintf("Err: code=%d, errorString=", err); + errinfo += m_pClientSocket->errorString(); + +// qDebug() << errinfo; + + emit(siConnectErr(errinfo)); // 网络错误信息 +} + +void GatewayTcpClient::netStateChanged(QAbstractSocket::SocketState sta) +{ + switch (sta) + { + /* + case UnconnectedState: + case HostLookupState: + case ConnectingState: + case ConnectedState: + case BoundState: + case ListeningState: + case ClosingStat: + */ + default: + break; + } + +} +void GatewayTcpClient::hostFound() +{ + qDebug("found host"); +} + + + + + + + diff --git a/machine/gatewaytcpclient.h b/machine/gatewaytcpclient.h new file mode 100644 index 0000000..6840275 --- /dev/null +++ b/machine/gatewaytcpclient.h @@ -0,0 +1,72 @@ +#ifndef GATEWAYTCPCLIENT_H +#define GATEWAYTCPCLIENT_H + +#include +#include +#include +#include +#include +#include +#include + +#include "qbindtcpsocket.h" + +class ConnectDetectThread; + + +class GatewayTcpClient : public QObject +{ + Q_OBJECT +public: + explicit GatewayTcpClient(QObject *parent = NULL); + virtual ~GatewayTcpClient(); + +public: + void setConfigFileName(QString configfilename); +signals: + void siConnectSta(int sta); // 网络连接信号 + void siConnectErr(QString errinfo); // 网络错误信息 + void siReceiveData(QByteArray dat); // 收到数据包信号 +signals: + void siDetectHost(void); +public: + + +public slots: + void slotSendData(QByteArray dat); // 发送数据的槽 + void connectToServer();//连接到服务器 + void disConnectFromServer(); + void detectStatus(int); +public: + +private slots: + void connectCheck(); + void receiveServerData(); + void displaySocketError(QAbstractSocket::SocketError err); + void netStateChanged(QAbstractSocket::SocketState sta); + void hostFound(); + +private: + void loadIpAndPort(); +private: + QBindTcpSocket * m_pClientSocket; + + QTimer * m_pConnectCheckTimer; + +public: + int m_connected; // 连接状态; 0, 初始化; 1, 未连接; 2, 连接中; 3, 已连接 + +private: + QThread * m_pConnectDetectThread; + TcpConnectDetect * m_pConnectDetect; + int m_detect; // 连接测试状态 +private: + QString m_configFileName; +private: + QString m_localip; + quint16 m_localport; + QString m_serverip; + quint16 m_serverport; +}; + +#endif // GATEWAYTCPCLIENT_H diff --git a/machine/lotmachine.cpp b/machine/lotmachine.cpp new file mode 100644 index 0000000..83de901 --- /dev/null +++ b/machine/lotmachine.cpp @@ -0,0 +1,290 @@ +#include "lotmachine.h" +#include +#include + +LotMachine::LotMachine(QObject *parent) : + QObject(parent), + m_pTcpThread(NULL), + m_pTcpClient(NULL), + m_pComThread(NULL), + m_pComPort(NULL), + m_startComm(0) +{ + m_receiveBuff.clear(); + m_keyBuff.clear(); + m_reFlag = 0; + m_connected = 0; +} + +LotMachine::~LotMachine() +{ + if (m_startComm != 0) + { + if(m_connectMode == USE_TCP_COMM) + { + m_pTcpThread->quit(); + m_pTcpThread->wait(); + } + else if(m_connectMode == USE_SERIAL_COMM) + { + m_pComThread->quit(); + m_pComThread->wait(); + } + } + + if(m_connectMode == USE_TCP_COMM) + { + if(m_pTcpThread != NULL) + { + delete m_pTcpThread; + } + } + else if(m_connectMode == USE_SERIAL_COMM) + { + if(m_pComThread != NULL) + { + delete m_pComThread; + } + } +} + +//初始化通讯连接方式 +void LotMachine::initConnectMode(s16 val) +{ + m_connectMode = val; + if(m_connectMode == USE_TCP_COMM)//网口 + { + m_pTcpThread = new QThread(); + m_pTcpClient = new GatewayTcpClient(); + } + else if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComThread = new QThread(); + m_pComPort = new ComPort(); + connect(m_pComPort, SIGNAL(siSerialPortOpenState(int)), this, SLOT(slotIfOpenSerialPort(int)) ); + } +} + +void LotMachine::setConfigFileName(QString configfilename) +{ + m_configFileName = configfilename; + if(m_connectMode == USE_TCP_COMM)//网口 + { + m_pTcpClient->setConfigFileName(m_configFileName); + } +} + +//设置串口名称 +void LotMachine::setComportName(QString portName) +{ + if(m_pComPort == NULL) + { + return; + } + + if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComPort->setComPortName(portName); + } +} + +QString LotMachine::getConfigFileName() +{ + return m_configFileName; +} + +int LotMachine::startCommunication() +{ + if (m_startComm == 0) + { + // qDebug() << "Machine " << QThread::currentThread(); + + if(m_connectMode == USE_TCP_COMM)//网口 + { + if (m_configFileName.isEmpty()) + { + qDebug() << "mast call SetConfigFileName first "; + } + + m_pTcpClient->moveToThread(m_pTcpThread); // 移动对象到线程中 + + // connect(qApp, SIGNAL(finished()), m_pTcpThread, SLOT(finished())); + + connect(m_pTcpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) ); + connect(m_pTcpThread, SIGNAL(finished()), m_pTcpClient, SLOT(deleteLater()) ); // 退出删除对象 + + connect(m_pTcpClient, SIGNAL(siConnectSta(int)), + this, SLOT(slotConnectSta(int)), Qt::AutoConnection); // 连接状态改变 + connect(m_pTcpClient, SIGNAL(siConnectErr(QString)), + this, SLOT(slotConnectErr(QString)), Qt::AutoConnection); // 接收到通讯错误 + connect(m_pTcpClient, SIGNAL(siReceiveData(QByteArray)), + this, SLOT(slotReceiveData(QByteArray)), Qt::AutoConnection); // 接收到数据 + connect(this, SIGNAL(siSendData(QByteArray)), + m_pTcpClient, SLOT(slotSendData(QByteArray)), Qt::AutoConnection); // 发送数据的槽 + + m_pTcpThread->start(); // 启动线程 + } + + if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComPort->moveToThread(m_pComThread); + + connect(m_pComThread, SIGNAL(started()), m_pComPort, SLOT(initComm()) ); + connect(m_pComThread, SIGNAL(finished()), m_pComPort, SLOT(deleteLater()) ); // 退出删除对象 + + connect(m_pComPort, SIGNAL(siReceiveData(QByteArray)), + this, SLOT(slotReceiveData(QByteArray)), Qt::QueuedConnection); // 接收到数据 + connect(this, SIGNAL(siSendData(QByteArray)), + m_pComPort, SLOT(slotSendData(QByteArray)), Qt::QueuedConnection); // 发送数据的槽 + + m_pComThread->start(); // 启动线程 + } + m_startComm = 1; + } + return m_startComm; +} + +// 连接状态改变的槽函数 +void LotMachine::slotConnectSta(int sta) +{ + // qDebug() << "SlotConnectSta" << sta; + if(m_connected != sta) + { + m_connected = sta; + if(m_connected == 3)//已连接 + { + emit siConnectToMqtt(); + } + } +} + +// 接收到通讯错误槽函数 +void LotMachine::slotConnectErr(QString errinfo) +{ + Q_UNUSED(errinfo); +// qDebug() << "LotMachine::SlotConnectErr" << errinfo; +} + + +// 接收到数据的槽函数 +void LotMachine::slotReceiveData(QByteArray dat) +{ + m_receiveBuff.append(dat); + int size = m_receiveBuff.length(); + QString str = m_receiveBuff; + if(str == "success") + { + m_receiveBuff.remove(0, size); + return; + } + + //QString rackNumStr = getJsonValue("device");//机架号 + QString bootCmd = getJsonValue("data","boot");//执行命令 + + if(bootCmd.length() > 0) + { + emit siRunLotDataAction(bootCmd); + } + + m_receiveBuff.remove(0, size); +} + +//串口是否打开 +void LotMachine::slotIfOpenSerialPort(int val) +{ + if(val != 0) + { + if(m_connectMode == USE_SERIAL_COMM) + { + m_connected = 3;//串口已打开 + } + } +} + +//获取键值对属性值 +QString LotMachine::getJsonValue(QString name1, QString name2) +{ + QString rstr; + rstr.clear(); + + if(name1.length() <= 0 && name2.length() <= 0) + { + return rstr; + } + + //QString str = "{\"device\":\"xiuhuaji133\",\"data\":{\"boot\":9}}"; + QString str = m_receiveBuff; + + QStringList vallist; + if(str.indexOf(",") == -1) + { + return rstr; + } + else + { + vallist = str.split(",", QString::SkipEmptyParts); + } + + if(name2.length() <= 0) + { + if(vallist.size() >= 1) + { + QStringList vallist1; + if(QString(vallist[0]).indexOf(":") == -1) + { + return rstr; + } + else + { + vallist1 = QString(vallist[0]).split(":", QString::SkipEmptyParts); + } + + if(QString(vallist1[0]).indexOf(name1) == -1) + { + return rstr; + } + else + { + rstr = QString(vallist1[1]).remove("\""); + } + } + } + else + { + if(vallist.size() >= 2) + { + QStringList vallist1; + if(QString(vallist[1]).indexOf(":") == -1) + { + return rstr; + } + else + { + vallist1 = QString(vallist[1]).split(":", QString::SkipEmptyParts); + } + + for(int i = 0; i < vallist1.size(); i++) + { + if(QString(vallist1[i]).indexOf(name2) != -1) + { + if(i+1 < vallist1.size()) + { + rstr = QString(vallist1[i+1]).remove("\"").remove("}"); + } + } + } + } + } + + return rstr; +} + +//发送物联数据到网关 +void LotMachine::sendLotDataToGateway(QString str) +{ + QByteArray dat; + dat.clear(); + dat = str.toLatin1(); + + emit(siSendData(dat)); +} diff --git a/machine/lotmachine.h b/machine/lotmachine.h new file mode 100644 index 0000000..f47c28c --- /dev/null +++ b/machine/lotmachine.h @@ -0,0 +1,73 @@ +#ifndef LOTMACHINE_H +#define LOTMACHINE_H + +#include "gatewaytcpclient.h" +#include "comport.h" +#include "comm/typedef.h" + +#include +#include +#include +#include + +#define USE_TCP_COMM 0 +#define USE_SERIAL_COMM 1 + +class LotMachine: public QObject +{ + Q_OBJECT + +public: + explicit LotMachine(QObject *parent = NULL); + virtual ~LotMachine(); + +public: + void initConnectMode(s16 val = 0);//初始化通讯连接方式 + void setConfigFileName(QString configfilename); + void setComportName(QString portName);//设置串口名称 + QString getConfigFileName(); + int startCommunication(); + +private: + QString m_configFileName; + QByteArray m_receiveBuff;//接收到的buf + QByteArray m_keyBuff;//键值对buf + s16 m_reFlag; + +private: + s16 m_connectMode; //通讯连接方式 0:网口,1:串口 + // 通讯线程和网络连接 + QThread * m_pTcpThread; + GatewayTcpClient * m_pTcpClient; + QThread * m_pComThread; + ComPort * m_pComPort; + + // 连接 +public: + inline int isConnected() const { return m_connected; } + +private: + int m_startComm; + int m_connected; // 机器连接状态. 0, 未连接; 1, 连接中; 2, + +signals: // 发送数据到机器的信号 + void siSendData(QByteArray dat); + void siRunLotDataAction(QString cmd);//执行物联网数据动作 + void siConnectToMqtt();//与网关已连接 + +private slots: // 和线程通讯的槽 + void slotConnectSta(int sta); // 连接状态改变的槽函数 + void slotConnectErr(QString errinfo); // 接收到通讯错误槽函数 + void slotReceiveData(QByteArray dat); // 接收到数据的槽函数 + void slotIfOpenSerialPort(int val);//串口是否打开 + +private: + QString getJsonValue(QString name1,QString name2 = NULL);//获取键值对属性值 + +public: + void sendLotDataToGateway(QString str);//发送物联数据到网关 + +}; + +#endif // LOTMACHINE_H + diff --git a/machine/machine.cpp b/machine/machine.cpp new file mode 100644 index 0000000..f00b419 --- /dev/null +++ b/machine/machine.cpp @@ -0,0 +1,2087 @@ +#include "machine.h" +#include +#include + +/* +Machine的dll如果是Release版本的在应用程序中只能在Release下调用, +否则调用不成功(连接不上),Machine的dll如果是Debug版本, +应用程序中在Debug下调用成功; +*/ + +//------------------------------------------ + +QByteArray g_receiveBuff; +DataExFuns g_exfuns = {NULL,NULL,NULL,NULL,NULL}; + +// 发送数据 +int operatorSendData(u8 * pDatBuf, int len) +{ + if (pDatBuf != NULL && len != 0) + { + // 不准备通过该函数发送数据 + } + return 0; +} + +// 得到发送缓冲区空闲长度 +int operatorGetSdFreeLen(void) +{ + return 0; // 认没有空间 +} + +// 接收数据 +int operatorGetData(u8 * pDat, int expectLen) +{ + int len = g_receiveBuff.size(); + if (len > expectLen) + { + len = expectLen; + } + + //if (len != 0 && pDat != NULL) + if (len == expectLen && pDat != NULL) //使len等于expectLen(串口下接收数据暴露的问题) + { + memcpy(pDat, g_receiveBuff.data(), len); + g_receiveBuff.remove(0, len); + } + else + { + len = 0; + } + + return len; +} + +// 已接收数据长度 +int operatorGetRsLen(void) +{ + return g_receiveBuff.size(); +} + +void delayMs(u32 ms) +{ + QDateTime oldTime, curTime; + oldTime = QDateTime::currentDateTime(); + while(1) + { + curTime = QDateTime::currentDateTime(); + if(oldTime.msecsTo(curTime) > ms) + { + break; + } + } +} + +void initDataExFuns(void) +{ + g_exfuns.sendCommData = operatorSendData; + g_exfuns.getCommData = operatorGetData; + g_exfuns.getRsvLen = operatorGetRsLen; + g_exfuns.getTrsFreeLen = operatorGetSdFreeLen; + + g_exfuns.delay = delayMs; +} + +//------------------------------------------ + + +Machine::Machine(QObject *parent) : + QObject(parent), + m_pTcpThread(NULL), + m_pTcpClient(NULL), + m_pComThread(NULL), + m_pComPort(NULL), + m_startComm(0) +{ + memset(&m_mcStatus, 0, sizeof(MCStatus)); // 机器状态 + memset(&m_mcPara, 0, sizeof(ParaStruct)); // 机器参数信息 + memset(&m_wkPara, 0, sizeof(ParaStruct)); // 工作参数信息 + memset(&m_mcPrePara, 0, sizeof(ParaStruct)); // 机器预留参数信息 + memset(&m_wkPrePara, 0, sizeof(ParaStruct)); // 工作预留参数信息 + memset(&m_mcInfo,0,sizeof(MCInfo)); // 机器信息 + memset(&m_lotData,0,sizeof(McLotData)); // 物联数据 + + memset(&m_sensorsStaDat, 0, sizeof(SensorsBitmap)); // 传感器信号状态位图 + memset(&m_sensorEnBmp, 0, sizeof(SensorsBitmap)); // 传感器信号有效位图 + + memset(&m_transCtrl, 0, sizeof(FileTransCtrl)); // 文件传输信息 + + m_pSendTimer = new QTimer(this); + m_pSendTimer->setInterval(100); // 设置定时间隔100毫秒 + connect(m_pSendTimer, SIGNAL(timeout()), this, SLOT(onSendTimer())); + m_transCtrl.pFileHead = new DataDs16FileHead; + m_transCtrl.pAppHead = new AppFileHead; + m_transCtrl.pDatBuff = new u8[MAX_FILE_SIZE]; + m_startComm = 0; + m_connected = 0; + m_statusEn = 0; + m_mcParaEn = 0; + m_wkParaEn = 0; + m_gainParaEn = 0; + m_mcPreParaEn = 0; + m_wkPreParaEn = 0; + m_sensorStaEn = 0; + m_sensorBmpEn = 0; + + m_statusToggle = 0; + m_fileTransEn = 0; + m_transBreak = 0; + m_totalSendNum = 0; + m_totalPacketNum = 0; + m_connectMode = 0; + + initDataExFuns(); +} + +Machine::~Machine() +{ + if (m_startComm != 0) + { + if(m_connectMode == USE_TCP_COMM) + { + m_pTcpThread->quit(); + m_pTcpThread->wait(); + } + else if(m_connectMode == USE_SERIAL_COMM) + { + m_pComThread->quit(); + m_pComThread->wait(); + } + } + if (m_transCtrl.pFileHead != NULL) + { + delete []m_transCtrl.pFileHead; + m_transCtrl.pFileHead = NULL; + } + if (m_transCtrl.pDatBuff != NULL) + { + delete []m_transCtrl.pDatBuff; + m_transCtrl.pDatBuff = NULL; + } + + if(m_connectMode == USE_TCP_COMM) + { + if(m_pTcpThread != NULL) + { + delete m_pTcpThread; + } + } + else if(m_connectMode == USE_SERIAL_COMM) + { + if(m_pComThread != NULL) + { + delete m_pComThread; + } + } +} + +//初始化通讯连接方式 +void Machine::initConnectMode(s16 val) +{ + m_connectMode = val; + if(m_connectMode == USE_TCP_COMM)//网口 + { + m_pTcpThread = new QThread(); + m_pTcpClient = new TcpClient(); + } + else if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComThread = new QThread(); + m_pComPort = new ComPort(); + connect(m_pComPort, SIGNAL(siSerialPortOpenState(int)), this, SLOT(slIfOpenSerialPort(int)) ); + } +} + +void Machine::setConfigFileName(QString configfilename) +{ + m_configFileName = configfilename; + if(m_connectMode == USE_TCP_COMM)//网口 + { + m_pTcpClient->setConfigFileName(m_configFileName); + } +} + +//设置串口名称 +void Machine::setComportName(QString portName) +{ + if(m_pComPort == NULL) + { + return; + } + + if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComPort->setComPortName(portName); + } +} + +QString Machine::getConfigFileName() +{ + return m_configFileName; +} + +int Machine::startCommunication() +{ + if (m_startComm == 0) + { + // qDebug() << "Machine " << QThread::currentThread(); + + if(m_connectMode == USE_TCP_COMM)//网口 + { + if (m_configFileName.isEmpty()) + { + qDebug() << "mast call SetConfigFileName first "; + } + + m_pTcpClient->moveToThread(m_pTcpThread); // 移动对象到线程中 + + // connect(qApp, SIGNAL(finished()), m_pTcpThread, SLOT(finished())); + + connect(m_pTcpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) ); + connect(m_pTcpThread, SIGNAL(finished()), m_pTcpClient, SLOT(deleteLater()) ); // 退出删除对象 + + connect(m_pTcpClient, SIGNAL(siConnectSta(int)), + this, SLOT(slotConnectSta(int)), Qt::AutoConnection); // 连接状态改变 + connect(m_pTcpClient, SIGNAL(siConnectErr(QString)), + this, SLOT(slotConnectErr(QString)), Qt::AutoConnection); // 接收到通讯错误 + connect(m_pTcpClient, SIGNAL(siReceiveData(QByteArray)), + this, SLOT(slotReceiveData(QByteArray)), Qt::AutoConnection); // 接收到数据 + connect(this, SIGNAL(siSendData(QByteArray)), + m_pTcpClient, SLOT(slotSendData(QByteArray)), Qt::AutoConnection); // 发送数据的槽 + + m_pTcpThread->start(); // 启动线程 + } + + if(m_connectMode == USE_SERIAL_COMM)//串口 + { + m_pComPort->moveToThread(m_pComThread); + + connect(m_pComThread, SIGNAL(started()), m_pComPort, SLOT(initComm()) ); + connect(m_pComThread, SIGNAL(finished()), m_pComPort, SLOT(deleteLater()) ); // 退出删除对象 + + connect(m_pComPort, SIGNAL(siReceiveData(QByteArray)), + this, SLOT(slotReceiveData(QByteArray)), Qt::QueuedConnection); // 接收到数据 + connect(this, SIGNAL(siSendData(QByteArray)), + m_pComPort, SLOT(slotSendData(QByteArray)), Qt::QueuedConnection); // 发送数据的槽 + + m_pComThread->start(); // 启动线程 + } + m_startComm = 1; + } + return m_startComm; +} + +// 连接状态改变的槽函数 +void Machine::slotConnectSta(int sta) +{ + m_connected = sta; +} + +// 接收到通讯错误槽函数 +void Machine::slotConnectErr(QString errinfo) +{ + if(errinfo.length() <= 0){} + //qDebug() << "SlotConnectErr" << errinfo; +} + +void Machine::setMcStatusAsMc(u8* buff, int toggle) +{ + memcpy(&m_mcStatus, buff, sizeof(MCStatus)); + m_statusEn = 1; + emit(siStatusChange(toggle)); +} + +// 接收到数据的槽函数 +void Machine::slotReceiveData(QByteArray dat) +{ + int rslt; + DataPacket packet; + OperPacket * operpkt = (OperPacket *)(&packet); + + // qDebug() << "SlotReceiveData size=" << dat.size(); + + g_receiveBuff.append(dat); + //qDebug()<<"append dat size"< 0) // 收到数据包 + { +// qDebug()<<"getANormalPacket rslt="<packet.fldp.cmd; + switch(operpkt->packet.fldp.cmd) // 先按固定长度解析 + { + case DCMD_REQUEST_DAT: // 请求文件数据 + { + if (m_transCtrl.transActive == TRANS_ACTIVE) + { + if (1 && + m_transCtrl.transflag == TRANS_REQUEST && // 请求传输数据模式 + m_transCtrl.fileType == operpkt->dRequestDatBlock.fileType && + m_transCtrl.fileIdx == operpkt->dRequestDatBlock.fileIdx && + m_transCtrl.fileId == operpkt->dRequestDatBlock.fileId && + 1 ) + { + qDebug("in request mode, send block idx=%d", operpkt->dRequestDatBlock.datBlockIdx); + transFileData(m_transCtrl, operpkt->dRequestDatBlock.datBlockIdx); + } + } + break; + } + case DCMD_SEND_MC_INFO: // 发送机器信息 + { + memcpy(&m_mcInfo, operpkt->dSendMcInfo.exData, sizeof(MCInfo)); + emit(siMcInfoChange( )); + + break; + } + + case DCMD_SEND_DEBUG_INFO: // 发送调试信息 + { + memcpy(&m_debugInfo, operpkt->sendDebugInfo.exData, sizeof(DebugInfo)); + emit(siDebugInfo( )); + break; + } + + case DCMD_SEND_MC_STATUS: // 发送机器状态 + { + setMcStatusAsMc(operpkt->dSendMcStatus.exData, operpkt->dSendMcStatus.toggle); + break; + } + + case DCMD_SEND_MC_PARAS: // 发送机器参数 + { + int type; + + type = operpkt->dSendMcParas.paraType; + if (operpkt->dSendMcParas.exLen == sizeof(ParaStruct)) + { + if (type == SEW_MCPARA_MACH || type == SEW_MCPARA_DEF_MC) + { + memcpy(&m_mcPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct)); + m_mcParaEn = 1; + } + else if (type == SEW_MCPARA_WORK || type == SEW_MCPARA_DEF_WK) + { + memcpy(&m_wkPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct)); + m_wkParaEn = 1; + } + //平板切割机(增益) + else if (type == DCMD_SEND_MOTO_GAINPARA) + { + memcpy(&m_gainPara, operpkt->dSendMcParas.exData, sizeof(KnifeGapPara)); + m_gainParaEn = 1; + } + else if (type == SEW_REVMCPARA_MACH || type == SEW_MCPARA_DEF_MC) + { + memcpy(&m_mcPrePara, operpkt->dSendMcParas.exData, sizeof(ParaStruct)); + m_mcPreParaEn = 1; + } + else if (type == SEW_REVMCPARA_WORK || type == SEW_MCPARA_DEF_WK) + { + memcpy(&m_wkPrePara, operpkt->dSendMcParas.exData, sizeof(ParaStruct)); + m_wkPreParaEn = 1; + } + else + { + break; + } + + //因为之前请求了机器参数和工作参数,所以当两个参数都返回时,再触发信号和槽 + // if( m_mcParaEn==1 && m_wkParaEn==1) + { + printf("emit SiParaChange\r\n"); + emit(siParaChange(type, 0)); + } + } + else if (operpkt->dSendMcParas.exLen == sizeof(u32)) + { + int id, idx; + id = operpkt->dSendMcParas.paraId; + idx = id - 1; + if (idx > 0 && idx < PARA_NUM) + { + idx *= sizeof(u32); + if (type == SEW_MCPARA_MACH) + { + memcpy((u8*)(&m_mcPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32)); + m_mcParaEn = 1; + } + else if (type == SEW_MCPARA_WORK) + { + memcpy((u8*)(&m_wkPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32)); + m_wkParaEn = 1; + } + else if (type == DCMD_SEND_MOTO_GAINPARA) + { + memcpy((u8*)(&m_gainPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32)); + m_gainParaEn = 1; + } + else if (type == SEW_REVMCPARA_MACH) + { + memcpy((u8*)(&m_mcPrePara)+idx, operpkt->dSendMcParas.exData, sizeof(u32)); + m_mcPreParaEn = 1; + } + else if (type == SEW_REVMCPARA_WORK) + { + memcpy((u8*)(&m_wkPrePara)+idx, operpkt->dSendMcParas.exData, sizeof(u32)); + m_wkPreParaEn = 1; + } + else + { + break; + } + emit(siParaChange(type, id)); + } + } + + break; + } + case DCMD_SEND_SENSORS: // 发送传感信号 + { + int len; + len = sizeof(SensorsBitmap); + if (len > operpkt->dSendSensors.exLen) + { + len = operpkt->dSendSensors.exLen; + } + memset(m_sensorsStaDat.bitmap, 0, sizeof(SensorsBitmap)); + memcpy(m_sensorsStaDat.bitmap, operpkt->dSendSensors.exData, len); + m_sensorStaEn = 1; + //qDebug("get DCMD_SEND_SENSORS"); + emit(siSensorChange(m_sensorsStaDat)); + break; + } + case DCMD_SEND_FILE_INFO: // 发送文件信息 + { + break; + } + case DCMD_SEND_TRANS_RESULT: // 发送传输结果 + { + printf("get DCMD_SEND_TRANS_RESULT\r\n"); + m_transCtrl.lenBmp = operpkt->dSendTransResult.exLen; + m_transCtrl.transActive = operpkt->dSendTransResult.active; + m_transCtrl.transflag = operpkt->dSendTransResult.result; + if (m_transCtrl.lenBmp != 0) + { + memcpy(m_transCtrl.rsvBitmap, operpkt->dSendTransResult.exData, m_transCtrl.lenBmp); + } + m_fileTransEn = 1; + + emit (siTransResultChange()); + + break; + } + case DCMD_SEND_SENSOR_BMP: // 传感器信号有效位图 + { + int len; + len = sizeof(SensorsBitmap); + if (len > operpkt->dSendSensorBmp.exLen) + { + len = operpkt->dSendSensorBmp.exLen; + } + memset(m_sensorEnBmp.bitmap, 0, sizeof(SensorsBitmap)); + memcpy(m_sensorEnBmp.bitmap, operpkt->dSendSensorBmp.exData, len); + m_sensorBmpEn = 1; + qDebug("get DCMD_SEND_SENSOR_BMP"); + + emit (siSensorEnBitmap(m_sensorEnBmp)); + break; + } + + case DCMD_SEND_LOTDATA:// 发送物联网数据 + { + memcpy(&m_lotData, operpkt->dSendMcInfo.exData, sizeof(McLotData)); + //再定义一个结构体 + emit(siReceiveLotData()); + + break; + } + + case UCMD_SET_FILE_PARAS://边框检查超限后重新设置起始点 + { + DataFilePos newPos; + memset(&newPos, 0, sizeof(DataFilePos)); + memcpy((u8*)&newPos, operpkt->setFileParas.exData, sizeof(DataFilePos)); + //qDebug()<<"siDataFilePos"; + emit(siDataFilePos(newPos)); + break; + } + + default: + break; + } + } + else + { + break; + } + }while(1); +} + +//------------------------------------------------------------------- +// 读取机器信息 +void Machine::getInfoFromMachine() +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getMcInfo.cmdCode = UCMD_GET_MC_INFO; + + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 读取机器状态 +int Machine::getStatusFromMachine() +{ + int rslt; + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getMcStatus.cmdCode = UCMD_GET_MC_STATUS; + sendPacket.getMcStatus.toggle = m_statusToggle; + rslt = m_statusToggle; + m_statusToggle++; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + return rslt; +} + +// 读取机器物联数据 +void Machine::getNetDataFromMachine() +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.boardPara.cmdCode = UCMD_GET_LOT_DATA; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 读取机器参数 +void Machine::getParasFromMachine(int type, int id) +{ + int mctype = -1; + int wktype = -1; + int gainType = -1; + if (type == -1) + { + mctype = SEW_MCPARA_MACH; + wktype = SEW_MCPARA_WORK; + gainType = DCMD_SEND_MOTO_GAINPARA; + m_mcParaEn = 0; + m_wkParaEn = 0; + m_gainParaEn = 0; + } + else + { + if(type == SEW_MCPARA_MACH ) + { + mctype = SEW_MCPARA_MACH; + m_mcParaEn = 0; + } + if(type == SEW_MCPARA_WORK ) + { + wktype = SEW_MCPARA_WORK; + m_wkParaEn = 0; + } + if(type == DCMD_SEND_MOTO_GAINPARA ) + { + gainType = DCMD_SEND_MOTO_GAINPARA; + m_gainParaEn = 0; + } + } + + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getMcParas.cmdCode = UCMD_GET_MC_PARAS; + + if (mctype == SEW_MCPARA_MACH) + { + sendPacket.getMcParas.paraType = (u16)mctype; + sendPacket.getMcParas.paraId = (u16)id; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } + + if (wktype == SEW_MCPARA_WORK) + { + sendPacket.getMcParas.paraType = (u16)wktype; + sendPacket.getMcParas.paraId = id; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } + + if (gainType == DCMD_SEND_MOTO_GAINPARA) + { + sendPacket.getMcParas.paraType = (u16)gainType; + sendPacket.getMcParas.paraId = id; + packetAFLDP(&sendPacket.packet); + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } +} + +// 读取传感信号 +void Machine::getSensorsFromMachine(int backtype) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getSensors.cmdCode = UCMD_GET_SENSORS; + sendPacket.getSensors.backType = (u16)backtype; + + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 读取传输结果 +void Machine::getTransResultFromMachine(int fileid) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getTransResult.cmdCode = UCMD_GET_TRANS_RESULT; + sendPacket.getTransResult.fileId = (u16)fileid; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 获取传感器有效标志位图 +void Machine::getSensorEnBmpFromMachine() +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getSensorBmp.cmdCode = UCMD_GET_SENSOR_BMP; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +//------------------------------------------------------------------- +//----------------------------设置状态命令 +#ifdef UCMD_SET_MC_STATUS +// 清除错误 + +void Machine::setMcStatus(int stacode, int para) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setMcStatus.cmdCode = UCMD_SET_MC_STATUS; + sendPacket.setMcStatus.staCode = (u16)stacode; + sendPacket.setMcStatus.para = (u16)para; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +void Machine::cleanError() +{ + setMcStatus(MC_STA_CLENA_ERR); +} + +// 设置允许工作状态 +void Machine::setEnableWorkSta() +{ + setMcStatus(MC_STA_EN_WORK); +} + +// 设置禁止工作状态 +void Machine::setDisableWorkSta() +{ + setMcStatus(MC_STA_DIS_WORK); +} + +// 设置允许工作时间状态 +void Machine::setEnableWorkTime() +{ + setMcStatus(MC_STA_EN_TIME); +} + +// 设置禁止工作时间状态 +void Machine::setDisableWorkTime() +{ + setMcStatus(MC_STA_DIS_TIME); +} + +// 重置产量 +void Machine::resetOutput() +{ + setMcStatus(MC_CLEAN_COUNT); +} + +// 手动工作状态 +void Machine::setToManualWork() +{ + setMcStatus(MC_STA_MANUAL); +} + +// 自动工作状态 +void Machine::setToAutoWork() +{ + setMcStatus(MC_STA_AUTO); +} + +// 文件切换 +void Machine::switchWorkFile(int idx) +{ + setMcStatus(MC_FILE_SWITCH, idx); +} + +// 设置经过的时间(即关机时间) +void Machine::setShutDownTime(u8 type, u32 time) +{ + int rslt; + OperPacket sendPacket; + //int size = sizeof(ParaStruct); + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setElapsedTime.cmdCode = UCMD_SET_ELAPSED_TIME; + sendPacket.setElapsedTime.type = type; + sendPacket.setElapsedTime.time = time; + + rslt = packetAFLDP(&sendPacket.packet); + + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } +} + +void Machine::setHeadSpacingToMachine(int type, QByteArray data, u16 paraId) +{ + int rslt; + OperPacket sendPacket; + int size = data.size(); + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS; + sendPacket.setParas.paraType = (u16)type; + sendPacket.setParas.paraId = paraId; + + rslt = packetAVLDP(&sendPacket.packet, (u8*)data.data(), size); + + if(rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size); + emit siSendData(dat); + } +} + +// 文件失效 +void Machine::invalidateWorkFile(int idx) +{ + setMcStatus(MC_INVALID_FILE, idx); +} + +// 清除刷新参数标志 +void Machine::cleanNewParaFlag() +{ + setMcStatus(MC_CLEAN_PARA_REF); +} + +// 模拟工作状态 +void Machine::setSimulateWork() +{ + setMcStatus(MC_SET_TO_SIMULATE); +} + +// 正常工作状态 +void Machine::setNormalWork() +{ + setMcStatus(MC_SET_TO_NORMAL); +} + +void Machine::setWorkHead(int head) +{ + setMcStatus(MC_SEL_WORK_HEADS,head); +} + +//退出断线测试 +void Machine::exitDetectTest() +{ + setMcStatus(MC_STA_EXIT_THREADBK); +} + +// 底线计数复位 +void Machine::resetBobbinCounter() +{ + setMcStatus(MC_CLEAN_BOBBIN); +} +// 产量清零 +void Machine::outputReset() +{ + setMcStatus(MC_CLEAN_COUNT); +} + +// 设置为 进入 扫描传感器状态 +void Machine::entrySensorScan() +{ + // + setMcStatus(MC_SET_ENTRY_SCAN_SENSOR); +} + +// 设置为 退出 扫描传感器状态 +void Machine::exitSensorScan() +{ + // + setMcStatus(MC_SET_EXIT_SCAN_SENSOR); +} + + +#endif + +//---------------------------- + +void Machine::setParasToMachine(int type, ParaStruct & para) +{ + int rslt; + OperPacket sendPacket; + int size = sizeof(ParaStruct); + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS; + sendPacket.setParas.paraType = (u16)type; + + rslt = packetAVLDP(&sendPacket.packet, (u8*)¶, size); + + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size); + emit(siSendData(dat)); + } +} + +void Machine::setAParasToMachine(int type, int idx, u32 value) +{ + int rslt; + OperPacket sendPacket; + int size = sizeof(value); + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS; + sendPacket.setParas.paraType = (u16)type; + sendPacket.setParas.paraId = idx; + + rslt = packetAVLDP(&sendPacket.packet, (u8*)&value, size); + + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size); + emit(siSendData(dat)); + } + getParasFromMachine(); +} + +void Machine::setMcPara(ParaStruct * pPara) +{ + if (pPara == NULL) + { + return; + } + int size = sizeof(ParaStruct); + memcpy(&m_mcPara, pPara, size); + setParasToMachine(SEW_MCPARA_MACH, m_mcPara); +} + +void Machine::setWkPara(ParaStruct * pPara) +{ + if (pPara == NULL) + { + return; + } + int size = sizeof(ParaStruct); + memcpy(&m_wkPara, pPara, size); + setParasToMachine(SEW_MCPARA_WORK, m_wkPara); +} + +void Machine::setMcPrePara(ParaStruct *pPara) +{ + if (pPara == NULL) + { + return; + } + int size = sizeof(ParaStruct); + memcpy(&m_mcPrePara, pPara, size); + setParasToMachine(SEW_REVMCPARA_MACH, m_mcPrePara); +} + +void Machine::setWkPrePara(ParaStruct *pPara) +{ + if (pPara == NULL) + { + return; + } + int size = sizeof(ParaStruct); + memcpy(&m_wkPrePara, pPara, size); + setParasToMachine(SEW_REVMCPARA_WORK, m_wkPrePara); +} + +void Machine::setAMcPara(int id, u32 value) +{ + setAParasToMachine(SEW_MCPARA_MACH, id, value); +} + +void Machine::setAWkPara(int id, u32 value) +{ + setAParasToMachine(SEW_MCPARA_WORK, id, value); +} + +void Machine::setAMcPrePara(int id, u32 value) +{ + setAParasToMachine(SEW_REVMCPARA_MACH, id, value); +} + +void Machine::setAWkPrePara(int id, u32 value) +{ + setAParasToMachine(SEW_REVMCPARA_WORK, id, value); +} + +void Machine::setHeadSpacing(DsrHeadEx62 para) +{ + //分两个包发送 + QByteArray pkg1((char *)(¶), sizeof(DsrHeadEx62)/2); + QByteArray pkg2((char *)(¶) + sizeof(DsrHeadEx62)/2, sizeof(DsrHeadEx62)/2); + setHeadSpacingToMachine(SEW_MCPARA_EX1, pkg1, 0); + setHeadSpacingToMachine(SEW_MCPARA_EX2, pkg2, 1); +} + +// 设置文件参数 +void Machine::setFilePara(int fileidx, int fileid, DataFilePara & filePara) +{ + int rslt; + OperPacket sendPacket; + int size = sizeof(DataFilePara); + + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setFileParas.cmdCode = UCMD_SET_FILE_PARAS; + sendPacket.setFileParas.fileType = FILE_TYPE_DAT; + sendPacket.setFileParas.fileIdx = (u8)fileidx; + sendPacket.setFileParas.fileId = (u16)fileid; + + rslt = packetAVLDP(&sendPacket.packet, (u8*)&filePara, size); + + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size); + emit(siSendData(dat)); + } +} + +// 设置执行进度 +void Machine::setFileExecProgress(int fileidx, int fileid, FileExecPara & fileExecPara) +{ + int rslt; + OperPacket sendPacket; + int size = sizeof(FileExecPara); + + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setFileParas.cmdCode = UCMD_SET_EXEC_PROGRESS; + sendPacket.setFileParas.fileType = FILE_TYPE_DAT; + sendPacket.setFileParas.fileIdx = (u8)fileidx; + sendPacket.setFileParas.fileId = (u16)fileid; + + rslt = packetAVLDP(&sendPacket.packet, (u8*)&fileExecPara, size); + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size); + emit(siSendData(dat)); + } +} + +// 设置默认参数 +void Machine::setToDefaultParas(int type, u8 id, u8 nodeType) +{ + int rslt; + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setDefParas.cmdCode = (u16)type; + sendPacket.setDefParas.id = id; + sendPacket.setDefParas.nodeType = nodeType; + rslt = packetAFLDP(&sendPacket.packet); + + if(rslt != 0) + { + //为了去掉构建警告 + } + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +//------------------------------------------------------------------- +// 手动动作 +void Machine::actionByhand(int actcode, int para1, int para2, int para3) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.actByhand.cmdCode = UCMD_ACT_BYHAND; + sendPacket.actByhand.actCode = (u16)actcode; + sendPacket.actByhand.para1 = (u16)para1; + sendPacket.actByhand.para2 = (u16)para2; + sendPacket.actByhand.para3 = (u16)para3; + + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} +//------------------------------------------------------------------- + +// 电机归零(辅助调试的功能,无安全保护和逻辑关系) +void Machine::motoToZero(int obj) +{ + actionByhand(MOTO_TO_ZERO, obj); +} + +// 电机移动(辅助调试的功能,无安全保护和逻辑关系) +void Machine::motoMove(int obj, int dir, int spd) +{ + actionByhand(MOVE_BY_HAND, obj, dir, spd); +} + +// 拉料移动(辅助调试的功能,无安全保护和逻辑关系) coco +void Machine::pullMove(int obj, int dir, int spd) +{ + actionByhand(MANUAL_ACTION, obj, dir, spd); +} + +// 输出控制(辅助调试的功能,无安全保护和逻辑关系) +void Machine::outputCtrl(int obj, int act, int para) +{ + actionByhand(OUTPUT_CTRL, obj, act, para); +} + +// 电机使能控制(辅助调试的功能,无安全保护和逻辑关系) +void Machine::motoServoCtrl(int obj, int onoff) +{ + actionByhand(MOTO_EN_CTRL, obj, onoff); +} + +// 缝纫主轴使能控制 +void Machine::sewingMsServoOn() +{ + motoServoCtrl(MT_LM, MT_SERVO_ON); +} +void Machine::sewingMsServoOff() +{ + motoServoCtrl(MT_LM, MT_SERVO_OFF); +} + +// 手动动作功能(日常使用功能,有安全保护和逻辑时序关系) +void Machine::manualAction(int obj, int para2, int para3) +{ + actionByhand(MANUAL_ACTION, obj, para2, para3); +} + +// 手动剪线 +void Machine::cutThreadByhand() +{ + manualAction(CUT_THREAD); +} + +void Machine::makeup(int mode) +{ + manualAction(mode); +} + +// 针梭校对 +// step是指执行针梭校对的第几步 +// 1表示高位提升 2表示梭归零, 3表示针归零 4表示针梭复位 0表示自动执行步骤1234 +void Machine::msAdjust(int obj, int step) +{ + manualAction(obj, step); +} + +//// 旋转校对 +//void Machine::rotaAdjust(int step) +//{ +// manualAction(ROTATE_ADJUST, step); +//} + +// 机头升降 +void Machine::sewHeadLiftUpDown() +{ + manualAction(HEAD_LIFT_UPDW); +} + +// 粗线布线机机头升降 coco +void Machine::ThicklineSewHeadLiftUpDown() +{ +// if(headup == 0) +// { +// outputCtrl(HEAD_LIFT_UPDW,DOWN_CLOSE_OFF,0); +// headup = 1; +// return headup; +// } +// else +// { +// outputCtrl(HEAD_LIFT_UPDW,UP_OPEN_ON,0); +// headup = 0; +// return headup; +// } + + manualAction(HEAD_LIFT); +// outputCtrl(HEAD_LIFT_UPDW); + +} + +// 机头上升 +void Machine::sewHeadLiftUp() +{ + manualAction(HEAD_LIFT_UP); +} + +// 机头下降 +void Machine::sewHeadLiftDown() +{ + manualAction(HEAD_LIFT_DOWN); +} + +// 机头上升2 +void Machine::sewHeadLiftUp2() +{ + manualAction(HEAD_LIFT_UP2); +} + +// 机头下降2 +void Machine::sewHeadLiftDown2() +{ + manualAction(HEAD_LIFT_DOWN2); +} + +// 缝纫主轴研车 +void Machine::sewingMsRun() +{ + manualAction(SEWING_MS_RUN); +} + +// 回角点 +void Machine::gotoGorner(int nNum) +{ + mcWorkCmd(WORK_GOTO_GORNER,nNum); +} + +// 手动加油 +void Machine::manualOil(int nNum) +{ + mcWorkCmd(WORK_ACT_OIL,nNum); +} + //梭盘计数复位 +void Machine::shuttleCounter() +{ + manualAction(RESET_SHUT_COUNTER); +} +//自动换一个梭 +void Machine::changeOneShuttle() +{ + manualAction(AUTO_CHANGE_ONE_SHUT); +} +//安装第一个梭壳 +void Machine::installShuttle() +{ + manualAction(INSTALL_FIRST_BOBBIN); +} +//缝纫状态 +void Machine::sewBuff() +{ + manualAction(SHUT_INTO_INDX_STA); +} +//换梭盘状态 +void Machine::shuttleDiskBuff() +{ + manualAction(SHUT_INTO_TAKE_PLATE); +} +//将旋梭从梭盘到机头 +void Machine::shuttleToHead() +{ + manualAction(SHUT_FROM_PLATE_TO_HEAD); +} +// 将旋梭从机头拿到梭盘 +void Machine::headToShuttle() +{ + manualAction(SHUT_FROM_HEAD_TO_PLATE); +} + +// 所有主轴研车 +void Machine::allMsRun() +{ + manualAction(ALL_MS_RUN); +} + +// 机头升降 +void Machine::headLift() +{ + manualAction(SEW_HEAD_LIFT); +} + +// 针梭复位 +void Machine::msReset() +{ + manualAction(SEW_MS_RESET); +} + +// 针梭去穿线位 +void Machine::msToFix() +{ + manualAction(SEW_MS_TO_FIX); +} + +// 手动移框 +void Machine::moveFrameByHand(char xy, char dir, int spd) +{ + int para1, para2; + + if (xy == 'x' || xy == 'X') + { + if (dir == 'l' || dir == 'L') + { + para1 = XY_MOVE_LEFT; + } + else if (dir == 'r' || dir == 'R') + { + para1 = XY_MOVE_RIGHT; + } + else + { + para1 = XY_MOVE_STOP; + } + } + else if (xy == 'y' || xy == 'Y') + { + if (dir == 'f' || dir == 'F') + { + para1 = XY_MOVE_FRONT; + } + else if (dir == 'b' || dir == 'B') + { + para1 = XY_MOVE_BACK; + } + else + { + para1 = XY_MOVE_STOP; + } + } + else + { + para1 = XY_MOVE_STOP; + } + + para2 = spd; + manualAction(para1, para2); +} + +// 缝纫剪线 +void Machine::sewCutThread(int nNum) +{ + manualAction(CUT_THREAD,0,nNum); // 加0的原因是主控上用的是para3 +} + +// 缝纫主轴点动 +void Machine::sewJog() +{ + manualAction(SEWING_MS_JOG); +} + +void Machine::mcWorkCmd(int workcode, int para1, int para2) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.mcWork.cmdCode = UCMD_MC_WORK; + sendPacket.mcWork.workCode = (u16)workcode; + sendPacket.mcWork.para1 = (u32)para1; + sendPacket.mcWork.para2 = (u16)(para2); + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 启动工作 +void Machine::startWork() +{ + mcWorkCmd(WORK_START); +} + +// 暂停工作 +void Machine::pauseWork() +{ + mcWorkCmd(WORK_PAUSE); +} + +// 主轴去勾线位 +void Machine::spindleHookPos(int def) +{ + actionByhand(MANUAL_ACTION, def); +} + +// 主轴去停车位 +void Machine::spindleParkPos(int def) +{ + actionByhand(MANUAL_ACTION, def); +} + +// 流程复位(结束工作) +void Machine::allToReset() +{ + mcWorkCmd(WORK_FINISH); +} + +// 自动找零(全部归零) +void Machine::allToZero() +{ + mcWorkCmd(WORK_FIND_ZERO); +} + +// 回起针点 +void Machine::gotoStartPos() +{ + mcWorkCmd(WORK_GOTO_START); +} + +// 回定位点 +void Machine::gotoAnchor() +{ + mcWorkCmd(WORK_GOTO_ANCHOR); +} + +// 定偏移点 +void Machine::setOffsetPos() +{ + mcWorkCmd(WORK_SET_OFFSET); +} + +// 回偏移点 +void Machine::gotoOffsetPos() +{ + mcWorkCmd(WORK_GOTO_OFFSET); +} + +// 定上料点 +void Machine::setFeedPos() +{ + mcWorkCmd(WORK_SET_FEED); +} + +// 回上料点 +void Machine::gotoFeedPos() +{ + mcWorkCmd(WORK_GOTO_FEED); +} + +// 回结束点 +void Machine::gotoFinish() +{ + mcWorkCmd(WORK_GOTO_FINISH); +} + +// 边框检查 +void Machine::checkFrame() +{ + mcWorkCmd(WORK_CHECK_FRAME); +} + +// 空走边框 +void Machine::simulateFrame() +{ + mcWorkCmd(WORK_SIMULATION_FRAME); +} + +/* +#define WORK_CUT_FRAME 0x0009 // 边框切割 +#define WORK_CUT_XLINE 0x000A // 手动断布 +*/ + +// 快速进退 +void Machine::fastJump(int idx) +{ + mcWorkCmd(WORK_FAST_JUMP, idx); +} + +// 回工作点 +void Machine::gotoWorkPos() +{ + mcWorkCmd(WORK_GOTO_WKPOS); +} + +// 回穿线点 +void Machine::gotoFixPos() +{ + mcWorkCmd(WORK_GOTO_FEEDT); +} + +void Machine::gotoShuttlePos() +{ + mcWorkCmd( WORK_GOTO_CHGBO ); +} + +/* +#define WORK_GOTO_CHGBO 0x000E // 回换梭位 +#define WORK_FEED_MOVE 0x000F // 进料退料 +#define WORK_DRAW_LATTICE 0x0010 // 画格子图 +#define WORK_GOTO_FINISH 0x0011 // 回结束点 +*/ + +// 回零点(框架归零) +void Machine::gotoZeroPos() +{ + mcWorkCmd(WORK_GOTO_ZERO); +} + +// 主轴点动 +void Machine::mainShaftJog() +{ + mcWorkCmd(WORK_MS_JOG); +} + +// 主轴研车 +void Machine::embSpindleTest(s32 para1, s32 para2) +{ + manualAction(WIRE_MS_RUN, para1, para2); +} + +// 速度改变 +// chgram 主轴转速改变值。例如:参数为10表示速度加10(升速),参数为-10表示速度减10(降速) +void Machine::msRpmChange(int chgram, int flag) +{ + mcWorkCmd(WORK_RPM_CHG, chgram, flag); +} + +//---------------------------- +// 移动到XY坐标命令 +void Machine::moveFrameTo(int x, int y) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.moveFrameTo.cmdCode = UCMD_MOVE_TO; + sendPacket.moveFrameTo.posx = x; + sendPacket.moveFrameTo.posy = y; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +void Machine::breakFileTrans() +{ + m_transBreak = 1; +} + +#define SEND_STEP0 0 +#define SEND_STEP1 1 +#define SEND_STEP2 2 +#define SEND_STEP3 3 +#define SEND_STEP4 4 +#define SEND_STEP5 5 + +#define SEND_STEP_MAX 10 + +#define SEND_ANSWER 100 + +void Machine::onSendTimer(void) +{ + int rslt; + rslt = 0; + +// qDebug("----------------------Machine::onSendTimer---Begin"); + + if (m_transBreak != 0) // 中断传输 + { + qDebug("break file trans"); + m_transCtrl.transphase = SEND_STEP5; + } + + if (m_transCtrl.transphase == SEND_STEP0) // 文件失效 + { + m_fileTransEn = 0; + qDebug("SEND_STEP1 InvalidateWorkFile "); + invalidateWorkFile(m_transCtrl.fileIdx); // 文件失效 + m_transCtrl.transphase = SEND_STEP1; + rslt = 1; + } + else if (m_transCtrl.transphase == SEND_STEP1) // 启动文件传输 + { + m_fileTransEn = 0; + startFileTrans(m_transCtrl); + +// qDebug("----------------------Machine::onSendTimer---StartFileTrans "); + qDebug("trans progress %d/%d", 0, m_transCtrl.packetNum); + m_totalSendNum = 0; + m_totalPacketNum = m_transCtrl.packetNum; + emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号 + m_transCtrl.transphase = SEND_STEP2; + rslt = 1; + + } + else if (m_transCtrl.transphase == SEND_STEP2) // 读取传输结果 + { + qDebug("SEND_STEP2 send GetTransResult cmd "); + + m_fileTransEn = 0; + getTransResultFromMachine(m_transCtrl.fileId); + m_transCtrl.transphase = SEND_STEP3; + rslt = 1; + } + else if (m_transCtrl.transphase == SEND_STEP3) // 根据传输结果传输文件数据 + { + if (m_fileTransEn == 1) + { + qDebug("GetTransResult from machine"); + + if (m_transCtrl.transActive == TRANS_ACTIVE) + { + if ( m_transCtrl.transflag == TRANS_READY || // 准备好接收 + m_transCtrl.transflag == TRANS_DOING || // 正在接收 + 0 ) + { + qDebug("trans sta = TRANS_READY or TRANS_DOING flag=%d", m_transCtrl.transflag); + +#if (1) + int i, j; + int thissendnum = 0; + int totalsendnum = 0; + int send_count = 1000; + +#if(1)//发一个包查询一次结果 + if ( m_transCtrl.fileType == FILE_TYPE_DAT )//花样文件(大文件) + { + if(m_connectMode == USE_TCP_COMM)//网口 + { + send_count = 400; + } + else if(m_connectMode == USE_SERIAL_COMM)//串口 + { + send_count = 10; + } + } + else if ( m_transCtrl.fileType == FILE_TYPE_PGM ) //升级等文件(小文件) + { + send_count = 25; + } +#endif + + u8 mod, temp; + for (i = 0; i < m_transCtrl.lenBmp; i++) + { + temp = m_transCtrl.rsvBitmap[i]; + mod = 0x01; + for (j = 0; j < 8; j++) + { + if ((temp & mod) == 0) + { + if (thissendnum < send_count ) // 每发送send_count个包,查询一次结果 + { + thissendnum++; + + transFileData(m_transCtrl, i*8+j); + + } + } + else + { + totalsendnum++; + } + mod <<= 1; + } + } + m_totalSendNum = totalsendnum; + m_totalPacketNum = m_transCtrl.packetNum; + emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号 + m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令 +#else + int i, j; + int thissendnum = 0; + int totalsendnum = 0; + u8 mod, temp; + for (i = 0; i < m_transCtrl.lenBmp; i++) + { + temp = m_transCtrl.rsvBitmap[i]; + mod = 0x01; + for (j = 0; j < 8; j++) + { + if ((temp & mod) == 0) + { + if (thissendnum < 200) // 每发送200个包,查询一次结果, + { + thissendnum++; + TransFileData(m_transCtrl, i*8+j); + qDebug("TransFileData idx=%d", i*8+j); + } + } + else + { + totalsendnum++; + } + mod <<= 1; + } + } + qDebug("trans progress = %d/%d", totalsendnum , m_transCtrl.packetNum); + + emit(SiTransProgress(totalsendnum, m_transCtrl.packetNum)); // 发送进度信号 + m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令 +#endif + } + else if (m_transCtrl.transflag == TRANS_DONE) // 接收完成 + { + qDebug("trans sta = TRANS_DONE"); + + emit siSendDataDone(); + + m_totalSendNum = m_transCtrl.packetNum; + m_totalPacketNum = m_transCtrl.packetNum; + emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号 + m_transCtrl.transphase = SEND_STEP4; + + //qDebug()<<"m_transCtrl.fileType"< SEND_STEP_MAX) // 1秒没有回复 + { + qDebug("waitcount > SEND_STEP_MAX, back to SEND_STEP2 "); + m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令 + rslt = 1; + } + } + } + + if (rslt == 0) + { + m_transCtrl.waitcount++; + } + else + { + m_transCtrl.waitcount = 0; + } + + if ( m_transCtrl.transphase != SEND_STEP1 && + m_transCtrl.transphase != SEND_STEP2 && + m_transCtrl.transphase != SEND_STEP3 ) // 结束 + { + qDebug("trans file over, step=%d", m_transCtrl.transphase); + if (m_transCtrl.transphase == SEND_STEP4) + { + m_totalSendNum = 0; + m_totalPacketNum = 0; + emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送结束信号(成功) + } + else + { + m_totalSendNum = -1; + m_totalPacketNum = -1; + emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送结束信号(失败) + } + m_pSendTimer->stop(); // 停止定时器 + m_transCtrl.filetransing = 0; + } + +// qDebug("----------------------Machine::onSendTimer---End"); +} + +//串口是否打开 +void Machine::slIfOpenSerialPort(int val) +{ + if(val != 0) + { + if(m_connectMode == USE_SERIAL_COMM) + { + m_connected = 3;//串口已打开 + } + } +} + +// 发送文件过程 +int Machine::sendFileProc(int type, int idx, int id, DataDs16FileHead & fileHead, u8 * pDatBuff) +{ + return sendFileProc(type, idx, id, &fileHead, pDatBuff); +} +int Machine::sendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff) +{ + if (pDatBuff == NULL || pfileHead == NULL) + { + return -1; + } + + if ( pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE) + { + qDebug("pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE, not support"); + return -2; + } + + QTime delayTime; + int counter = 0; + delayTime.start(); + + if (m_transCtrl.filetransing != 0) // 已经有文件在传输 + { + return -3; + } + + while (m_transCtrl.filetransing != 0) // 已经有文件在传输 + { + if (delayTime.elapsed() > 1000) + { + counter++; + qDebug("%d. wait old file trans over", counter); + delayTime.restart(); + } + + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } + + m_transBreak = 0; + + m_transCtrl.fileType = (u8)type; + m_transCtrl.fileIdx = (u8)idx; + m_transCtrl.fileId = (u16)id; + memcpy(m_transCtrl.pFileHead, pfileHead, sizeof(DataDs16FileHead)); + memcpy(m_transCtrl.pDatBuff, pDatBuff, pfileHead->dataSize); + m_transCtrl.packetSize = MAX_EXDP_LEN; + m_transCtrl.packetNum = (pfileHead->dataSize + MAX_EXDP_LEN - 1) / MAX_EXDP_LEN; + + qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ", + m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum); + + m_transCtrl.transphase = SEND_STEP1; + m_transCtrl.filetransing = 1; + + m_pSendTimer->start(); + return 0; +} + +// 发送文件过程 +int Machine::sendAPPFileProc(int type, int idx, int id, AppFileHead & fileHead, u8 * pDatBuff) +{ + if (pDatBuff == NULL || fileHead.dataSize <= 0) + { + return -1; + } + + if (fileHead.dataSize > MAX_FILE_SIZE) + { + qDebug("fileHead.dataSize > MAX_FILE_SIZE, not support"); + return -2; + } + + QTime delayTime; + int counter = 0; + delayTime.start(); + + while (m_transCtrl.filetransing != 0) // 已经有文件在传输 + { + if (delayTime.elapsed() > 1000) + { + counter++; + qDebug("%d. wait old file trans over", counter); + delayTime.restart(); + } + + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } + + m_transBreak = 0; + + // 拷贝数据到传输控制结构 + m_transCtrl.fileType = (u8)type; + m_transCtrl.fileIdx = (u8)idx; + m_transCtrl.fileId = (u16)id; + memcpy(m_transCtrl.pAppHead, &fileHead, sizeof(AppFileHead)); + memcpy(m_transCtrl.pDatBuff, pDatBuff, fileHead.dataSize); + m_transCtrl.packetSize = MAX_EXDP_LEN; + m_transCtrl.packetNum = (fileHead.dataSize + MAX_EXDP_LEN - 1 ) / MAX_EXDP_LEN; + + qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ", + m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum); + + m_transCtrl.transphase = SEND_STEP1; + m_transCtrl.filetransing = 1; + + // 启动定时器 + m_pSendTimer->start(); + return 0; +} + +// 启动文件传输 +void Machine::startFileTrans(FileTransCtrl & transCtrl) +{ + int rslt; + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.startTrans.cmdCode = UCMD_START_TRANS; + sendPacket.startTrans.fileType = transCtrl.fileType; + sendPacket.startTrans.fileIdx = transCtrl.fileIdx; + sendPacket.startTrans.fileId = transCtrl.fileId; + + if( transCtrl.fileType == FILE_TYPE_DAT) + { + rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pFileHead, sizeof(DataDs16FileHead)); + } + else if( transCtrl.fileType == FILE_TYPE_PGM ) + { + rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pAppHead, sizeof(AppFileHead)); + } + else + { + return ; + } + + if (rslt == 0) + { + if( transCtrl.fileType == FILE_TYPE_DAT) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(DataDs16FileHead)); + emit(siSendData(dat)); + } + else if( transCtrl.fileType == FILE_TYPE_PGM ) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(AppFileHead)); + emit(siSendData(dat)); + } + } +} + +// 文件数据传输 +void Machine::transFileData(FileTransCtrl & transCtrl, int pktidx) +{ + int rslt; + int actsize; + u8 buff[MAX_EXDP_LEN]; + + if (pktidx < 0 || transCtrl.pDatBuff == NULL) + { + return; + } + + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.transFileData.cmdCode = UCMD_TRANS_FILE_DATA; + sendPacket.transFileData.fileId = transCtrl.fileId; + sendPacket.transFileData.pktIdx = pktidx; + + if (pktidx < (int)transCtrl.packetNum) + { + if( transCtrl.fileType == FILE_TYPE_DAT) + { + actsize = transCtrl.pFileHead->dataSize - pktidx*transCtrl.packetSize; + + if (actsize >= transCtrl.packetSize) + { + actsize = transCtrl.packetSize; + } + else + { + memset(buff, 0, MAX_EXDP_LEN); + } + } + else if( transCtrl.fileType == FILE_TYPE_PGM ) + { + actsize = transCtrl.pAppHead->dataSize - pktidx*transCtrl.packetSize; + + if (actsize >= transCtrl.packetSize) + { + actsize = transCtrl.packetSize; + } + else + { + memset(buff, 0XFF, MAX_EXDP_LEN); + } + } + else + { + actsize = 0; + } + + memcpy(buff, &(transCtrl.pDatBuff[pktidx*transCtrl.packetSize]), actsize); + //qDebug("TransFileData pktidx=%d", pktidx); +#if (0) + int i; + for (i = 0; i < MAX_EXDP_LEN/16; i++) + { + qDebug("0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x", + buff[i*16+0], buff[i*16+1],buff[i*16+2],buff[i*16+3],buff[i*16+4],buff[i*16+5],buff[i*16+6],buff[i*16+7], + buff[i*16+8],buff[i*16+9],buff[i*16+10],buff[i*16+11],buff[i*16+12],buff[i*16+13],buff[i*16+14],buff[i*16+15]); + } + +#endif + rslt = packetAVLDP(&sendPacket.packet, buff, MAX_EXDP_LEN); + if (rslt == 0) + { + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+MAX_EXDP_LEN); + emit(siSendData(dat)); + } + } +} +// 下位机升级 +void Machine::updateFirmware() +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.mcUpdate.cmdCode = UCMD_MC_UPDATE; + sendPacket.mcUpdate.upObj = 0; + sendPacket.mcUpdate.upFileID = 0; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 恢复出厂设置 +void Machine::restoreFactorySetting(int type) +{ + int mctype = -1; + int wktype = -1; +// int gainType = -1; + if (type == -1) + { + mctype = SEW_MCPARA_DEF_MC; + wktype = SEW_MCPARA_DEF_WK; +// gainType = DCMD_SEND_MOTO_GAINPARA; + m_mcParaEn = 0; + m_wkParaEn = 0; + m_gainParaEn = 0; + } + else + { + if(type == SEW_MCPARA_DEF_MC ) + { + mctype = SEW_MCPARA_DEF_MC; + m_mcParaEn = 0; + } + if(type == SEW_MCPARA_DEF_WK ) + { + wktype = SEW_MCPARA_DEF_WK; + m_wkParaEn = 0; + } + if(type == DCMD_SEND_MOTO_GAINPARA ) + { +// gainType = DCMD_SEND_MOTO_GAINPARA; + m_gainParaEn = 0; + } + } + + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.getMcParas.cmdCode = UCMD_GET_MC_PARAS; + + if (mctype == SEW_MCPARA_DEF_MC) + { + sendPacket.getMcParas.paraType = (u16)mctype; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } + + if (wktype == SEW_MCPARA_DEF_WK) + { + sendPacket.getMcParas.paraType = (u16)wktype; + packetAFLDP(&sendPacket.packet); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); + } + + sleep(3); + setMcPara(&m_mcPara); + setWkPara(&m_wkPara); + setMcPara(&m_mcPrePara); + setWkPara(&m_wkPrePara); +} + +void Machine::sleep(int sec) +{ + QTime dieTime = QTime::currentTime().addSecs(sec);//延时sec秒 + //QTime dieTime = QTime::currentTime().addMSecs(msec);//延时msec毫秒 + while( QTime::currentTime() < dieTime ) + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); +} + +void Machine::setTcpConnectState(int state) +{ + if(state == 0){}//为了去掉串口下的构建警告 + if(m_connectMode == USE_TCP_COMM) + { + if(m_pTcpClient != NULL) + { + m_pTcpClient->m_connected = state; + } + } + else if(m_connectMode == USE_SERIAL_COMM)//串口 + { + //注释掉此行代码,因为串口发送文件较慢,若是超过5秒不给上位机返状态就会检测断开,其实并未断开 + //m_connected = state;//改变连接状态 + } +} + +// 设置经过的时间 +void Machine::setElapsed(unsigned char i_type , unsigned char i_time) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setElapsedTime.cmdCode = UCMD_SET_ELAPSED_TIME; + + sendPacket.setElapsedTime.type = i_type ; + sendPacket.setElapsedTime.time = i_time ; + + packetAFLDP(&sendPacket.packet); + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET); + emit(siSendData(dat)); +} + +// 测试断线检测,1是面线,2是底线 +void Machine::testThreadBK(int type,int needle) +{ + actionByhand(TEST_THREADBK, type, needle); +} + +// 设置机器的密钥 +void Machine::setMacKey(unsigned char * p_dat , int i_size) +{ + OperPacket sendPacket; + memset(&sendPacket, 0, sizeof(OperPacket)); + sendPacket.setMacKey.cmdCode = UCMD_SET_INSTALLMENT; + + memcpy( sendPacket.setMacKey.exData , p_dat , i_size); + + packetAVLDP(&sendPacket.packet, (u8*)p_dat, i_size); + + QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + i_size ); + + emit(siSendData(dat)); +} diff --git a/machine/machine.h b/machine/machine.h new file mode 100644 index 0000000..10b57db --- /dev/null +++ b/machine/machine.h @@ -0,0 +1,314 @@ +#ifndef MACHINE_H +#define MACHINE_H + +#include "tcpclient.h" +#include "comport.h" +#include "datafile/datafiledsr.h" + +#include +#include +#include + +#include "comm/datadef.h" +#include "comm/protocol.h" + +#define USE_TCP_COMM 0 +#define USE_SERIAL_COMM 1 + +class Machine: public QObject +{ + Q_OBJECT + +public: + explicit Machine(QObject *parent = NULL); + virtual ~Machine(); + +public: + void initConnectMode(s16 val = 0);//初始化通讯连接方式 + void setConfigFileName(QString configfilename); + void setComportName(QString portName);//设置串口名称 + QString getConfigFileName(); + int startCommunication(); + +private: + QString m_configFileName; + +private: + s16 m_connectMode; //通讯连接方式 0:网口,1:串口 + // 通讯线程和网络连接 + QThread * m_pTcpThread; + TcpClient * m_pTcpClient; + QThread * m_pComThread; + ComPort * m_pComPort; + + // 连接 +public: + inline int isConnected() const { return m_connected; } + +private: + int m_startComm; + int m_connected; // 机器连接状态. 0, 未连接; 1, 连接中; 2, + +signals: // 发送数据到机器的信号 + void siSendData(QByteArray dat); + void siSendDataDone(); + +private slots: // 和线程通讯的槽 + void slotConnectSta(int sta); // 连接状态改变的槽函数 + void slotConnectErr(QString errinfo); // 接收到通讯错误槽函数 + void slotReceiveData(QByteArray dat); // 接收到数据的槽函数 + +//---------------------------------------- +// 通讯命令 + + // 机器信息 +public: +private: + + // 机器状态 +public: + inline int isStatusEn() const { return m_statusEn; } + inline const MCStatus & getMcStatus() {m_statusEn = 0; return m_mcStatus; } + void setMcStatusAsMc(u8 * buff, int toggle); + + //机器信息 + inline const MCInfo &getMcInfo(){return m_mcInfo;} + //物联数据 + inline const McLotData &getMcLotData(){return m_lotData;} + //调试信息 + inline const DebugInfo &getDebugInfo(){return m_debugInfo;} + +private: + int m_statusEn; // 状态有效标志 + int m_statusToggle; + MCStatus m_mcStatus; // 机器状态 + MCInfo m_mcInfo; // 机器信息 + McLotData m_lotData; // 物联数据 + DebugInfo m_debugInfo;//调试信息 + + // 机器参数 +public: + inline const ParaStruct & getMcPara() {/*m_mcParaEn = 0; */ return m_mcPara; } + inline const ParaStruct & getWkPara() {/*m_wkParaEn = 0; */ return m_wkPara; } + inline const KnifeGapPara & getGainPara() { return m_gainPara; } + inline const ParaStruct & getPreMcPara() {/*m_mcParaEn = 0; */ return m_mcPrePara; } + inline const ParaStruct & getPreWkPara() {/*m_wkParaEn = 0; */ return m_wkPrePara; } + +private: + ParaStruct m_mcPara; // 机器参数信息 配置信息 + ParaStruct m_wkPara; // 工作参数信息 + ParaStruct m_mcPrePara; // 机器预留参数 + ParaStruct m_wkPrePara; // 工作预留参数 + KnifeGapPara m_gainPara; + int m_mcParaEn; + int m_wkParaEn; + int m_gainParaEn;//电机增益参数 + int m_mcPreParaEn; + int m_wkPreParaEn; + +public: + inline int isSensorBmpEn() const { return m_sensorBmpEn; } + inline const SensorsBitmap & getSensorDat() {/* m_sensorStaEn = 0; */ return m_sensorsStaDat; } + inline const SensorsBitmap & getSensorBmp() {/* m_sensorBmpEn = 0; */ return m_sensorEnBmp; } + inline int getTotalSendNum() { return m_totalSendNum; } + inline int getTotalPacketNum() { return m_totalPacketNum; } + +private: + SensorsBitmap m_sensorsStaDat; // 传感器信号状态位图 + SensorsBitmap m_sensorEnBmp; // 传感器信号有效位图 + int m_sensorStaEn; + int m_sensorBmpEn; + +public: + void setTcpConnectState(int state); + void setMacKey(unsigned char * p_dat , int i_size); // 设置机器的密钥 + // 文件传输结果 +public: + +private: + QTimer * m_pSendTimer; + FileTransCtrl m_transCtrl; + int m_fileTransEn; + int m_transBreak; + int m_totalSendNum;//传输文件时总共发送的包数 + int m_totalPacketNum;//传输文件时总的包数 + +private slots: + void onSendTimer(void); + void slIfOpenSerialPort(int val);//串口是否打开 + +signals: // 发送给UI的信号 + void siMcInfoChange(); // 机器信息改变信号 + void siDebugInfo(); //调试信息改变信号 + void siReceiveLotData(); // 接收物联数据信号 + void siStatusChange(int); // 状态改变信号 + void siParaChange(int type, int id); // 参数更新信号 + void siMemDataChange(int beginAddr); // 内存数据更新信号 + void siSensorChange(SensorsBitmap map); // 传感信号更新信号 + void siFileInfoChange(); // 文件信息更新信号 + void siTransResultChange(); // 文件传输结果信号 + void siTransProgress(u8 fileType, int send, int total); // 文件传输结果信号 + void siSensorEnBitmap(SensorsBitmap map); // 传感信号有效位图更新信号 + void siDataFilePos(DataFilePos pos); // 边框检查时起始点超出范围后下位机自动定新的起始点后发给上位机 + +public slots: + void breakFileTrans(); // 打断文件传输 + +public: // 机器执行命令,读取下位机数据 + void getInfoFromMachine(); + int getStatusFromMachine(); + void getNetDataFromMachine(); // 读取机器物联数据 + void getParasFromMachine(int type = -1, int id = 0); // 读取机器参数 + void restoreFactorySetting(int type = -1); // 恢复出厂设置 + void getSensorsFromMachine(int backtype = 0); + void getTransResultFromMachine(int fileid); + void getSensorEnBmpFromMachine(); // 获取传感器有效标志位图 + void sleep(int sec); + +public: // 设置机器配置 +// #define UCMD_SET_MC_CONFIG 0x0101 VLDP 无 设置机器的配置,包括信号使用的端口等信息 + +public: // 设置机器状态 + void setMcStatus(int stacode, int para = 0); + void cleanError(); // 清除错误 + void setEnableWorkSta(); // 设置允许工作状态 + void setDisableWorkSta(); // 设置禁止工作状态 + void setEnableWorkTime(); // 设置允许工作时间状态 + void setDisableWorkTime(); // 设置禁止工作时间状态 + void resetOutput(); // 重置产量 + void setToManualWork(); // 手动工作状态 + void setToAutoWork(); // 自动工作状态 + void switchWorkFile(int idx = 0); // 文件切换 + void invalidateWorkFile(int idx = 0); // 文件失效 + void cleanNewParaFlag(); // 清除新参数标志 + void setSimulateWork(); // 模拟工作状态 + void setNormalWork(); // 正常工作状态 + void setWorkHead(int head); // 设置工作机头 + void exitDetectTest(); //退出断线测试 + void resetBobbinCounter(); // 底线计数复位 + void outputReset(); // 产量清零 + void entrySensorScan(); // 进入扫描传感器状态 + void exitSensorScan(); // 退出扫描传感器状态 + void setElapsed(unsigned char i_type , unsigned char i_time); // 设置经过的时间 + void testThreadBK(int type,int needle); // 测试断线检测,1是面线,2是底线 + +public: // 设置机器参数 + void setParasToMachine(int type, ParaStruct & para); + void setAParasToMachine(int type, int idx, u32 value); + void setShutDownTime(u8 type, u32 time); + void setHeadSpacingToMachine(int type, QByteArray data, u16 paraId); + void setMcPara(ParaStruct * pPara); + void setWkPara(ParaStruct * pPara); + void setMcPrePara(ParaStruct * pPara);//预留参数 + void setWkPrePara(ParaStruct * pPara);//预留参数 + void setAMcPara(int id, u32 value); + void setAWkPara(int id, u32 value); + void setAMcPrePara(int id, u32 value);//预留参数 + void setAWkPrePara(int id, u32 value);//预留参数 + + void setHeadSpacing(DsrHeadEx62 para); + +public: // 设置内存数据 +// #define UCMD_SET_MEM_DATA 0x0104 // 设置内存数据 + +public: // 设置文件参数 + void setFilePara(int fileidx, int fileid, DataFilePara & filePara); + +public: // 设置执行进度 + void setFileExecProgress(int fileidx, int fileid, FileExecPara & fileExecPara); + void setToDefaultParas(int type, u8 id = 0, u8 nodeType = 0); + int headup; + +public slots: // 手动控制命令 + void actionByhand(int actcode, int para1, int para2 = 0, int para3 = 0); + void motoToZero(int obj); // 电机归零(辅助调试的功能,无安全保护和逻辑关系) + void motoMove(int obj, int dir, int spd); // 电机移动(辅助调试的功能,无安全保护和逻辑关系) + void pullMove(int obj, int dir, int spd); // 拉料移动(辅助调试的功能,无安全保护和逻辑关系) coco + void outputCtrl(int obj, int act = 0, int para = 0); // 输出控制(辅助调试的功能,无安全保护和逻辑关系) + void motoServoCtrl(int obj, int onoff); // 电机使能控制(辅助调试的功能,无安全保护和逻辑关系) + + void sewingMsServoOn(); + void sewingMsServoOff(); // 缝纫主轴使能控制 + + void manualAction(int obj, int para2 = 0, int para3 = 0); // 手动动作功能(日常使用功能,有安全保护和逻辑时序关系) + + void cutThreadByhand(); // 手动剪线 + void makeup(int mode); //补缝 + void msAdjust(int obj, int step); // 针梭校对 + //void rotaAdjust(int step); // 旋转校对 + + void sewHeadLiftUpDown(); // 机头升降 + void ThicklineSewHeadLiftUpDown();// 粗线布线机机头升降 + void sewHeadLiftUp(); // 机头上升 + void sewHeadLiftDown(); // 机头下降 + void sewHeadLiftUp2(); // 机头上升2 + void sewHeadLiftDown2(); // 机头下降2 + void sewingMsRun(); // 缝纫主轴研车 + void gotoGorner(int nNum);// 回角点 + void manualOil(int nNum); // 手动加油 + void shuttleCounter(); //梭盘计数复位 + void changeOneShuttle();//自动换一个梭 + void installShuttle(); //安装第一个梭壳 + void sewBuff(); //缝纫状态 + void shuttleDiskBuff(); //换梭盘状态 + void shuttleToHead(); //将旋梭从梭盘到机头 + void headToShuttle(); //将旋梭从机头拿到梭盘 + void allMsRun(); // 所有主轴研车 + + void headLift(); // 机头升降 + void msReset(); // 针梭复位 + void msToFix(); // 针梭去穿线位 + void sewCutThread(int nNum); // 缝纫剪线 + + void moveFrameByHand(char xy, char dir, int spd); // 手动移框 + void sewJog(); // 缝纫点动 + + void spindleHookPos(int def); // 主轴去勾线位 + void spindleParkPos(int def); // 主轴去停车位 +public: // 机器工作命令 + void mcWorkCmd(int workcode, int para1 = 0 , int para2 = 0); + + void startWork(); // 启动工作 + void pauseWork(); // 暂停工作 + void allToReset(); // 流程复位 + void allToZero(); // 全部归零 + + void gotoStartPos(); // 回起针点 + void gotoAnchor(); // 回定位点 + void setOffsetPos(); // 定偏移点 + void gotoFinish(); // 回结束点 + void gotoOffsetPos(); // 回偏移点 + void setFeedPos(); // 定上料点 + void gotoFeedPos(); // 回上料点 + + void checkFrame(); // 边框检查 + void simulateFrame(); // 空走边框 + + void fastJump(int idx); // 前进回退 + void gotoWorkPos(); // 回工作点 + void gotoFixPos(); // 回穿线点 + void gotoShuttlePos(); // 回换梭位 + + void gotoZeroPos(); // 回零点 + void msRpmChange(int chgram,int flag); // 速度改变 + void mainShaftJog();// 主轴点动 + void embSpindleTest(s32 para1, s32 para2); // 主轴研车 + +public: // 移动到XY坐标命令 + void moveFrameTo(int x, int y); + +public: // 文件传输命令 + int sendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff); + int sendFileProc(int type, int idx, int id, DataDs16FileHead & fileHead, u8 * pDatBuff); + int sendAPPFileProc(int type, int idx, int id, AppFileHead &fileHead, u8 *pDatBuff); + +private: + void startFileTrans(FileTransCtrl & transCtrl); + void transFileData(FileTransCtrl & transCtrl, int pktidx); + +public: // 下位机系统升级命令 + void updateFirmware(); // 下位机升级 +}; + +#endif // MACHINE_H + diff --git a/machine/mytcpserver.cpp b/machine/mytcpserver.cpp new file mode 100644 index 0000000..144a919 --- /dev/null +++ b/machine/mytcpserver.cpp @@ -0,0 +1,215 @@ +#include "mytcpserver.h" + +#include +#include +#include +#include +#include "main.h" +//单个包数据大小 +#define PKG_DATA_SIZE 1024 + +MyTcpServer::MyTcpServer(QObject *parent) : + QTcpServer(parent) +{ + qDebug()<<__FUNCTION__; + //花样文件目录 + QDir apppath(qApp->applicationDirPath()); + QString filePath = apppath.path() + QDir::separator() + PATTERNPATH; + m_firstFilePath = QDir(filePath).absolutePath();//为了将"\"变为"/" + m_socket = new QTcpSocket(); + reflashFileTrans(); +} + +MyTcpServer::~MyTcpServer() +{ + delete m_socket ; + qDebug()<<__FUNCTION__; +} + +/** + * @brief 数据打包 + * @param cmd1 + * @param cmd2 + * @param data + * @return + */ +QByteArray MyTcpServer::createDataPacket(int cmd1, int cmd2, QByteArray data) +{ + QByteArray cmd; + cmd += cmd1; + cmd += cmd2; + QByteArray bytes(sizeof(FilePkgHead),0); + FilePkgHead head; + memcpy(&head.cmd,cmd.data(),sizeof(short int)); + head.dataSize = data.size(); +// qDebug()<<"data.size:"<setSocketDescriptor(socketDescriptor); + + // 连接信号和槽来读取来自客户端的数据和处理断开连接 + connect(m_socket, SIGNAL(readyRead()), this, SLOT(connectionHandle())); + connect(m_socket, SIGNAL(disconnected()), this, SLOT(disconnectHandle())); +} + +void MyTcpServer::connectionHandle() +{ + QByteArray buffer = m_socket->readAll(); + + if(!buffer.isEmpty()) + { + char cmd1 = buffer.at(0); + Q_UNUSED(cmd1) + char cmd2 = buffer.at(1); + FilePkgHead *head = (FilePkgHead *)buffer.data(); + QByteArray data = buffer.right(head->dataSize); + + qDebug()<<"============================================================================="; + qDebug()<< "dataLength:" <dataSize<<" "; + + + switch (cmd2) + { + case 0x01://保存文件名和文件大小 + { + if(totalBytes !=0) + qWarning()<<"0x01>>(totalBytes !=0)"; + + reflashFileTrans(); + + //记录文件名称和文件大小 + memcpy(&totalBytes,data.data(),sizeof(qint64)); + const qint64 memory_10M = 10*1024*1024; + if(totalBytes > memory_10M) //文件大小超过10m + { + m_socket->write(createDataPacket(0x01,0x05,NULL)); + reflashFileTrans(); + return; + } + + data = data.right(data.size() - sizeof(qint64)); + fileName = QString::fromUtf8(data); + fileName = m_firstFilePath + QDir::separator() + fileName; + + qDebug()<<"0x01>>Recv Path Name:" << fileName; + qDebug()<<"0x01>>Recv File Name:" << fileName; + qDebug()<<"0x01>>Recv File TotalBytes:" << totalBytes; + + if(QFile(fileName).exists())//文件存在,取消传输 + { + m_socket->write(createDataPacket(0x01,0x05,NULL)); + reflashFileTrans(); + qDebug()<write(createDataPacket(0x01,0x04,NULL)); + m_socket->flush(); + break; + } + + case 0x02://接收文件数据 + { + if((totalBytes == 0) || (totalBytes <= m_fileBuffer_Recv.size())) + { + qWarning()<< "0x02>>(totalBytes == 0) || (totalBytes <= m_fileBuffer_Recv.size())"; + qWarning()<< "0x02>>totalBytes:"<write(createDataPacket(0x01,0x04,NULL)); + m_socket->flush(); + break; + } + + case 0x03://接收文件完成 + { + if(m_fileBuffer_Recv.size() == totalBytes) + { + QFile file(fileName); + if(!file.open(QFile::WriteOnly)) + { + qWarning() << "0x03 open file error!"; + return; + }else{ + file.write(m_fileBuffer_Recv); + file.close(); + qDebug() << "0x03 file.trans success>>>"<>(m_fileBuffer_Recv.size() != totalBytes)"; + + reflashFileTrans(); + break; + } + + case 0x04://发送文件数据 + { + if(!m_fileBuffer_Send.isEmpty()) + { + QByteArray outBlock = m_fileBuffer_Send.left(qMin(m_fileBuffer_Send.size(),PKG_DATA_SIZE)); + m_fileBuffer_Send = m_fileBuffer_Send.right(m_fileBuffer_Send.size() - outBlock.size());//保留后一部分 + QByteArray packet = createDataPacket(0x01,0x02,outBlock); + m_socket->write(packet); + m_socket->flush(); + } + else + { + qDebug()<<"0x04>>m_fileBuffer_Send.isEmpty()"<write(packet); + m_socket->flush(); + reflashFileTrans(); + } + break; + } + + case 0x05://取消传输 + { + reflashFileTrans(); + qDebug()<<"0x05"< +#include +#include + +#pragma pack(1) + +//数据包头 +typedef struct +{ + short int cmd; //命令 + char check;//异或校验 + unsigned int dataSize;//长度 +} FilePkgHead; + +/** + * @brief The MyTcpServer class 文件传输服务器 单连接 + */ +class MyTcpServer: public QTcpServer +{ + Q_OBJECT +public: + MyTcpServer(QObject *parent = NULL); + ~MyTcpServer(); + +protected: + //新的连接 +#ifdef Q_OS_WIN + void incomingConnection(qintptr socketDescriptor); +#endif +#ifdef Q_OS_LINUX + void incomingConnection(int handle); +#endif + +public slots: + void connectionHandle();//协议处理 + void disconnectHandle(); //断开连接 + //数据打包 + QByteArray createDataPacket(int cmd1, int cmd2, QByteArray data); + +public: + qint64 totalBytes; //数据总大小 + QByteArray m_fileBuffer_Send; //缓冲文件,用于发送 + QByteArray m_fileBuffer_Recv; //缓冲文件,用于接收 + QTcpSocket *m_socket; //客户端 + QString fileName; + + QString m_firstFilePath;//根目录前缀 + +private: + void reflashFileTrans(); + +signals: + void recvFileSuccess(QString filePath); + + +}; + +#endif // MYTCPSERVER_H diff --git a/machine/qbindtcpsocket.cpp b/machine/qbindtcpsocket.cpp new file mode 100644 index 0000000..740c43f --- /dev/null +++ b/machine/qbindtcpsocket.cpp @@ -0,0 +1,186 @@ +#include "qbindtcpsocket.h" + +#include + +QBindTcpSocket::QBindTcpSocket(QObject *parent): + QTcpSocket(parent) +{ + +} + +QBindTcpSocket::~QBindTcpSocket() +{ + +} + +int QBindTcpSocket::bindAddrAndPort(QString localAddr, quint16 localPort) +{ + QString str = localAddr; + QHostAddress addr(str); + setLocalAddress(addr); + setLocalPort(localPort); + return 0; +} + +//------------------------------- +TcpConnectDetect::TcpConnectDetect(QObject *parent) : + QObject(parent), + m_pDetectSocket(NULL), + m_localip(DEF_LOCAL_IP), + m_localport(DEF_LOCAL_PORT), + m_serverip(DEF_SERVER_IP), + m_serverport(DEF_SERVER_PORT) +{ +} + +TcpConnectDetect::~TcpConnectDetect() +{ + if (m_pDetectSocket == NULL) + { + m_pDetectSocket->disconnectFromHost(); + m_pDetectSocket->waitForDisconnected(); + m_pDetectSocket->close(); + delete m_pDetectSocket; + } +} + +void TcpConnectDetect::detectStart() +{ + qDebug("TcpConnectDetect start"); + if (m_pDetectSocket == NULL) + { + m_pDetectSocket = new QBindTcpSocket; + } +} + +int TcpConnectDetect::connectDetect() +{ + int connectsta = 0; + int rslt; + + // qDebug() << "TcpConnectDetect " << QThread::currentThread(); + + if (m_pDetectSocket == NULL) + { + return 0; + } + if (m_localip.isEmpty() == false) + { + m_pDetectSocket->bindAddrAndPort(m_localip, m_localport); + } + m_pDetectSocket->abort(); + m_pDetectSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + m_pDetectSocket->connectToHost(m_serverip, m_serverport); + + do + { + rslt = m_pDetectSocket->waitForConnected(4000); // 等待连接 + + qDebug("bind Detect connect rslt=%d", rslt); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + + switch(m_pDetectSocket->state()) + { + case QAbstractSocket::ConnectedState: + { + // 如果连接上,说明 m_pClientSocket 连接已经无效, 需要断开重新连接 + // 先断开测试连接 + m_pDetectSocket->disconnectFromHost(); + m_pDetectSocket->waitForDisconnected(); + connectsta = 1; + // 发送断开主连接的信号 + qDebug() << "detect is Connected, disconnect all"; + + break; + } + case QAbstractSocket::UnconnectedState: + { + // qDebug() << "detect is Unconnected err=" << m_pDetectSocket->error() << ", info:" << m_pDetectSocket->errorString(); + + switch (m_pDetectSocket->error()) + { + case QAbstractSocket::SocketTimeoutError: // 连接超时,说明已经断开 + case QAbstractSocket::NetworkError: // 网络错误, 主机不可连接, 可能已经断开 + { + qDebug() << "detect is timout, disconnect all"; + connectsta = 1; + // 发送断开主连接的信号 + break; + } + case QAbstractSocket::ConnectionRefusedError: // 拒绝连接, 说明连接还在 + { + connectsta = 2; + // qDebug() << "Connection Refused, old connect is alive"; + break; + } + /* + case QAbstractSocket::RemoteHostClosedError: + case QAbstractSocket::HostNotFoundError: + case QAbstractSocket::SocketAccessError: + case QAbstractSocket::SocketResourceError: + case QAbstractSocket::SocketTimeoutError: + case QAbstractSocket::DatagramTooLargeError: + case QAbstractSocket::AddressInUseError: + case QAbstractSocket::SocketAddressNotAvailableError: + case QAbstractSocket::UnsupportedSocketOperationError: + case QAbstractSocket::UnfinishedSocketOperationError: + case QAbstractSocket::ProxyAuthenticationRequiredError: + case QAbstractSocket::SslHandshakeFailedError: + case QAbstractSocket::ProxyConnectionRefusedError: + case QAbstractSocket::ProxyConnectionClosedError: + case QAbstractSocket::ProxyConnectionTimeoutError: + case QAbstractSocket::ProxyNotFoundError: + case QAbstractSocket::ProxyProtocolError: + case QAbstractSocket::UnknownSocketError: + */ + default: + { + // 继续检测 + connectsta = 2; + qDebug() << " retry"; + break; + } + } // 错误处理结束 + } + case QAbstractSocket::ConnectingState: + { + // qDebug() << "detect is Connecting"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + // 继续等待 + break; + } + case QAbstractSocket::HostLookupState: + case QAbstractSocket::BoundState: + case QAbstractSocket::ListeningState: + case QAbstractSocket::ClosingState: + default: + { + // 继续等待 + qDebug("detect sta is %d\r\n", m_pDetectSocket->state()); + break; + } + } + + if (connectsta != 0) + { + break; + } + + }while(1); + + + m_pDetectSocket->close(); + + // 发送本次测试连接的状态信号 + emit(siConnectSta(connectsta)); + return connectsta; +} + +void TcpConnectDetect::setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport) +{ + m_localip = localip; + m_localport = localport; + m_serverip = serverip; + m_serverport = serverport; +} diff --git a/machine/qbindtcpsocket.h b/machine/qbindtcpsocket.h new file mode 100644 index 0000000..b433b66 --- /dev/null +++ b/machine/qbindtcpsocket.h @@ -0,0 +1,53 @@ +#ifndef QBINDTCPSOCKET_H +#define QBINDTCPSOCKET_H + +#define DEF_SERVER_IP "192.168.16.253" +#define DEF_SERVER_PORT 5000 +#define DEF_LOCAL_IP "" +#define DEF_LOCAL_PORT 5001 + + +#include + +class QBindTcpSocket : public QTcpSocket +{ + +public: + QBindTcpSocket(QObject *parent = 0); + virtual ~QBindTcpSocket(); + +public: + int bindAddrAndPort(QString localAddr, quint16 localPort); +}; + +#if(1) +class TcpConnectDetect : public QObject +{ + Q_OBJECT +public: + explicit TcpConnectDetect(QObject *parent = NULL); + virtual ~TcpConnectDetect(); + +signals: + void siConnectSta(int sta); // 网络连接信号 +public: + +public slots: + void detectStart(); + int connectDetect(); + +private: + QBindTcpSocket * m_pDetectSocket; + +public: + void setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport); + +private: + QString m_localip; + quint16 m_localport; + QString m_serverip; + quint16 m_serverport; +}; +#endif + +#endif // QBINDTCPSOCKET_H diff --git a/machine/qextserial/posix_qextserialport.cpp b/machine/qextserial/posix_qextserialport.cpp new file mode 100644 index 0000000..ce92fae --- /dev/null +++ b/machine/qextserial/posix_qextserialport.cpp @@ -0,0 +1,1117 @@ + +/*! +\class Posix_QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates the POSIX portion of QextSerialPort. The user will be notified of errors +and possible portability conflicts at run-time by default - this behavior can be turned off by +defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability +warnings) in the project. Note that _TTY_NOWARN_ will also turn off portability warnings. +*/ + +#include +#include "posix_qextserialport.h" + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort() +Default constructor. Note that the name of the device used by a QextSerialPort constructed with +this constructor will be determined by #defined constants, or lack thereof - the default behavior +is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 + Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +This constructor assigns the device name to the name of the first port on the specified system. +See the other constructors if you need to open a different port. +*/ +Posix_QextSerialPort::Posix_QextSerialPort() +: QextSerialBase() +{ + Posix_File=new QFile(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) +Copy constructor. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) + : QextSerialBase(s.port) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=new QFile(); + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by name. +name is the name of the device, which is windowsystem-specific, +e.g."COM1" or "/dev/ttyS0". +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) + : QextSerialBase(name) +{ + Posix_File=new QFile(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) +Constructs a port with default name and specified settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) + : QextSerialBase() +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) +Constructs a port with specified name and settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) + : QextSerialBase(name) +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +Override the = operator. +*/ +Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); + return *this; +} + +/*! +\fn Posix_QextSerialPort::~Posix_QextSerialPort() +Standard destructor. +*/ +Posix_QextSerialPort::~Posix_QextSerialPort() +{ + if (isOpen()) { + close(); + } + Posix_File->close(); + delete Posix_File; +} + +/*! +\fn void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) +Sets the baud rate of the serial port. Note that not all rates are applicable on +all platforms. The following table shows translations of the various baud rate +constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * +are speeds that are usable on both Windows and POSIX. + +\note +BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support +BAUD1800. + +\verbatim + + RATE Windows Speed POSIX Speed + ----------- ------------- ----------- + BAUD50 110 50 + BAUD75 110 75 + *BAUD110 110 110 + BAUD134 110 134.5 + BAUD150 110 150 + BAUD200 110 200 + *BAUD300 300 300 + *BAUD600 600 600 + *BAUD1200 1200 1200 + BAUD1800 1200 1800 + *BAUD2400 2400 2400 + *BAUD4800 4800 4800 + *BAUD9600 9600 9600 + BAUD14400 14400 9600 + *BAUD19200 19200 19200 + *BAUD38400 38400 38400 + BAUD56000 56000 38400 + *BAUD57600 57600 57600 + BAUD76800 57600 76800 + *BAUD115200 115200 115200 + BAUD128000 128000 115200 + BAUD256000 256000 115200 +\endverbatim +*/ +void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) +{ + LOCK_MUTEX(); + if (Settings.BaudRate!=baudRate) { + switch (baudRate) { + case BAUD14400: + Settings.BaudRate=BAUD9600; + break; + + case BAUD56000: + Settings.BaudRate=BAUD38400; + break; + + case BAUD76800: + +#ifndef B76800 + Settings.BaudRate=BAUD57600; +#else + Settings.BaudRate=baudRate; +#endif + break; + + case BAUD128000: + case BAUD256000: + Settings.BaudRate=BAUD115200; + break; + + default: + Settings.BaudRate=baudRate; + break; + } + } + if (isOpen()) { + switch (baudRate) { + + /*50 baud*/ + case BAUD50: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B50; +#else + cfsetispeed(&Posix_CommConfig, B50); + cfsetospeed(&Posix_CommConfig, B50); +#endif + break; + + /*75 baud*/ + case BAUD75: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B75; +#else + cfsetispeed(&Posix_CommConfig, B75); + cfsetospeed(&Posix_CommConfig, B75); +#endif + break; + + /*110 baud*/ + case BAUD110: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B110; +#else + cfsetispeed(&Posix_CommConfig, B110); + cfsetospeed(&Posix_CommConfig, B110); +#endif + break; + + /*134.5 baud*/ + case BAUD134: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B134; +#else + cfsetispeed(&Posix_CommConfig, B134); + cfsetospeed(&Posix_CommConfig, B134); +#endif + break; + + /*150 baud*/ + case BAUD150: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B150; +#else + cfsetispeed(&Posix_CommConfig, B150); + cfsetospeed(&Posix_CommConfig, B150); +#endif + break; + + /*200 baud*/ + case BAUD200: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B200; +#else + cfsetispeed(&Posix_CommConfig, B200); + cfsetospeed(&Posix_CommConfig, B200); +#endif + break; + + /*300 baud*/ + case BAUD300: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B300; +#else + cfsetispeed(&Posix_CommConfig, B300); + cfsetospeed(&Posix_CommConfig, B300); +#endif + break; + + /*600 baud*/ + case BAUD600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B600; +#else + cfsetispeed(&Posix_CommConfig, B600); + cfsetospeed(&Posix_CommConfig, B600); +#endif + break; + + /*1200 baud*/ + case BAUD1200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1200; +#else + cfsetispeed(&Posix_CommConfig, B1200); + cfsetospeed(&Posix_CommConfig, B1200); +#endif + break; + + /*1800 baud*/ + case BAUD1800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1800; +#else + cfsetispeed(&Posix_CommConfig, B1800); + cfsetospeed(&Posix_CommConfig, B1800); +#endif + break; + + /*2400 baud*/ + case BAUD2400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B2400; +#else + cfsetispeed(&Posix_CommConfig, B2400); + cfsetospeed(&Posix_CommConfig, B2400); +#endif + break; + + /*4800 baud*/ + case BAUD4800: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B4800; +#else + cfsetispeed(&Posix_CommConfig, B4800); + cfsetospeed(&Posix_CommConfig, B4800); +#endif + break; + + /*9600 baud*/ + case BAUD9600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*14400 baud*/ + case BAUD14400: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*19200 baud*/ + case BAUD19200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B19200; +#else + cfsetispeed(&Posix_CommConfig, B19200); + cfsetospeed(&Posix_CommConfig, B19200); +#endif + break; + + /*38400 baud*/ + case BAUD38400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*56000 baud*/ + case BAUD56000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*57600 baud*/ + case BAUD57600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B57600; +#else + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif + break; + + /*76800 baud*/ + case BAUD76800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + +#ifdef B76800 + Posix_CommConfig.c_cflag|=B76800; +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + Posix_CommConfig.c_cflag|=B57600; +#endif //B76800 +#else //CBAUD +#ifdef B76800 + cfsetispeed(&Posix_CommConfig, B76800); + cfsetospeed(&Posix_CommConfig, B76800); +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif //B76800 +#endif //CBAUD + break; + + /*115200 baud*/ + case BAUD115200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*128000 baud*/ + case BAUD128000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*256000 baud*/ + case BAUD256000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) +Sets the number of data bits used by the serial port. Possible values of dataBits are: +\verbatim + DATA_5 5 data bits + DATA_6 6 data bits + DATA_7 7 data bits + DATA_8 8 data bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 5 data bits cannot be used with 2 stop bits. +\par + 8 data bits cannot be used with space parity on POSIX systems. + +*/ +void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) +{ + LOCK_MUTEX(); + if (Settings.DataBits!=dataBits) { + if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || + (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5) || + (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { + } + else { + Settings.DataBits=dataBits; + } + } + if (isOpen()) { + switch(dataBits) { + + /*5 data bits*/ + case DATA_5: + if (Settings.StopBits==STOP_2) { + TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS5; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*6 data bits*/ + case DATA_6: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS6; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*7 data bits*/ + case DATA_7: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS7; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*8 data bits*/ + case DATA_8: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS8; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setParity(ParityType parity) +Sets the parity associated with the serial port. The possible values of parity are: +\verbatim + PAR_SPACE Space Parity + PAR_MARK Mark Parity + PAR_NONE No Parity + PAR_EVEN Even Parity + PAR_ODD Odd Parity +\endverbatim + +\note +This function is subject to the following limitations: +\par +POSIX systems do not support mark parity. +\par +POSIX systems support space parity only if tricked into doing so, and only with + fewer than 8 data bits. Use space parity very carefully with POSIX systems. + +*/ +void Posix_QextSerialPort::setParity(ParityType parity) +{ + LOCK_MUTEX(); + if (Settings.Parity!=parity) { + if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { + } + else { + Settings.Parity=parity; + } + } + if (isOpen()) { + switch (parity) { + + /*space parity*/ + case PAR_SPACE: + if (Settings.DataBits==DATA_8) { + TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); + } + else { + + /*space parity not directly supported - add an extra data bit to simulate it*/ + Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); + switch(Settings.DataBits) { + case DATA_5: + Settings.DataBits=DATA_6; + Posix_CommConfig.c_cflag|=CS6; + break; + + case DATA_6: + Settings.DataBits=DATA_7; + Posix_CommConfig.c_cflag|=CS7; + break; + + case DATA_7: + Settings.DataBits=DATA_8; + Posix_CommConfig.c_cflag|=CS8; + break; + + case DATA_8: + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*mark parity - WINDOWS ONLY*/ + case PAR_MARK: + TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); + break; + + /*no parity*/ + case PAR_NONE: + Posix_CommConfig.c_cflag&=(~PARENB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*even parity*/ + case PAR_EVEN: + Posix_CommConfig.c_cflag&=(~PARODD); + Posix_CommConfig.c_cflag|=PARENB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*odd parity*/ + case PAR_ODD: + Posix_CommConfig.c_cflag|=(PARENB|PARODD); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) +Sets the number of stop bits used by the serial port. Possible values of stopBits are: +\verbatim + STOP_1 1 stop bit + STOP_1_5 1.5 stop bits + STOP_2 2 stop bits +\endverbatim +\note +This function is subject to the following restrictions: +\par + 2 stop bits cannot be used with 5 data bits. +\par + POSIX does not support 1.5 stop bits. + +*/ +void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) +{ + LOCK_MUTEX(); + if (Settings.StopBits!=stopBits) { + if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} + else { + Settings.StopBits=stopBits; + } + } + if (isOpen()) { + switch (stopBits) { + + /*one stop bit*/ + case STOP_1: + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag&=(~CSTOPB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*1.5 stop bits*/ + case STOP_1_5: + TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); + break; + + /*two stop bits*/ + case STOP_2: + if (Settings.DataBits==DATA_5) { + TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); + } + else { + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag|=CSTOPB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setFlowControl(FlowType flow) +Sets the flow control used by the port. Possible values of flow are: +\verbatim + FLOW_OFF No flow control + FLOW_HARDWARE Hardware (RTS/CTS) flow control + FLOW_XONXOFF Software (XON/XOFF) flow control +\endverbatim +\note +FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is +unsupported, FLOW_HARDWARE is the same as FLOW_OFF. + +*/ +void Posix_QextSerialPort::setFlowControl(FlowType flow) +{ + LOCK_MUTEX(); + if (Settings.FlowControl!=flow) { + Settings.FlowControl=flow; + } + if (isOpen()) { + switch(flow) { + + /*no flow control*/ + case FLOW_OFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*software (XON/XOFF) flow control*/ + case FLOW_XONXOFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + case FLOW_HARDWARE: + Posix_CommConfig.c_cflag|=CRTSCTS; + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec); +Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. +Note that this is a per-character timeout, i.e. the port will wait this long for each +individual character, not for the whole read operation. This timeout also applies to the +bytesWaiting() function. + +\note +POSIX does not support millisecond-level control for I/O timeout values. Any +timeout set using this function will be set to the next lowest tenth of a second for +the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds +will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and +writing the port. However millisecond-level control is allowed by the select() system call, +so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for +the purpose of detecting available bytes in the read buffer. + +*/ +void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec) +{ + LOCK_MUTEX(); + Settings.Timeout_Sec=sec; + Settings.Timeout_Millisec=millisec; + Posix_Copy_Timeout.tv_sec=sec; + Posix_Copy_Timeout.tv_usec=millisec; + if (isOpen()) { + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + Posix_CommConfig.c_cc[VTIME]=sec*10+millisec/100; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn bool Posix_QextSerialPort::open(OpenMode mode) +Opens the serial port associated to this class. +This function has no effect if the port associated with the class is already open. +The port is also configured to the current settings, as stored in the Settings structure. +*/ +bool Posix_QextSerialPort::open(OpenMode mode) +{ + LOCK_MUTEX(); + if (mode == QIODevice::NotOpen) + return isOpen(); + if (!isOpen()) { + /*open the port*/ + Posix_File->setFileName(port); + qDebug("Trying to open File"); + if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { + qDebug("Opened File succesfully"); + /*set open mode*/ + QIODevice::open(mode); + + /*configure port settings*/ + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + + /*set up other port settings*/ + Posix_CommConfig.c_cflag|=CREAD|CLOCAL; + Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); + Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); + Posix_CommConfig.c_oflag&=(~OPOST); + Posix_CommConfig.c_cc[VMIN]=0; + Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; + setBaudRate(Settings.BaudRate); + setDataBits(Settings.DataBits); + setParity(Settings.Parity); + setStopBits(Settings.StopBits); + setFlowControl(Settings.FlowControl); + setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } else { + qDebug("Could not open File! Error code : %d", Posix_File->error()); + } + } + UNLOCK_MUTEX(); + return isOpen(); +} + +/*! +\fn void Posix_QextSerialPort::close() +Closes a serial port. This function has no effect if the serial port associated with the class +is not currently open. +*/ +void Posix_QextSerialPort::close() +{ + LOCK_MUTEX(); + Posix_File->close(); + QIODevice::close(); + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::flush() +Flushes all pending I/O to the serial port. This function has no effect if the serial port +associated with the class is not currently open. +*/ +void Posix_QextSerialPort::flush() +{ + LOCK_MUTEX(); + if (isOpen()) { + Posix_File->flush(); + } + UNLOCK_MUTEX(); +} + +/*! +\fn qint64 Posix_QextSerialPort::size() const +This function will return the number of bytes waiting in the receive queue of the serial port. +It is included primarily to provide a complete QIODevice interface, and will not record errors +in the lastErr member (because it is const). This function is also not thread-safe - in +multithreading situations, use Posix_QextSerialPort::bytesWaiting() instead. +*/ +qint64 Posix_QextSerialPort::size() const +{ + int numBytes; + if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { + numBytes=0; + } + return (qint64)numBytes; +} + +/*! +\fn qint64 Posix_QextSerialPort::bytesAvailable() +Returns the number of bytes waiting in the port's receive queue. This function will return 0 if +the port is not currently open, or -1 on error. Error information can be retrieved by calling +Posix_QextSerialPort::getLastError(). +*/ +qint64 Posix_QextSerialPort::bytesAvailable() +{ + LOCK_MUTEX(); + if (isOpen()) { + int bytesQueued; + fd_set fileSet; + FD_ZERO(&fileSet); + FD_SET(Posix_File->handle(), &fileSet); + + /*on Linux systems the Posix_Timeout structure will be altered by the select() call. + Make sure we use the right timeout values*/ + //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); + Posix_Timeout = Posix_Copy_Timeout; + int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); + if (!n) { + lastErr=E_PORT_TIMEOUT; + UNLOCK_MUTEX(); + return -1; + } + if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { + translateError(errno); + UNLOCK_MUTEX(); + return -1; + } + lastErr=E_NO_ERROR; + UNLOCK_MUTEX(); + return bytesQueued + QIODevice::bytesAvailable(); + } + UNLOCK_MUTEX(); + return 0; +} + +/*! +\fn void Posix_QextSerialPort::ungetChar(char) +This function is included to implement the full QIODevice interface, and currently has no +purpose within this class. This function is meaningless on an unbuffered device and currently +only prints a warning message to that effect. +*/ +void Posix_QextSerialPort::ungetChar(char) +{ + /*meaningless on unbuffered sequential device - return error and print a warning*/ + TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); +} + +/*! +\fn void Posix_QextSerialPort::translateError(ulong error) +Translates a system-specific error code to a QextSerialPort error code. Used internally. +*/ +void Posix_QextSerialPort::translateError(ulong error) +{ + switch (error) { + case EBADF: + case ENOTTY: + lastErr=E_INVALID_FD; + break; + + case EINTR: + lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; + break; + + case ENOMEM: + lastErr=E_NO_MEMORY; + break; + } +} + +/*! +\fn void Posix_QextSerialPort::setDtr(bool set) +Sets DTR line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Posix_QextSerialPort::setDtr(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_DTR; + } + else { + status&=~TIOCM_DTR; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setRts(bool set) +Sets RTS line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Posix_QextSerialPort::setRts(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_RTS; + } + else { + status&=~TIOCM_RTS; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn unsigned long Posix_QextSerialPort::lineStatus() +returns the line status as stored by the port function. This function will retrieve the states +of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines +can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned +long with specific bits indicating which lines are high. The following constants should be used +to examine the states of individual lines: + +\verbatim +Mask Line +------ ---- +LS_CTS CTS +LS_DSR DSR +LS_DCD DCD +LS_RI RI +LS_RTS RTS (POSIX only) +LS_DTR DTR (POSIX only) +LS_ST Secondary TXD (POSIX only) +LS_SR Secondary RXD (POSIX only) +\endverbatim + +This function will return 0 if the port associated with the class is not currently open. +*/ +unsigned long Posix_QextSerialPort::lineStatus() +{ + unsigned long Status=0, Temp=0; + LOCK_MUTEX(); + if (isOpen()) { + ioctl(Posix_File->handle(), TIOCMGET, &Temp); + if (Temp&TIOCM_CTS) { + Status|=LS_CTS; + } + if (Temp&TIOCM_DSR) { + Status|=LS_DSR; + } + if (Temp&TIOCM_RI) { + Status|=LS_RI; + } + if (Temp&TIOCM_CD) { + Status|=LS_DCD; + } + if (Temp&TIOCM_DTR) { + Status|=LS_DTR; + } + if (Temp&TIOCM_RTS) { + Status|=LS_RTS; + } + if (Temp&TIOCM_ST) { + Status|=LS_ST; + } + if (Temp&TIOCM_SR) { + Status|=LS_SR; + } + } + UNLOCK_MUTEX(); + return Status; +} + +/*! +\fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +Reads a block of data from the serial port. This function will read at most maxSize bytes from +the serial port and place them in the buffer pointed to by data. Return value is the number of +bytes actually read, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->read(data, maxSize); + if (retVal==-1) + lastErr=E_READ_FAILED; + UNLOCK_MUTEX(); + + return retVal; +} + +/*! +\fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +Writes a block of data to the serial port. This function will write maxSize bytes +from the buffer pointed to by data to the serial port. Return value is the number +of bytes actually written, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->write(data, maxSize); + if (retVal==-1) + lastErr=E_WRITE_FAILED; + UNLOCK_MUTEX(); + + flush(); + return retVal; +} diff --git a/machine/qextserial/posix_qextserialport.h b/machine/qextserial/posix_qextserialport.h new file mode 100644 index 0000000..559d2f6 --- /dev/null +++ b/machine/qextserial/posix_qextserialport.h @@ -0,0 +1,57 @@ + +#ifndef _POSIX_QEXTSERIALPORT_H_ +#define _POSIX_QEXTSERIALPORT_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "qextserialbase.h" + +class Posix_QextSerialPort:public QextSerialBase { +public: + Posix_QextSerialPort(); + Posix_QextSerialPort(const Posix_QextSerialPort& s); + Posix_QextSerialPort(const QString & name); + Posix_QextSerialPort(const PortSettings& settings); + Posix_QextSerialPort(const QString & name, const PortSettings& settings); + Posix_QextSerialPort& operator=(const Posix_QextSerialPort& s); + virtual ~Posix_QextSerialPort(); + + virtual void setBaudRate(BaudRateType); + virtual void setDataBits(DataBitsType); + virtual void setParity(ParityType); + virtual void setStopBits(StopBitsType); + virtual void setFlowControl(FlowType); + virtual void setTimeout(ulong, ulong); + + virtual bool open(OpenMode mode=0); + virtual void close(); + virtual void flush(); + + virtual qint64 size() const; + virtual qint64 bytesAvailable(); + + virtual void ungetChar(char c); + + virtual void translateError(ulong error); + + virtual void setDtr(bool set=true); + virtual void setRts(bool set=true); + virtual ulong lineStatus(); + + QFile* Posix_File; +protected: + //QFile* Posix_File; + struct termios Posix_CommConfig; + struct timeval Posix_Timeout; + struct timeval Posix_Copy_Timeout; + + virtual qint64 readData(char * data, qint64 maxSize); + virtual qint64 writeData(const char * data, qint64 maxSize); +}; + +#endif diff --git a/machine/qextserial/qextserialbase.cpp b/machine/qextserial/qextserialbase.cpp new file mode 100644 index 0000000..027913d --- /dev/null +++ b/machine/qextserial/qextserialbase.cpp @@ -0,0 +1,250 @@ + +#include "qextserialbase.h" + +/*! +\class QextSerialBase +\version 1.0.0 +\author Stefan Sander + +A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. +*/ +#ifdef QT_THREAD_SUPPORT +QMutex* QextSerialBase::mutex=NULL; +unsigned long QextSerialBase::refCount=0; +#endif + +/*! +\fn QextSerialBase::QextSerialBase() +Default constructor. +*/ +QextSerialBase::QextSerialBase() + : QIODevice() +{ + +#ifdef _TTY_WIN_ + setPortName("COM1"); + +#elif defined(_TTY_IRIX_) + setPortName("/dev/ttyf1"); + +#elif defined(_TTY_HPUX_) + setPortName("/dev/tty1p0"); + +#elif defined(_TTY_SUN_) + setPortName("/dev/ttya"); + +#elif defined(_TTY_DIGITAL_) + setPortName("/dev/tty01"); + +#elif defined(_TTY_FREEBSD_) + setPortName("/dev/ttyd1"); + +#else + setPortName("/dev/ttyS0"); +#endif + + construct(); +} + +/*! +\fn QextSerialBase::QextSerialBase(const QString & name) +Construct a port and assign it to the device specified by the name parameter. +*/ +QextSerialBase::QextSerialBase(const QString & name) + : QIODevice() +{ + setPortName(name); + construct(); +} + +/*! +\fn QextSerialBase::~QextSerialBase() +Standard destructor. +*/ +QextSerialBase::~QextSerialBase() +{ + +#ifdef QT_THREAD_SUPPORT + refCount--; + if (mutex && refCount==0) { + delete mutex; + mutex=NULL; + } +#endif + +} + +/*! +\fn void QextSerialBase::construct() +Common constructor function for setting up default port settings. +(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 500 ms timeout). +*/ +void QextSerialBase::construct() +{ + Settings.BaudRate=BAUD115200; + Settings.DataBits=DATA_8; + Settings.Parity=PAR_NONE; + Settings.StopBits=STOP_1; + Settings.FlowControl=FLOW_HARDWARE; + Settings.Timeout_Sec=0; + Settings.Timeout_Millisec=500; + +#ifdef QT_THREAD_SUPPORT + if (!mutex) { + mutex=new QMutex( QMutex::Recursive ); + } + refCount++; +#endif + + setOpenMode(QIODevice::NotOpen); +} + +/*! +\fn void QextSerialBase::setPortName(const QString & name) +Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0". +*/ +void QextSerialBase::setPortName(const QString & name) +{ + port = name; +} + +/*! +\fn QString QextSerialBase::portName() const +Returns the name set by setPortName(). +*/ +QString QextSerialBase::portName() const +{ + return port; +} + +/*! +\fn BaudRateType QextSerialBase::baudRate(void) const +Returns the baud rate of the serial port. For a list of possible return values see +the definition of the enum BaudRateType. +*/ +BaudRateType QextSerialBase::baudRate(void) const +{ + return Settings.BaudRate; +} + +/*! +\fn DataBitsType QextSerialBase::dataBits() const +Returns the number of data bits used by the port. For a list of possible values returned by +this function, see the definition of the enum DataBitsType. +*/ +DataBitsType QextSerialBase::dataBits() const +{ + return Settings.DataBits; +} + +/*! +\fn ParityType QextSerialBase::parity() const +Returns the type of parity used by the port. For a list of possible values returned by +this function, see the definition of the enum ParityType. +*/ +ParityType QextSerialBase::parity() const +{ + return Settings.Parity; +} + +/*! +\fn StopBitsType QextSerialBase::stopBits() const +Returns the number of stop bits used by the port. For a list of possible return values, see +the definition of the enum StopBitsType. +*/ +StopBitsType QextSerialBase::stopBits() const +{ + return Settings.StopBits; +} + +/*! +\fn FlowType QextSerialBase::flowControl() const +Returns the type of flow control used by the port. For a list of possible values returned +by this function, see the definition of the enum FlowType. +*/ +FlowType QextSerialBase::flowControl() const +{ + return Settings.FlowControl; +} + +/*! +\fn bool QextSerialBase::isSequential() const +Returns true if device is sequential, otherwise returns false. Serial port is sequential device +so this function always returns true. Check QIODevice::isSequential() documentation for more +information. +*/ +bool QextSerialBase::isSequential() const +{ + return true; +} + +/*! +\fn bool QextSerialBase::atEnd() const +This function will return true if the input buffer is empty (or on error), and false otherwise. +Call QextSerialBase::lastError() for error information. +*/ +bool QextSerialBase::atEnd() const +{ + if (size()) { + return true; + } + return false; +} + +/*! +\fn qint64 QextSerialBase::readLine(char * data, qint64 maxSize) +This function will read a line of buffered input from the port, stopping when either maxSize bytes +have been read, the port has no more data available, or a newline is encountered. +The value returned is the length of the string that was read. +*/ +qint64 QextSerialBase::readLine(char * data, qint64 maxSize) +{ + qint64 numBytes = bytesAvailable(); + char* pData = data; + + if (maxSize < 2) //maxSize must be larger than 1 + return -1; + + /*read a byte at a time for MIN(bytesAvail, maxSize - 1) iterations, or until a newline*/ + while (pData<(data+numBytes) && --maxSize) { + readData(pData, 1); + if (*pData++ == '\n') { + break; + } + } + *pData='\0'; + + /*return size of data read*/ + return (pData-data); +} + +/*! +\fn ulong QextSerialBase::lastError() const +Returns the code for the last error encountered by the port, or E_NO_ERROR if the last port +operation was successful. Possible error codes are: + +\verbatim +Error Explanation +--------------------------- ------------------------------------------------------------- +E_NO_ERROR No Error has occured +E_INVALID_FD Invalid file descriptor (port was not opened correctly) +E_NO_MEMORY Unable to allocate memory tables (POSIX) +E_CAUGHT_NON_BLOCKED_SIGNAL Caught a non-blocked signal (POSIX) +E_PORT_TIMEOUT Operation timed out (POSIX) +E_INVALID_DEVICE The file opened by the port is not a character device (POSIX) +E_BREAK_CONDITION The port detected a break condition +E_FRAMING_ERROR The port detected a framing error + (usually caused by incorrect baud rate settings) +E_IO_ERROR There was an I/O error while communicating with the port +E_BUFFER_OVERRUN Character buffer overrun +E_RECEIVE_OVERFLOW Receive buffer overflow +E_RECEIVE_PARITY_ERROR The port detected a parity error in the received data +E_TRANSMIT_OVERFLOW Transmit buffer overflow +E_READ_FAILED General read operation failure +E_WRITE_FAILED General write operation failure +\endverbatim +*/ +ulong QextSerialBase::lastError() const +{ + return lastErr; +} diff --git a/machine/qextserial/qextserialbase.h b/machine/qextserial/qextserialbase.h new file mode 100644 index 0000000..cd8fcac --- /dev/null +++ b/machine/qextserial/qextserialbase.h @@ -0,0 +1,196 @@ + +#ifndef _QEXTSERIALBASE_H_ +#define _QEXTSERIALBASE_H_ + +#include +#include + +#ifdef QT_THREAD_SUPPORT +#include +#include +#endif + +/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ +#ifdef _TTY_NOWARN_ +#define _TTY_NOWARN_PORT_ +#endif + +/*macros for thread support*/ +#ifdef QT_THREAD_SUPPORT +#define LOCK_MUTEX() mutex->lock() +#define UNLOCK_MUTEX() mutex->unlock() +#else +#define LOCK_MUTEX() +#define UNLOCK_MUTEX() +#endif + +/*macros for warning messages*/ +#ifdef _TTY_NOWARN_PORT_ +#define TTY_PORTABILITY_WARNING(s) +#else +#define TTY_PORTABILITY_WARNING(s) qWarning(s) +#endif +#ifdef _TTY_NOWARN_ +#define TTY_WARNING(s) +#else +#define TTY_WARNING(s) qWarning(s) +#endif + + +/*line status constants*/ +#define LS_CTS 0x01 +#define LS_DSR 0x02 +#define LS_DCD 0x04 +#define LS_RI 0x08 +#define LS_RTS 0x10 +#define LS_DTR 0x20 +#define LS_ST 0x40 +#define LS_SR 0x80 + +/*error constants*/ +#define E_NO_ERROR 0 +#define E_INVALID_FD 1 +#define E_NO_MEMORY 2 +#define E_CAUGHT_NON_BLOCKED_SIGNAL 3 +#define E_PORT_TIMEOUT 4 +#define E_INVALID_DEVICE 5 +#define E_BREAK_CONDITION 6 +#define E_FRAMING_ERROR 7 +#define E_IO_ERROR 8 +#define E_BUFFER_OVERRUN 9 +#define E_RECEIVE_OVERFLOW 10 +#define E_RECEIVE_PARITY_ERROR 11 +#define E_TRANSMIT_OVERFLOW 12 +#define E_READ_FAILED 13 +#define E_WRITE_FAILED 14 + +/*enums for port settings*/ +enum NamingConvention { + WIN_NAMES, + IRIX_NAMES, + HPUX_NAMES, + SUN_NAMES, + DIGITAL_NAMES, + FREEBSD_NAMES, + LINUX_NAMES +}; + +enum BaudRateType { + BAUD50, //POSIX ONLY + BAUD75, //POSIX ONLY + BAUD110, + BAUD134, //POSIX ONLY + BAUD150, //POSIX ONLY + BAUD200, //POSIX ONLY + BAUD300, + BAUD600, + BAUD1200, + BAUD1800, //POSIX ONLY + BAUD2400, + BAUD4800, + BAUD9600, + BAUD14400, //WINDOWS ONLY + BAUD19200, + BAUD38400, + BAUD56000, //WINDOWS ONLY + BAUD57600, + BAUD76800, //POSIX ONLY + BAUD115200, + BAUD128000, //WINDOWS ONLY + BAUD256000 //WINDOWS ONLY +}; + +enum DataBitsType { + DATA_5, + DATA_6, + DATA_7, + DATA_8 +}; + +enum ParityType { + PAR_NONE, + PAR_ODD, + PAR_EVEN, + PAR_MARK, //WINDOWS ONLY + PAR_SPACE +}; + +enum StopBitsType { + STOP_1, + STOP_1_5, //WINDOWS ONLY + STOP_2 +}; + +enum FlowType { + FLOW_OFF, + FLOW_HARDWARE, + FLOW_XONXOFF +}; + +/*structure to contain port settings*/ +struct PortSettings { + BaudRateType BaudRate; + DataBitsType DataBits; + ParityType Parity; + StopBitsType StopBits; + FlowType FlowControl; + ulong Timeout_Sec; + ulong Timeout_Millisec; +}; + +class QextSerialBase : public QIODevice { +public: + QextSerialBase(); + QextSerialBase(const QString & name); + virtual ~QextSerialBase(); + virtual void construct(); + virtual void setPortName(const QString & name); + virtual QString portName() const; + + virtual void setBaudRate(BaudRateType)=0; + virtual BaudRateType baudRate() const; + virtual void setDataBits(DataBitsType)=0; + virtual DataBitsType dataBits() const; + virtual void setParity(ParityType)=0; + virtual ParityType parity() const; + virtual void setStopBits(StopBitsType)=0; + virtual StopBitsType stopBits() const; + virtual void setFlowControl(FlowType)=0; + virtual FlowType flowControl() const; + virtual void setTimeout(ulong, ulong)=0; + + virtual bool open(OpenMode mode=0)=0; + virtual bool isSequential() const; + virtual void close()=0; + virtual void flush()=0; + + virtual qint64 size() const=0; + virtual qint64 bytesAvailable()=0; + virtual bool atEnd() const; + + virtual void ungetChar(char c)=0; + virtual qint64 readLine(char * data, qint64 maxSize); + + virtual ulong lastError() const; + virtual void translateError(ulong error)=0; + + virtual void setDtr(bool set=true)=0; + virtual void setRts(bool set=true)=0; + virtual ulong lineStatus()=0; + +protected: + QString port; + PortSettings Settings; + ulong lastErr; + +#ifdef QT_THREAD_SUPPORT + static QMutex* mutex; + static ulong refCount; +#endif + + virtual qint64 readData(char * data, qint64 maxSize)=0; + virtual qint64 writeData(const char * data, qint64 maxSize)=0; + +}; + +#endif diff --git a/machine/qextserial/qextserialport.cpp b/machine/qextserial/qextserialport.cpp new file mode 100644 index 0000000..1c0d9bf --- /dev/null +++ b/machine/qextserial/qextserialport.cpp @@ -0,0 +1,98 @@ + +/*! +\class QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates a serial port on both POSIX and Windows systems. The user will be +notified of errors and possible portability conflicts at run-time by default - this behavior can +be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn +off portability warnings) in the project. + +\note +On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may +select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can +make no guarantees as to the quality of POSIX support under NT/2000 however. + +*/ + +#include +#include "qextserialport.h" + +/*! +\fn QextSerialPort::QextSerialPort() +Default constructor. Note that the naming convention used by a QextSerialPort constructed with +this constructor will be determined by #defined constants, or lack thereof - the default behavior +is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 + Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +The object will be associated with the first port in the system, e.g. COM1 on Windows systems. +See the other constructors if you need to use a port other than the first. +*/ +QextSerialPort::QextSerialPort() + : QextBaseType() +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by name. +name is the name of the device, which is windowsystem-specific, +e.g."COM1" or "/dev/ttyS0". +*/ +QextSerialPort::QextSerialPort(const QString & name) + : QextBaseType(name) +{} + +/*! +\fn QextSerialPort::QextSerialPort(PortSettings const& settings) +Constructs a port with default name and settings specified by the settings parameter. +*/ +QextSerialPort::QextSerialPort(PortSettings const& settings) + : QextBaseType(settings) +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) +Constructs a port with the name and settings specified. +*/ +QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) + : QextBaseType(name, settings) +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QextSerialPort& s) +Copy constructor. +*/ +QextSerialPort::QextSerialPort(const QextSerialPort& s) + : QextBaseType(s) +{} + +/*! +\fn QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) +Overrides the = operator. +*/ +QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) +{ + return (QextSerialPort&)QextBaseType::operator=(s); +} + +/*! +\fn QextSerialPort::~QextSerialPort() +Standard destructor. +*/ +QextSerialPort::~QextSerialPort() +{} diff --git a/machine/qextserial/qextserialport.h b/machine/qextserial/qextserialport.h new file mode 100644 index 0000000..c1c296e --- /dev/null +++ b/machine/qextserial/qextserialport.h @@ -0,0 +1,27 @@ + +#ifndef _QEXTSERIALPORT_H_ +#define _QEXTSERIALPORT_H_ + +/*POSIX CODE*/ +#ifdef _TTY_POSIX_ +#include "posix_qextserialport.h" +#define QextBaseType Posix_QextSerialPort + +/*MS WINDOWS CODE*/ +#else +#include "win_qextserialport.h" +#define QextBaseType Win_QextSerialPort +#endif + +class QextSerialPort: public QextBaseType { +public: + QextSerialPort(); + QextSerialPort(const QString & name); + QextSerialPort(PortSettings const& s); + QextSerialPort(const QString & name, PortSettings const& s); + QextSerialPort(const QextSerialPort& s); + QextSerialPort& operator=(const QextSerialPort&); + virtual ~QextSerialPort(); +}; + +#endif diff --git a/machine/qextserial/win_qextserialport.cpp b/machine/qextserial/win_qextserialport.cpp new file mode 100644 index 0000000..9c2434d --- /dev/null +++ b/machine/qextserial/win_qextserialport.cpp @@ -0,0 +1,880 @@ +/*! +\class Win_QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates the Windows portion of QextSerialPort. The user will be notified of +errors and possible portability conflicts at run-time by default - this behavior can be turned +off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off +portability warnings) in the project. Note that defining _TTY_NOWARN_ also defines +_TTY_NOWARN_PORT_. + +\note +On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may +select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can +make no guarantees as to the quality of POSIX support under NT/2000 however. + +*/ + +#include +#include "win_qextserialport.h" + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort() +Default constructor. Note that the name of the device used by a Win_QextSerialPort constructed +with this constructor will be determined by #defined constants, or lack thereof - the default +behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants +are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 + Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +This constructor associates the object with the first port on the system, e.g. COM1 for Windows +platforms. See the other constructor if you need a port other than the first. +*/ +Win_QextSerialPort::Win_QextSerialPort():QextSerialBase() { + Win_Handle=INVALID_HANDLE_VALUE; +} + +/*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&) +Copy constructor. +*/ +Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s):QextSerialBase(s.port) { + Win_Handle=INVALID_HANDLE_VALUE; + setOpenMode(s.openMode()); + lastErr=s.lastErr; + port = s.port; + Settings.FlowControl=s.Settings.FlowControl; + Settings.Parity=s.Settings.Parity; + Settings.DataBits=s.Settings.DataBits; + Settings.StopBits=s.Settings.StopBits; + Settings.BaudRate=s.Settings.BaudRate; + Win_Handle=s.Win_Handle; + memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); + memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by devName. +devName is the name of the device, which is windowsystem-specific, +e.g."COM2" or "/dev/ttyS0". +*/ +Win_QextSerialPort::Win_QextSerialPort(const QString & name):QextSerialBase(name) { + Win_Handle=INVALID_HANDLE_VALUE; +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) +Constructs a port with default name and specified settings. +*/ +Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) { + Win_Handle=INVALID_HANDLE_VALUE; + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setStopBits(settings.StopBits); + setParity(settings.Parity); + setFlowControl(settings.FlowControl); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) +Constructs a port with specified name and settings. +*/ +Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) { + Win_Handle=INVALID_HANDLE_VALUE; + setPortName(name); + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setStopBits(settings.StopBits); + setParity(settings.Parity); + setFlowControl(settings.FlowControl); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Win_QextSerialPort::~Win_QextSerialPort() +Standard destructor. +*/ +Win_QextSerialPort::~Win_QextSerialPort() { + if (isOpen()) { + close(); + } +} + +/*! +\fn Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) +overrides the = operator +*/ +Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) { + setOpenMode(s.openMode()); + lastErr=s.lastErr; + port = s.port; + Settings.FlowControl=s.Settings.FlowControl; + Settings.Parity=s.Settings.Parity; + Settings.DataBits=s.Settings.DataBits; + Settings.StopBits=s.Settings.StopBits; + Settings.BaudRate=s.Settings.BaudRate; + Win_Handle=s.Win_Handle; + memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); + memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); + return *this; +} + +/*! +\fn bool Win_QextSerialPort::open(OpenMode mode) +Opens a serial port. Note that this function does not specify which device to open. If you need +to open a device by name, see Win_QextSerialPort::open(const char*). This function has no effect +if the port associated with the class is already open. The port is also configured to the current +settings, as stored in the Settings structure. +*/ +bool Win_QextSerialPort::open(OpenMode mode) { + unsigned long confSize = sizeof(COMMCONFIG); + Win_CommConfig.dwSize = confSize; + + LOCK_MUTEX(); + if (mode == QIODevice::NotOpen) + return isOpen(); + if (!isOpen()) { + /*open the port*/ + Win_Handle=CreateFileA(port.toLatin1(), GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (Win_Handle!=INVALID_HANDLE_VALUE) { + /*set open mode*/ + QIODevice::open(mode); + + /*configure port settings*/ + GetCommConfig(Win_Handle, &Win_CommConfig, &confSize); + GetCommState(Win_Handle, &(Win_CommConfig.dcb)); + + /*set up parameters*/ + Win_CommConfig.dcb.fBinary=TRUE; + Win_CommConfig.dcb.fInX=FALSE; + Win_CommConfig.dcb.fOutX=FALSE; + Win_CommConfig.dcb.fAbortOnError=FALSE; + Win_CommConfig.dcb.fNull=FALSE; + setBaudRate(Settings.BaudRate); + setDataBits(Settings.DataBits); + setStopBits(Settings.StopBits); + setParity(Settings.Parity); + setFlowControl(Settings.FlowControl); + setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + } + UNLOCK_MUTEX(); + return isOpen(); +} + +/*! +\fn void Win_QextSerialPort::close() +Closes a serial port. This function has no effect if the serial port associated with the class +is not currently open. +*/ +void Win_QextSerialPort::close() { + LOCK_MUTEX(); + CloseHandle(Win_Handle); + QIODevice::close(); + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::flush() +Flushes all pending I/O to the serial port. This function has no effect if the serial port +associated with the class is not currently open. +*/ +void Win_QextSerialPort::flush() { + LOCK_MUTEX(); + if (isOpen()) { + FlushFileBuffers(Win_Handle); + } + UNLOCK_MUTEX(); +} + +/*! +\fn qint64 Win_QextSerialPort::size() const +This function will return the number of bytes waiting in the receive queue of the serial port. +It is included primarily to provide a complete QIODevice interface, and will not record errors +in the lastErr member (because it is const). This function is also not thread-safe - in +multithreading situations, use Win_QextSerialPort::bytesAvailable() instead. +*/ +qint64 Win_QextSerialPort::size() const { + int availBytes; + COMSTAT Win_ComStat; + DWORD Win_ErrorMask=0; + ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); + availBytes = Win_ComStat.cbInQue; + return (qint64)availBytes; +} + +/*! +\fn qint64 Win_QextSerialPort::bytesAvailable() +Returns the number of bytes waiting in the port's receive queue. This function will return 0 if +the port is not currently open, or -1 on error. Error information can be retrieved by calling +Win_QextSerialPort::getLastError(). +*/ +qint64 Win_QextSerialPort::bytesAvailable() { + LOCK_MUTEX(); + if (isOpen()) { + DWORD Errors; + COMSTAT Status; + bool success=ClearCommError(Win_Handle, &Errors, &Status); + translateError(Errors); + if (success) { + lastErr=E_NO_ERROR; + UNLOCK_MUTEX(); + return Status.cbInQue + QIODevice::bytesAvailable(); + } + UNLOCK_MUTEX(); + return (unsigned int)-1; + } + UNLOCK_MUTEX(); + return 0; +} + +/*! +\fn void Win_QextSerialPort::translateError(ulong error) +Translates a system-specific error code to a QextSerialPort error code. Used internally. +*/ +void Win_QextSerialPort::translateError(ulong error) { + if (error&CE_BREAK) { + lastErr=E_BREAK_CONDITION; + } + else if (error&CE_FRAME) { + lastErr=E_FRAMING_ERROR; + } + else if (error&CE_IOE) { + lastErr=E_IO_ERROR; + } + else if (error&CE_MODE) { + lastErr=E_INVALID_FD; + } + else if (error&CE_OVERRUN) { + lastErr=E_BUFFER_OVERRUN; + } + else if (error&CE_RXPARITY) { + lastErr=E_RECEIVE_PARITY_ERROR; + } + else if (error&CE_RXOVER) { + lastErr=E_RECEIVE_OVERFLOW; + } + else if (error&CE_TXFULL) { + lastErr=E_TRANSMIT_OVERFLOW; + } +} + +/*! +\fn qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) +Reads a block of data from the serial port. This function will read at most maxlen bytes from +the serial port and place them in the buffer pointed to by data. Return value is the number of +bytes actually read, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + COMSTAT Win_ComStat; + DWORD Win_BytesRead=0; + DWORD Win_ErrorMask=0; + ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); + if (Win_ComStat.cbInQue && + (!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesRead, NULL) + || Win_BytesRead==0)) { + lastErr=E_READ_FAILED; + retVal=-1; + } + else { + retVal=((int)Win_BytesRead); + } + UNLOCK_MUTEX(); + + return retVal; +} + +/*! +\fn qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) +Writes a block of data to the serial port. This function will write len bytes +from the buffer pointed to by data to the serial port. Return value is the number +of bytes actually written, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + DWORD Win_BytesWritten; + if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesWritten, NULL)) { + lastErr=E_WRITE_FAILED; + retVal=-1; + } + else { + retVal=((int)Win_BytesWritten); + } + UNLOCK_MUTEX(); + + flush(); + return retVal; +} + +/*! +\fn void Win_QextSerialPort::ungetChar(char c) +This function is included to implement the full QIODevice interface, and currently has no +purpose within this class. This function is meaningless on an unbuffered device and currently +only prints a warning message to that effect. +*/ +void Win_QextSerialPort::ungetChar(char c) { + if (c == c) + { + + } + /*meaningless on unbuffered sequential device - return error and print a warning*/ + TTY_WARNING("Win_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); +} + +/*! +\fn void Win_QextSerialPort::setFlowControl(FlowType flow) +Sets the flow control used by the port. Possible values of flow are: +\verbatim + FLOW_OFF No flow control + FLOW_HARDWARE Hardware (RTS/CTS) flow control + FLOW_XONXOFF Software (XON/XOFF) flow control +\endverbatim +*/ +void Win_QextSerialPort::setFlowControl(FlowType flow) { + LOCK_MUTEX(); + if (Settings.FlowControl!=flow) { + Settings.FlowControl=flow; + } + if (isOpen()) { + switch(flow) { + + /*no flow control*/ + case FLOW_OFF: + Win_CommConfig.dcb.fOutxCtsFlow=FALSE; + Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; + Win_CommConfig.dcb.fInX=FALSE; + Win_CommConfig.dcb.fOutX=FALSE; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + break; + + /*software (XON/XOFF) flow control*/ + case FLOW_XONXOFF: + Win_CommConfig.dcb.fOutxCtsFlow=FALSE; + Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; + Win_CommConfig.dcb.fInX=TRUE; + Win_CommConfig.dcb.fOutX=TRUE; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + break; + + case FLOW_HARDWARE: + Win_CommConfig.dcb.fOutxCtsFlow=TRUE; + Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; + Win_CommConfig.dcb.fInX=FALSE; + Win_CommConfig.dcb.fOutX=FALSE; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setParity(ParityType parity) +Sets the parity associated with the serial port. The possible values of parity are: +\verbatim + PAR_SPACE Space Parity + PAR_MARK Mark Parity + PAR_NONE No Parity + PAR_EVEN Even Parity + PAR_ODD Odd Parity +\endverbatim +*/ +void Win_QextSerialPort::setParity(ParityType parity) { + LOCK_MUTEX(); + if (Settings.Parity!=parity) { + Settings.Parity=parity; + } + if (isOpen()) { + Win_CommConfig.dcb.Parity=(unsigned char)parity; + switch (parity) { + + /*space parity*/ + case PAR_SPACE: + if (Settings.DataBits==DATA_8) { + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Space parity with 8 data bits is not supported by POSIX systems."); + } + Win_CommConfig.dcb.fParity=TRUE; + break; + + /*mark parity - WINDOWS ONLY*/ + case PAR_MARK: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Mark parity is not supported by POSIX systems"); + Win_CommConfig.dcb.fParity=TRUE; + break; + + /*no parity*/ + case PAR_NONE: + Win_CommConfig.dcb.fParity=FALSE; + break; + + /*even parity*/ + case PAR_EVEN: + Win_CommConfig.dcb.fParity=TRUE; + break; + + /*odd parity*/ + case PAR_ODD: + Win_CommConfig.dcb.fParity=TRUE; + break; + } + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setDataBits(DataBitsType dataBits) +Sets the number of data bits used by the serial port. Possible values of dataBits are: +\verbatim + DATA_5 5 data bits + DATA_6 6 data bits + DATA_7 7 data bits + DATA_8 8 data bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 5 data bits cannot be used with 2 stop bits. +\par + 1.5 stop bits can only be used with 5 data bits. +\par + 8 data bits cannot be used with space parity on POSIX systems. + +*/ +void Win_QextSerialPort::setDataBits(DataBitsType dataBits) { + LOCK_MUTEX(); + if (Settings.DataBits!=dataBits) { + if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || + (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5)) { + } + else { + Settings.DataBits=dataBits; + } + } + if (isOpen()) { + switch(dataBits) { + + /*5 data bits*/ + case DATA_5: + if (Settings.StopBits==STOP_2) { + TTY_WARNING("Win_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); + } + else { + Win_CommConfig.dcb.ByteSize=5; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + + /*6 data bits*/ + case DATA_6: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.dcb.ByteSize=6; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + + /*7 data bits*/ + case DATA_7: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.dcb.ByteSize=7; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + + /*8 data bits*/ + case DATA_8: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.dcb.ByteSize=8; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setStopBits(StopBitsType stopBits) +Sets the number of stop bits used by the serial port. Possible values of stopBits are: +\verbatim + STOP_1 1 stop bit + STOP_1_5 1.5 stop bits + STOP_2 2 stop bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 2 stop bits cannot be used with 5 data bits. +\par + 1.5 stop bits cannot be used with 6 or more data bits. +\par + POSIX does not support 1.5 stop bits. +*/ +void Win_QextSerialPort::setStopBits(StopBitsType stopBits) { + LOCK_MUTEX(); + if (Settings.StopBits!=stopBits) { + if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || + (stopBits==STOP_1_5 && Settings.DataBits!=DATA_5)) { + } + else { + Settings.StopBits=stopBits; + } + } + if (isOpen()) { + switch (stopBits) { + + /*one stop bit*/ + case STOP_1: + Win_CommConfig.dcb.StopBits=ONESTOPBIT; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + break; + + /*1.5 stop bits*/ + case STOP_1_5: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: 1.5 stop bit operation is not supported by POSIX."); + if (Settings.DataBits!=DATA_5) { + TTY_WARNING("Win_QextSerialPort: 1.5 stop bits can only be used with 5 data bits"); + } + else { + Win_CommConfig.dcb.StopBits=ONE5STOPBITS; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + + /*two stop bits*/ + case STOP_2: + if (Settings.DataBits==DATA_5) { + TTY_WARNING("Win_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); + } + else { + Win_CommConfig.dcb.StopBits=TWOSTOPBITS; + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) +Sets the baud rate of the serial port. Note that not all rates are applicable on +all platforms. The following table shows translations of the various baud rate +constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * +are speeds that are usable on both Windows and POSIX. +\verbatim + + RATE Windows Speed POSIX Speed + ----------- ------------- ----------- + BAUD50 110 50 + BAUD75 110 75 + *BAUD110 110 110 + BAUD134 110 134.5 + BAUD150 110 150 + BAUD200 110 200 + *BAUD300 300 300 + *BAUD600 600 600 + *BAUD1200 1200 1200 + BAUD1800 1200 1800 + *BAUD2400 2400 2400 + *BAUD4800 4800 4800 + *BAUD9600 9600 9600 + BAUD14400 14400 9600 + *BAUD19200 19200 19200 + *BAUD38400 38400 38400 + BAUD56000 56000 38400 + *BAUD57600 57600 57600 + BAUD76800 57600 76800 + *BAUD115200 115200 115200 + BAUD128000 128000 115200 + BAUD256000 256000 115200 +\endverbatim +*/ +void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) { + LOCK_MUTEX(); + if (Settings.BaudRate!=baudRate) { + switch (baudRate) { + case BAUD50: + case BAUD75: + case BAUD134: + case BAUD150: + case BAUD200: + Settings.BaudRate=BAUD110; + break; + + case BAUD1800: + Settings.BaudRate=BAUD1200; + break; + + case BAUD76800: + Settings.BaudRate=BAUD57600; + break; + + default: + Settings.BaudRate=baudRate; + break; + } + } + if (isOpen()) { + switch (baudRate) { + + /*50 baud*/ + case BAUD50: + TTY_WARNING("Win_QextSerialPort: Windows does not support 50 baud operation. Switching to 110 baud."); + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*75 baud*/ + case BAUD75: + TTY_WARNING("Win_QextSerialPort: Windows does not support 75 baud operation. Switching to 110 baud."); + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*110 baud*/ + case BAUD110: + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*134.5 baud*/ + case BAUD134: + TTY_WARNING("Win_QextSerialPort: Windows does not support 134.5 baud operation. Switching to 110 baud."); + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*150 baud*/ + case BAUD150: + TTY_WARNING("Win_QextSerialPort: Windows does not support 150 baud operation. Switching to 110 baud."); + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*200 baud*/ + case BAUD200: + TTY_WARNING("Win_QextSerialPort: Windows does not support 200 baud operation. Switching to 110 baud."); + Win_CommConfig.dcb.BaudRate=CBR_110; + break; + + /*300 baud*/ + case BAUD300: + Win_CommConfig.dcb.BaudRate=CBR_300; + break; + + /*600 baud*/ + case BAUD600: + Win_CommConfig.dcb.BaudRate=CBR_600; + break; + + /*1200 baud*/ + case BAUD1200: + Win_CommConfig.dcb.BaudRate=CBR_1200; + break; + + /*1800 baud*/ + case BAUD1800: + TTY_WARNING("Win_QextSerialPort: Windows does not support 1800 baud operation. Switching to 1200 baud."); + Win_CommConfig.dcb.BaudRate=CBR_1200; + break; + + /*2400 baud*/ + case BAUD2400: + Win_CommConfig.dcb.BaudRate=CBR_2400; + break; + + /*4800 baud*/ + case BAUD4800: + Win_CommConfig.dcb.BaudRate=CBR_4800; + break; + + /*9600 baud*/ + case BAUD9600: + Win_CommConfig.dcb.BaudRate=CBR_9600; + break; + + /*14400 baud*/ + case BAUD14400: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 14400 baud operation."); + Win_CommConfig.dcb.BaudRate=CBR_14400; + break; + + /*19200 baud*/ + case BAUD19200: + Win_CommConfig.dcb.BaudRate=CBR_19200; + break; + + /*38400 baud*/ + case BAUD38400: + Win_CommConfig.dcb.BaudRate=CBR_38400; + break; + + /*56000 baud*/ + case BAUD56000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 56000 baud operation."); + Win_CommConfig.dcb.BaudRate=CBR_56000; + break; + + /*57600 baud*/ + case BAUD57600: + Win_CommConfig.dcb.BaudRate=CBR_57600; + break; + + /*76800 baud*/ + case BAUD76800: + TTY_WARNING("Win_QextSerialPort: Windows does not support 76800 baud operation. Switching to 57600 baud."); + Win_CommConfig.dcb.BaudRate=CBR_57600; + break; + + /*115200 baud*/ + case BAUD115200: + Win_CommConfig.dcb.BaudRate=CBR_115200; + break; + + /*128000 baud*/ + case BAUD128000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 128000 baud operation."); + Win_CommConfig.dcb.BaudRate=CBR_128000; + break; + + /*256000 baud*/ + case BAUD256000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation."); + Win_CommConfig.dcb.BaudRate=CBR_256000; + break; + } + SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setDtr(bool set) +Sets DTR line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Win_QextSerialPort::setDtr(bool set) { + LOCK_MUTEX(); + if (isOpen()) { + if (set) { + EscapeCommFunction(Win_Handle, SETDTR); + } + else { + EscapeCommFunction(Win_Handle, CLRDTR); + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setRts(bool set) +Sets RTS line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Win_QextSerialPort::setRts(bool set) { + LOCK_MUTEX(); + if (isOpen()) { + if (set) { + EscapeCommFunction(Win_Handle, SETRTS); + } + else { + EscapeCommFunction(Win_Handle, CLRRTS); + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn ulong Win_QextSerialPort::lineStatus(void) +returns the line status as stored by the port function. This function will retrieve the states +of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines +can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned +long with specific bits indicating which lines are high. The following constants should be used +to examine the states of individual lines: + +\verbatim +Mask Line +------ ---- +LS_CTS CTS +LS_DSR DSR +LS_DCD DCD +LS_RI RI +\endverbatim + +This function will return 0 if the port associated with the class is not currently open. +*/ +ulong Win_QextSerialPort::lineStatus(void) { + unsigned long Status=0, Temp=0; + LOCK_MUTEX(); + if (isOpen()) { + GetCommModemStatus(Win_Handle, &Temp); + if (Temp&MS_CTS_ON) { + Status|=LS_CTS; + } + if (Temp&MS_DSR_ON) { + Status|=LS_DSR; + } + if (Temp&MS_RING_ON) { + Status|=LS_RI; + } + if (Temp&MS_RLSD_ON) { + Status|=LS_DCD; + } + } + UNLOCK_MUTEX(); + return Status; +} + +/*! +\fn void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec); +Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. +*/ +void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec) { + LOCK_MUTEX(); + Settings.Timeout_Sec=sec; + Settings.Timeout_Millisec=millisec; + if(isOpen()) { + Win_CommTimeouts.ReadIntervalTimeout = sec*1000+millisec; + Win_CommTimeouts.ReadTotalTimeoutMultiplier = sec*1000+millisec; + Win_CommTimeouts.ReadTotalTimeoutConstant = 0; + Win_CommTimeouts.WriteTotalTimeoutMultiplier = sec*1000+millisec; + Win_CommTimeouts.WriteTotalTimeoutConstant = 0; + SetCommTimeouts(Win_Handle, &Win_CommTimeouts); + } + UNLOCK_MUTEX(); +} diff --git a/machine/qextserial/win_qextserialport.h b/machine/qextserial/win_qextserialport.h new file mode 100644 index 0000000..46efe80 --- /dev/null +++ b/machine/qextserial/win_qextserialport.h @@ -0,0 +1,48 @@ +#ifndef _WIN_QEXTSERIALPORT_H_ +#define _WIN_QEXTSERIALPORT_H_ + +#include "qextserialbase.h" + +/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ +#ifdef _TTY_NOWARN_ +#define _TTY_NOWARN_PORT_ +#endif + +#include + +class Win_QextSerialPort:public QextSerialBase { +public: + Win_QextSerialPort(); + Win_QextSerialPort(Win_QextSerialPort const& s); + Win_QextSerialPort(const QString & name); + Win_QextSerialPort(const PortSettings& settings); + Win_QextSerialPort(const QString & name, const PortSettings& settings); + Win_QextSerialPort& operator=(const Win_QextSerialPort& s); + virtual ~Win_QextSerialPort(); + virtual bool open(OpenMode mode=0); + virtual void close(); + virtual void flush(); + virtual qint64 size() const; + virtual void ungetChar(char c); + virtual void setFlowControl(FlowType); + virtual void setParity(ParityType); + virtual void setDataBits(DataBitsType); + virtual void setStopBits(StopBitsType); + virtual void setBaudRate(BaudRateType); + virtual void setDtr(bool set=true); + virtual void setRts(bool set=true); + virtual ulong lineStatus(void); + virtual qint64 bytesAvailable(); + virtual void translateError(ulong); + virtual void setTimeout(ulong, ulong); + +protected: + HANDLE Win_Handle; + COMMCONFIG Win_CommConfig; + COMMTIMEOUTS Win_CommTimeouts; + + virtual qint64 readData(char *data, qint64 maxSize); + virtual qint64 writeData(const char *data, qint64 maxSize); +}; + +#endif diff --git a/machine/tcpclient.cpp b/machine/tcpclient.cpp new file mode 100644 index 0000000..5f20ccd --- /dev/null +++ b/machine/tcpclient.cpp @@ -0,0 +1,501 @@ +#include "tcpclient.h" + +#include +#include +#include + +TcpClient::TcpClient(QObject *parent) : + QObject(parent), + m_pClientSocket(NULL), + m_pConnectCheckTimer(NULL), + m_connected(0), + m_pConnectDetectThread(NULL), + m_pConnectDetect(NULL), + m_detect(0), + m_localip(DEF_LOCAL_IP), + m_localport(DEF_LOCAL_PORT), + m_serverip(DEF_SERVER_IP), + m_serverport(DEF_SERVER_PORT) +{ + m_pClientSocket = new QBindTcpSocket(this); + m_pClientSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + connect(m_pClientSocket, SIGNAL(readyRead()), this, SLOT(receiveServerData())); + connect(m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(displaySocketError(QAbstractSocket::SocketError))); + // connect(m_pClientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(netStateChanged(QAbstractSocket::SocketState))); + + m_pConnectCheckTimer = new QTimer(this); + connect(m_pConnectCheckTimer, SIGNAL(timeout()), this, SLOT(connectCheck())); + + + m_pConnectDetectThread = new QThread(); +} + +TcpClient::~TcpClient() +{ + m_pConnectCheckTimer->stop(); + delete m_pConnectCheckTimer; + + m_pClientSocket->disconnectFromHost(); + m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + delete m_pClientSocket; + + if (m_connected != 0) + { + m_pConnectDetectThread->quit(); + m_pConnectDetectThread->wait(); + } + + delete m_pConnectDetectThread; +} + +void TcpClient::setConfigFileName(QString configfilename) +{ + m_configFileName = configfilename; +} + +void TcpClient::connectToServer() +{ + if (m_pClientSocket == NULL) + { + qDebug() << "m_pClientSocket not alloc"; + return; + } + + if (m_connected == 0) + { + loadIpAndPort(); + if (m_pConnectDetect == NULL) + { + m_pConnectDetect = new TcpConnectDetect; + } + qDebug() << "ConnectToServer"; + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + + m_pConnectDetect->setIpAndPort(m_localip, m_localport, m_serverip, m_serverport); + + m_pConnectDetect->moveToThread(m_pConnectDetectThread); + + connect(this, SIGNAL(siDetectHost()), m_pConnectDetect, SLOT(connectDetect()), Qt::QueuedConnection); + connect(m_pConnectDetect, SIGNAL(siConnectSta(int)), this, SLOT(detectStatus(int)), Qt::QueuedConnection); + + // 20191226由于检测线程会造成网络重连,所以将检测线程注释 lft +/* + connect(m_pConnectDetectThread, SIGNAL(started()), m_pConnectDetect, SLOT(detectStart()) ); + connect(m_pConnectDetectThread, SIGNAL(finished()), m_pConnectDetect, SLOT(deleteLater()) ); // 退出删除对象 + + m_pConnectDetectThread->start(); // 启动线程 +*/ + m_pConnectCheckTimer->start(1000); + m_connected = 1; + m_detect = 1; + } +} + +void TcpClient::disConnectFromServer() +{ + if (m_connected != 0) + { + m_pConnectCheckTimer->stop(); + + if (m_pClientSocket != NULL) + { + m_pClientSocket->disconnectFromHost(); + m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + } + + m_pConnectDetectThread->quit(); + m_pConnectDetectThread->wait(); + + m_connected = 0; + m_detect = 0; + } +} + +void TcpClient::loadIpAndPort() +{ + if (!m_configFileName.isEmpty()) + { + // 机器的IP和端口 和 连接机器的本地IP和端口 + QSettings configIni(m_configFileName, QSettings::IniFormat); + QString serverip, localip; + quint16 serverport, localport; + + serverip = configIni.value("server/ip", QVariant("192.168.16.253")).toString(); + serverport = configIni.value("server/port", QVariant(5000)).toInt(); + localip = configIni.value("local/ip", QVariant("192.168.16.41")).toString(); + localport = configIni.value("local/port", 5001).toInt(); + + // 回写参数 + configIni.setValue("server/ip", serverip); + configIni.setValue("server/port", serverport); + configIni.setValue("local/ip", localip); + configIni.setValue("local/port", localport); + + m_localip = localip; + m_localport = localport; + m_serverip = serverip; + m_serverport = serverport; + } +} + +// 发送数据的槽 +void TcpClient::slotSendData(QByteArray dat) +{ + if (m_pClientSocket != NULL) + { + m_pClientSocket->write(dat); + } +} + +// 自动检测连接 +void TcpClient::connectCheck() +{ + if (m_pClientSocket == NULL) + { + qDebug() << "Socket is not alloced"; + return; + } + +// qDebug() << "check client connect"; + if (m_connected == 1) + { + if (m_localip.isEmpty() == false) + { + m_pClientSocket->bindAddrAndPort(m_localip, m_localport); + } + m_pClientSocket->abort(); + m_pClientSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + m_pClientSocket->connectToHost(m_serverip, m_serverport); + int rslt = m_pClientSocket->waitForConnected(2000); + if (rslt == 0) + { + + } + /* + qDebug("bind connect and waitForConnected 2000, rslt=%d", rslt); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + */ + m_connected = 2; + } + else if (m_connected != 0) + { + switch(m_pClientSocket->state()) + { + case QAbstractSocket::ConnectedState: + { + if (m_connected != 3) + { + /* + qDebug() << "net State is Connected"; + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + */ + m_connected = 3; // 检测连接状态 + } + + break; + } + case QAbstractSocket::ConnectingState: + { + if (m_connected != 2) + { + qDebug() << "net State is Connecting"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + } + m_connected = 2; + break; + } + case QAbstractSocket::UnconnectedState: + { + if (m_connected != 1) + { + // qDebug() << "net State is unconnected"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + } + m_connected = 1; + break; + } + default: + { + /* + QAbstractSocket::HostLookupState + QAbstractSocket::BoundState + QAbstractSocket::ListeningState + QAbstractSocket::ClosingState + */ + { + qDebug("net State is %d\r\n", m_pClientSocket->state()); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + } + m_connected = 1; + } + } + } + else + { + + } + + if (m_connected == 3) // 已连接 + { + if (m_detect == 1) + { + // qDebug() << "Machine " << QThread::currentThread(); + m_detect = 0; + emit(siDetectHost()); + // qDebug() << "after send SiDetectHost "; + } + } + + emit (siConnectSta(m_connected)); // 网络连接信号 +} + +void TcpClient::detectStatus(int sta) +{ + // qDebug("host detect sta=%d", sta); + + m_detect = 1; + if (sta == 1) // 网络已断开 + { + qDebug("disconnect ClientSocket by detect"); + m_pClientSocket->disconnectFromHost(); +// m_pClientSocket->waitForDisconnected(); + m_pClientSocket->close(); + m_connected = 1; + } + else if (sta == 2) // 网络连接还在 + { + + } + else + { + + } +} + +void TcpClient::receiveServerData() +{ + if (m_pClientSocket != NULL) + { + QByteArray tmpDat; + tmpDat = m_pClientSocket->readAll(); // 读取 +// qDebug("ReceiveServerData, size = %d", tmpDat.size()); +// PrintAsHex(&tmpDat); + + emit(siReceiveData(tmpDat)); // 发送收到数据信号 + } +} + +void TcpClient::displaySocketError(QAbstractSocket::SocketError err) +{ + QString errinfo; + + errinfo.sprintf("Err: code=%d, errorString=", err); + errinfo += m_pClientSocket->errorString(); + +// qDebug() << errinfo; + + emit(siConnectErr(errinfo)); // 网络错误信息 +} + +void TcpClient::netStateChanged(QAbstractSocket::SocketState sta) +{ + switch (sta) + { + /* + case UnconnectedState: + case HostLookupState: + case ConnectingState: + case ConnectedState: + case BoundState: + case ListeningState: + case ClosingStat: + */ + default: + break; + } + +} +void TcpClient::hostFound() +{ + qDebug("found host"); + + +} + + +#if(0) +//------------------------------------------------------- +TcpConnectDetect::TcpConnectDetect(QObject *parent) : + QObject(parent), + m_pDetectSocket(NULL), + m_localip(DEF_LOCAL_IP), + m_localport(DEF_LOCAL_PORT), + m_serverip(DEF_SERVER_IP), + m_serverport(DEF_SERVER_PORT) +{ +} + +TcpConnectDetect::~TcpConnectDetect() +{ + if (m_pDetectSocket == NULL) + { + m_pDetectSocket->disconnectFromHost(); + m_pDetectSocket->waitForDisconnected(); + m_pDetectSocket->close(); + delete m_pDetectSocket; + } +} + +void TcpConnectDetect::detectStart() +{ + qDebug("TcpConnectDetect start"); + if (m_pDetectSocket == NULL) + { + m_pDetectSocket = new QBindTcpSocket; + } +} + +int TcpConnectDetect::connectDetect() +{ + int connectsta = 0; + int rslt; + + // qDebug() << "TcpConnectDetect " << QThread::currentThread(); + + if (m_pDetectSocket == NULL) + { + return 0; + } + if (m_localip.isEmpty() == false) + { + m_pDetectSocket->bindAddrAndPort(m_localip, m_localport); + } + m_pDetectSocket->abort(); + m_pDetectSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + m_pDetectSocket->connectToHost(m_serverip, m_serverport); + + do + { + rslt = m_pDetectSocket->waitForConnected(4000); // 等待连接 + + qDebug("bind Detect connect rslt=%d", rslt); + qDebug() << "localip=" << m_localip << "localport=" << m_localport; + qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport; + + switch(m_pDetectSocket->state()) + { + case QAbstractSocket::ConnectedState: + { + // 如果连接上,说明 m_pClientSocket 连接已经无效, 需要断开重新连接 + // 先断开测试连接 + m_pDetectSocket->disconnectFromHost(); + m_pDetectSocket->waitForDisconnected(); + connectsta = 1; + // 发送断开主连接的信号 + qDebug() << "detect is Connected, disconnect all"; + + break; + } + case QAbstractSocket::UnconnectedState: + { + // qDebug() << "detect is Unconnected err=" << m_pDetectSocket->error() << ", info:" << m_pDetectSocket->errorString(); + + switch (m_pDetectSocket->error()) + { + case QAbstractSocket::SocketTimeoutError: // 连接超时,说明已经断开 + case QAbstractSocket::NetworkError: // 网络错误, 主机不可连接, 可能已经断开 + { + qDebug() << "detect is timout, disconnect all"; + connectsta = 1; + // 发送断开主连接的信号 + break; + } + case QAbstractSocket::ConnectionRefusedError: // 拒绝连接, 说明连接还在 + { + connectsta = 2; + // qDebug() << "Connection Refused, old connect is alive"; + break; + } + /* + case QAbstractSocket::RemoteHostClosedError: + case QAbstractSocket::HostNotFoundError: + case QAbstractSocket::SocketAccessError: + case QAbstractSocket::SocketResourceError: + case QAbstractSocket::SocketTimeoutError: + case QAbstractSocket::DatagramTooLargeError: + case QAbstractSocket::AddressInUseError: + case QAbstractSocket::SocketAddressNotAvailableError: + case QAbstractSocket::UnsupportedSocketOperationError: + case QAbstractSocket::UnfinishedSocketOperationError: + case QAbstractSocket::ProxyAuthenticationRequiredError: + case QAbstractSocket::SslHandshakeFailedError: + case QAbstractSocket::ProxyConnectionRefusedError: + case QAbstractSocket::ProxyConnectionClosedError: + case QAbstractSocket::ProxyConnectionTimeoutError: + case QAbstractSocket::ProxyNotFoundError: + case QAbstractSocket::ProxyProtocolError: + case QAbstractSocket::UnknownSocketError: + */ + default: + { + // 继续检测 + connectsta = 2; + qDebug() << " retry"; + break; + } + } // 错误处理结束 + } + case QAbstractSocket::ConnectingState: + { + // qDebug() << "detect is Connecting"; + // qDebug() << "localip=" << m_localip << "localport=" << m_localport; + // 继续等待 + break; + } + case QAbstractSocket::HostLookupState: + case QAbstractSocket::BoundState: + case QAbstractSocket::ListeningState: + case QAbstractSocket::ClosingState: + default: + { + // 继续等待 + qDebug("detect sta is %d\r\n", m_pDetectSocket->state()); + break; + } + } + + if (connectsta != 0) + { + break; + } + + }while(1); + + + m_pDetectSocket->close(); + + // 发送本次测试连接的状态信号 + emit(siConnectSta(connectsta)); + return connectsta; +} + +void TcpConnectDetect::setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport) +{ + m_localip = localip; + m_localport = localport; + m_serverip = serverip; + m_serverport = serverport; +} +#endif + + + + + + diff --git a/machine/tcpclient.h b/machine/tcpclient.h new file mode 100644 index 0000000..1547255 --- /dev/null +++ b/machine/tcpclient.h @@ -0,0 +1,102 @@ +#ifndef TCPCLIENT_H +#define TCPCLIENT_H + +#include +#include +#include +#include +#include +#include +#include + +#include "qbindtcpsocket.h" + +class ConnectDetectThread; + + +class TcpClient : public QObject +{ + Q_OBJECT +public: + explicit TcpClient(QObject *parent = NULL); + virtual ~TcpClient(); + +public: + void setConfigFileName(QString configfilename); +signals: + void siConnectSta(int sta); // 网络连接信号 + void siConnectErr(QString errinfo); // 网络错误信息 + void siReceiveData(QByteArray dat); // 收到数据包信号 +signals: + void siDetectHost(void); +public: + + +public slots: + void slotSendData(QByteArray dat); // 发送数据的槽 + void connectToServer();//连接到服务器 + void disConnectFromServer(); + void detectStatus(int); +public: + +private slots: + void connectCheck(); + void receiveServerData(); + void displaySocketError(QAbstractSocket::SocketError err); + void netStateChanged(QAbstractSocket::SocketState sta); + void hostFound(); + +private: + void loadIpAndPort(); +private: + QBindTcpSocket * m_pClientSocket;//客户端 + + QTimer * m_pConnectCheckTimer; + +public: + int m_connected; // 连接状态; 0, 初始化; 1, 未连接; 2, 连接中; 3, 已连接 + +private: + QThread * m_pConnectDetectThread; + TcpConnectDetect * m_pConnectDetect; + int m_detect; // 连接测试状态 +private: + QString m_configFileName; +private: + QString m_localip; + quint16 m_localport; + QString m_serverip; + quint16 m_serverport; +}; + +#if(0) +class TcpConnectDetect : public QObject +{ + Q_OBJECT +public: + explicit TcpConnectDetect(QObject *parent = NULL); + virtual ~TcpConnectDetect(); + +signals: + void siConnectSta(int sta); // 网络连接信号 +public: + +public slots: + void detectStart(); + int connectDetect(); + +private: + QBindTcpSocket * m_pDetectSocket; + +public: + void setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport); + +private: + QString m_localip; + quint16 m_localport; + QString m_serverip; + quint16 m_serverport; +}; +#endif + +#endif // TCPCLIENT_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..18b67a8 --- /dev/null +++ b/main.cpp @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _IN_MAIN_CPP + +#include "main.h" +#include "mctype/patternsingleboard/mainUI/mainwidget.h" + +QString switchLanguage(int language,QDir appPath) +{ + QString sourcePath,targetPath; + targetPath = appPath.path() + appPath.separator() + "language.qm"; + switch (language) + { + case chinese://中文 + sourcePath = appPath.path() + appPath.separator() + "chinese.qm"; + break; + case english://英文 + sourcePath = appPath.path() + appPath.separator() + "english.qm"; + break; + case ukrainian://乌克兰文 + sourcePath = appPath.path() + appPath.separator() + "ukrainian.qm"; + break; + case french://法文 + sourcePath = appPath.path() + appPath.separator() + "france.qm"; + break; + case russian://俄语 + sourcePath = appPath.path() + appPath.separator() + "russian.qm"; + break; + case german://德文 + sourcePath = appPath.path() + appPath.separator() + "german.qm"; + break; + default://中文 + sourcePath = appPath.path() + appPath.separator() + "chinese.qm"; + break; + } + + QFile::remove(targetPath); + QFile::copy(sourcePath,targetPath); +#ifdef Q_OS_LINUX + system("sync"); +#endif + return targetPath; +} + +void setMcMainWindow(QApplication &app, QSplashScreen *splash, s16 HMIDecrypt, s16 connectMode) +{ + //创建主窗口 + MainWidget mainwindow; + //初始化主窗口 + mainwindow.initMcTypeWindows(); + mainwindow.initAllWindows(HMIDecrypt,connectMode); + + mainwindow.show();//显示窗口 + //mainwindow.setWindowIcon(QIcon(":/images/1024x600/rp.png")); + splash->finish(NULL); + app.exec();//开始执行应用程序 +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv);//此处必须用QApplication,否则QSplashScreen不能使用 + QSharedMemory shared_memory; + shared_memory.setKey(QString("main_window"));//设置固定共享内存段的key值 + if(shared_memory.attach()) //尝试将进程附加到该共享内存段,避免windows下重开程序 + { + return 0; + } + + //支持中文编码 + QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); + + //文件路径 + QDir apppath(qApp->applicationDirPath()); + qDebug()<<"apppath:"<loadSetting(configfile); + QFile iniFile(configfile); + int language = 0; + s16 connectMode = 0; + s16 gatewayConnectMode = 0; + + if(!iniFile.exists())//配置文件不存在 + { + QMap settings; + + settings["Pattern/name"] = ""; + settings["HMI/resolution"] = resolution1006; + settings["HMI/theme"] = theme1; + settings["HMI/language"] = chinese; + settings["HMI/FrontSize"] = FONTSIZE; + settings["HMI/machineType"] = MACHINE_HIGHSPEEDSINGLEQUI; + settings["HMI/productType"] = PRODUCT_NULL; + settings["HMI/debugMode"] = nodebugMode;//界面调试模式 + settings["HMI/waterMark"] = 1;//0:主背景图不带水印 1:主背景图带水印 + settings["HMI/paraSort"] = 0;//0:参数不分类显示 1:参数分类显示 + + settings["HMI/connectMode"] = 0;//连接方式(通讯方式,网口或串口) + settings["HMI/passwordOne"] = g_passwordOne; + settings["IOT/gatewayConnectMode"] = 0;//网关连接方式(连接方式,网口或串口) + settings["IOT/rackNumber"] = 0;//机架号 + settings["DateTime/second"] = 0; + settings["HeadBreakLineNum"] = 0;//写入机头断线次数 + settings["HMI/splitStep"] = 1;//是否分割针步 + settings["MaxSpeedOfMainSewWork"] = 0;//主轴缝纫工作最高转速 + + g_pSettings->writeToIniFile(settings); + + g_emResolut = resolution1006; + g_emTheme = theme1; + language = chinese; + g_emDebugMode = nodebugMode; + g_emMacType = MACHINE_HIGHSPEEDSINGLEQUI; + g_emProductType = PRODUCT_NULL; + g_passwordOne = PASSWORD_ONE; + g_fontsize = FONTSIZE; + } + else + { + int frontSize = g_pSettings->readFromIniFile("HMI/FrontSize").toInt(); + if((8 > frontSize) || (frontSize > 18)) + { + g_pSettings->writeOneToIniFile("HMI/FrontSize",FONTSIZE); + g_fontsize = FONTSIZE; + } + g_fontsize = g_pSettings->readFromIniFile("HMI/FrontSize").toInt(); + + g_emResolut = (Resolution)(g_pSettings->readFromIniFile("HMI/resolution").toInt()); + + g_emTheme = (Theme)(g_pSettings->readFromIniFile("HMI/theme").toInt()); + //这个情况是,存在配置文件的时候,很可能是只有DateTime/second,读不到主题,就是0(图片加载不出来),二级密码也会没有 + + //为了防止配置文件里没有debugMode时升级黑屏,因为界面调试模式是后来新加的,之前版本的配置文件里没有,兼容之前的版本 -rq + QString debugModeStr = "HMI/debugMode"; + if(g_pSettings->ifKeyExists(debugModeStr) == true) + { + g_emDebugMode =(DebugMode)(g_pSettings->readFromIniFile("HMI/debugMode").toInt());//如果存在配置文件,并且有这个key就读配置文件里的调试模式的值 + } + else + { + g_pSettings->writeOneToIniFile("HMI/debugMode",nodebugMode);//界面调试模式 + g_emDebugMode = nodebugMode; + } + language = g_pSettings->readFromIniFile("HMI/language").toInt(); + g_emDebugMode =(DebugMode)(g_pSettings->readFromIniFile("HMI/debugMode").toInt());//如果存在配置文件,就读配置文件里的调试模式的值 + g_emMacType = (MachineType)(g_pSettings->readFromIniFile("HMI/machineType").toInt()); + g_emProductType = (ProductType)(g_pSettings->readFromIniFile("HMI/productType").toInt()); + connectMode = g_pSettings->readFromIniFile("HMI/connectMode").toInt(); + g_passwordOne = g_pSettings->readFromIniFile("HMI/passwordOne").toString(); + if(g_passwordOne.isEmpty()) + g_passwordOne = PASSWORD_ONE; + gatewayConnectMode = g_pSettings->readFromIniFile("IOT/gatewayConnectMode").toInt(); + + g_xCorrectionFactor = 1.0; + g_yCorrectionFactor = 1.0; + } + + //自动获取屏幕分辨率 +#ifdef Q_OS_LINUX + QDesktopWidget * desktop = QApplication::desktop(); + QRect screenRect = desktop->screenGeometry(); + int width = screenRect.width(); + int height = screenRect.height(); + if(width == 1920 && height == 1080) + { + g_emResolut = resolution1910; + } + else if(width == 1024 && height == 600) + { + g_emResolut = resolution1006; + } + else if(width == 800 && height == 480) + { + g_emResolut = resolution0804; + } +#endif + + //多语言翻译 + QString languageFile = switchLanguage(language,apppath); + qDebug()<<"languageFile:"<setPixmap(QPixmap(":/images/startlogo1006.png")); + } + else if(g_emResolut == resolution0804) + { + splash->setPixmap(QPixmap(":/images/startlogo0804.png")); + } + else if(g_emResolut == resolution1910) + { + splash->setPixmap(QPixmap(":/images/startlogo1910.png")); + } + + QFont font; + font.setPixelSize(20); + splash->setFont(font); + //splash->move(0,0); + splash->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + int waterMark = g_pSettings->readFromIniFile("HMI/waterMark").toInt();//是否带水印 + if(waterMark==1)//带logo + { + splash->show();//显示启动画面 + } + + //检测界面解密的配置文件是否存在 + //界面解密配置文件路径 + s16 HMIDecrypt = 1;//1代表已授权解密过,0代表未授权解密过 + QString HMIDecryptConfigfile; + HMIDecryptConfigfile = apppath.path() + apppath.separator() + "HMIDecryptConfig.ini"; + QFile HMIDecryptIniFile(HMIDecryptConfigfile); + if(!HMIDecryptIniFile.exists())//不存在界面解密的文件(已发机器),可与主板建立连接 + { + HMIDecrypt = 1; + } + else//存在界面解密的文件,判断是否解密过来决定是否与主板建立连接 + { + QSettings iniSetting(HMIDecryptConfigfile, QSettings::IniFormat); + HMIDecrypt = iniSetting.value("HMIDecrypt/ifdecrypt").toInt(); + } + + g_pMachine = NULL; + QString mcConfigfile; + mcConfigfile = apppath.path() + apppath.separator() + "mcconfig.ini"; + + g_pMachine = new Machine(); //创建下位机通讯 + g_pMachine->initConnectMode(connectMode);//初始化通讯连接方式 + g_pMachine->setComportName(""); //名字为空 + g_pMachine->setConfigFileName(mcConfigfile);//配置文件 + if(HMIDecrypt != 0) + { + g_pMachine->startCommunication();//启动线程 + } + + //物联网客户端与mqtt网关服务器建立连接 + g_pLotMachine = NULL; + QString lotConfigfile; + lotConfigfile = apppath.path() + apppath.separator() + "lotconfig.ini"; + g_pLotMachine = new LotMachine(); //创建网关通讯 + g_pLotMachine->initConnectMode(gatewayConnectMode);//初始化通讯连接方式 + g_pLotMachine->setComportName(""); + g_pLotMachine->setConfigFileName(lotConfigfile); + g_pLotMachine->startCommunication(); + + g_pCurEmbData = new EmbData(); + +#ifdef Q_OS_WIN + //win下防止多个程序打开 + if(shared_memory.create(1)) //创建1byte的共享内存段 + { + setMcMainWindow(app,splash,HMIDecrypt,connectMode); + } +#endif + +#ifdef Q_OS_LINUX + setMcMainWindow(app,splash,HMIDecrypt,connectMode); +#endif + + delete splash; + delete g_pSettings; + delete g_pMachine; + delete g_pCurEmbData; + return 0; +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..bf73ce1 --- /dev/null +++ b/main.h @@ -0,0 +1,175 @@ +#ifndef MAIN_H +#define MAIN_H + +#include +#include +#include "settings/settings.h" +#include "machine/machine.h" +#include "machine/lotmachine.h" +#include "datafile/embdata.h" + +#define NAMEMAXLENGTH 8 // 字体最大长度 +#define LINUXUSBPATH "/media/usb0/" +#define PATTERNPATH "datafiles" +#define IMAGE_TYPE (QImage::Format_ARGB32) +#define PEN_WIDTH 1 + +#define LINUX_APPNAME "OPRT_CP" +#define WIN_APPNAME "oprt_up.exe" +#define APPNAME "QUILTING" +#define PASSWORD_ONE "290810" //一级密码 +#define PASSWORD_TWO "262574" //二级密码 +#define PASSWORD_RESETPARA "123456" //重置参数密码 +#define FONTSIZE 10 //默认字体大小 + +#define FONTTYPE "Microsoft YaHei" + +#define FONTBOLD QFont::Bold //加粗 +#define FONTNORMAL QFont::Normal //正常 + +#define HMI_UPDATA 1 // 界面升级 +#define MC_UPDATA 2 // 主控升级 +#define PARA_IMPORT 3 // 参数导入 +#define PARA_EXPORT 4 // 参数导出 +#define PRODUCTSTATIS 5 // 生产统计 +#define JOURNAL 6 // 日志文件 +#define BACKUPS_UPDATA 7 // 界面还原 + +#define UNITDEC 0 + +/* + 11.01.01.251027 夹面线 伸出-收回、打开-关闭(控制动作) 夹面线装置 参数 + 11.01.02.251028 四头机 快捷功能机头12上升下降 + 11.01.04.251103 飞梭机,完善拐角补偿功能 + 11.01.05.251104 飞梭机,完善拐角补偿功能,针步分割功能和dst缩放功能 + 11.01.06.251113 双头机,增加缝纫转非缝纫时添加剪线码功能 + 11.01.07.251225 产量显示,多针机、飞梭机单独处理 + 11.01.08.260105 McInfo软件版本修改 +*/ +#define VERSIONNO "11.01.07." //版本号 + +struct drawItem +{ + int type; + QList points; +}; + +enum ConnectState +{ + NoConnect = 1, //未连接 + Connectting = 2, //连接中 + Connected = 3 //已连接 +}; + +//用户权限 +enum UserRoles +{ + operate = 0, + repair = 1, + root = 2, + resetpara = 3 +}; + +//分辨率 +enum Resolution +{ + resolution1910 = 0, // 1920x1080(15寸) + resolution1006 = 1, // 1024x600 (10寸) + resolution0804 = 2 // 800x480 (7寸) +}; + +//主题 +enum Theme +{ + theme1 = 1, // 主题1 + theme2 = 2, // 主题2 + theme3 = 3 // 主题3 +}; + +//语言 +enum Language +{ + chinese = 0, // 中文 + english, // 英文 + ukrainian, // 乌克兰文 + french, // 法文 + russian, // 俄语 + german //德文 + +}; + +enum DebugMode +{ + debugMode = 0, // 是调试模式 + nodebugMode = 1 // 不是调试模式 +}; + +//机器类型 +enum MachineType +{ + MACHINE_HIGHSPEEDSINGLEQUI = 0, //高速单针绗缝机 + MACHINE_FIVEHEADPRECISIONSEWING, //五头精密缝 + MACHINE_CLOTHINGMAC, //服装机 + MACHINE_MULTINEEDLEROTARY, //多针旋梭 + MACHINE_THICK_WIRING = 5, //粗线布线机 + MACHINE_FLYSHUTTLE = 8, //飞梭机 + MACHINE_GLASSFIBRE = 10, //玻璃纤维 + MACHINE_DOUBLE_LAYERED, //双层绗缝 + MACHINE_DLQSCHE_BOARD, //双层绗缝调度主板 + MACHINE_SINGLE_MUTIL_NEEDLE, //单层多针旋梭 + MACHINE_DOUBLE_BEDSHEETS, //床单机双边缝 + MACHINE_L2000_MULTI, //L2000多针机,多头旋梭机 + MACHINE_FULLYAUTOMATIC, //全自动绗缝机 + MACHINE_PkgFourTestBoard, //包四边机测试板 + MACHINE_AutoDoubleDoor, //全自动双龙门单机头 + MACHINE_DOUBLEHEADQUI, //双头组合绗缝机 + MACHINE_CUTTINGWALK, //边走边裁 + MACHINE_FOURHEADQUI //四头绗缝机 +}; + +//产品类型 +enum ProductType +{ + PRODUCT_NULL //无产品类型 +}; + +#ifdef _IN_MAIN_CPP + +LotMachine * g_pLotMachine;//物联网Machine,作为客户端发送数据给mqtt网关 +Machine * g_pMachine; +EmbData * g_pCurEmbData = NULL; +UserRoles g_emUser = operate; +QString g_passwordOne = PASSWORD_ONE; +Settings * g_pSettings = NULL; +Resolution g_emResolut = resolution1910; +Theme g_emTheme = theme1; +int g_fontsize;//字体大小 +MachineType g_emMacType = MACHINE_HIGHSPEEDSINGLEQUI; +ProductType g_emProductType = PRODUCT_NULL; +DebugMode g_emDebugMode = nodebugMode; +QPoint g_mainWidgetPos; + +double g_xCorrectionFactor;//X修正系数 +double g_yCorrectionFactor;//Y修正系数 +#else + +extern Machine * g_pMachine; +extern LotMachine * g_pLotMachine;//物联网Machine,作为客户端发送数据给mqtt网关 +extern EmbData * g_pCurEmbData;//绣花数据(库) +extern UserRoles g_emUser; +extern QString g_passwordOne;//一级密码 +extern Settings * g_pSettings; +extern Resolution g_emResolut; +extern Theme g_emTheme; +extern int g_fontsize;//字体大小 +extern MachineType g_emMacType; +extern ProductType g_emProductType; +extern DebugMode g_emDebugMode; +extern QPoint g_mainWidgetPos; + +extern double g_xCorrectionFactor; +extern double g_yCorrectionFactor; +#endif + + +#endif // MAIN_H diff --git a/mctype/machinetypefun.cpp b/mctype/machinetypefun.cpp new file mode 100644 index 0000000..d1bc4fa --- /dev/null +++ b/mctype/machinetypefun.cpp @@ -0,0 +1,684 @@ +#include "machinetypefun.h" + +//(打开,关闭) +OutCtrlItem MachineTypeFun::creatOpenCloseItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1); +} + +//(归零,正转,反转) +OutCtrlItem MachineTypeFun::creatZeroForRevItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP); +} + +OutCtrlItem MachineTypeFun::creatPNJoyItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP); +} + +//(上升,下降) +OutCtrlItem MachineTypeFun::creatAscDscItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1); +} + +//伸出 收回 +OutCtrlItem MachineTypeFun::creatStrRecItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_UP,-1,-1, + strRecover,true,OUTCONTROL_DOWN,-1,-1); +} + +//执行 +OutCtrlItem MachineTypeFun::createExecuteItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,MANUALACTION_RUN,-1,-1); +} + +QString createStrList(QStringList list) +{ + QString strValue; + for(int i = 0; i < list.size(); i++) + { + strValue += list.at(i) + ":" + QString::number(i) + ";"; + } + return strValue; +} + +OutCtrlItem MachineTypeFun::creatEnableItem(int macType, int showPriority, QString name, int def, QString btnName) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + btnName,true,OUTCONTROL_ENABLE,-1,-1); +} + +//归零命令 显示转动 +OutCtrlItem MachineTypeFun::creatZeroItem(int macType, int showPriority, QString name, int def) +{ + return makeAOutCtrlItem(macType,showPriority,name,def, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strTurn,true,OUTCONTROL_ZERO,-1,-1); +} + +MachineTypeFun::MachineTypeFun(QObject *parent) : QObject(parent) +{ + m_allParasList.clear(); + m_allOutCtrlList.clear(); + m_allShortCutList.clear(); + m_allAssistList.clear(); + m_allPatternSetList.clear(); + m_allParaSetList.clear(); + m_allSensorList.clear(); + m_allErrorCodeAndStateList.clear(); + + strManualAuto = createStrList + ({QObject::tr("manual"),//手动0 + QObject::tr("auto")//自动1 + }); + + strClosedOpen = createStrList + ({QObject::tr("Normally closed"),//常关 + QObject::tr("Normally open")//常开 + }); + + strAllow = createStrList + ({QObject::tr("Not allow"),//不允许0 + QObject::tr("Allowed")//允许1 + }); + + strCurrentLocation = createStrList + ({QObject::tr("Current location"),//当前位置0 + QObject::tr("Starting point"),//起始点 + QObject::tr("Offset point"),//偏移点2 + QObject::tr("Origin Point")}//原点3 + ); + // 完成停留位置 + strComLocation = createStrList + ({QObject::tr("End"), //0, 结束点 + QObject::tr("Begin"), //1, 起点 + QObject::tr("Anchor"),//2, 定位点 + QObject::tr("Offset"),//3, 偏移点 + QObject::tr("Feeding") //4, 上料点 + }); + strParkingposition = createStrList + ({QObject::tr("Current location"), //0, 当前位置 + QObject::tr("Starting point"), //1, 起点 + QObject::tr("Anchor"),//2, 定位点 + QObject::tr("Feeding"),//3, 上料 + QObject::tr("Offset") //4, 偏移点 + }); + + strFixedFrame = createStrList + ({QObject::tr("Fixed frame"),//0, 不动框 + QObject::tr("Left"), //1, 向左; + QObject::tr("Forward"),//2, 向前 + QObject::tr("Right"),//3, 向右 + QObject::tr("Backward")//4, 向后 + }); + + strSlowDownMode = createStrList + ({QObject::tr("Auto Deceleration"),//0, 自动降速 + QObject::tr("Parameter Deceleration"), //1,参数降速; + QObject::tr("No Deceleration")//2,不降速 + }); + + //无效:0;X有效:1;Y有效:2;XY同时有效:3 + strInvalid = createStrList + ({QObject::tr("Invalid"), //0, 无效 + "X " + QObject::tr("Valid"), //1, X有效 + "Y " + QObject::tr("Valid"), //2, Y有效 + "XY " + QObject::tr("Valid")//3, XY同时有效 + }); + //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder = createStrList + ({QObject::tr("Not"), //0, 未启用 + QObject::tr("Delay reminder by length"), //1, 按长度划分的延迟提醒 + QObject::tr("Count by number of slices"), //2, 按切片数计数 + QObject::tr("Immediately reminder by length")//3, 按长度立即提醒 + }); + //未启用:0;按长度提醒:1; + strImmediatelyReminder2 = createStrList + ({QObject::tr("Not"), //0, 未启用 + QObject::tr("Reminder by length") //1, 按长度提醒 + }); + //不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling = createStrList + ({QObject::tr("No"), //0, 不加油 + QObject::tr("According to working hours"), //1, 按工作时间间断加油 + QObject::tr("According to the number of working stitches"), //2, 按工作针数间歇加油 + QObject::tr("Persistent refueling")//3, 持续加油 + }); + + //无:0;圆刀:1;震刀:2; + strRoundShockknife = createStrList + ({QObject::tr("Null"), //0, 无 + QObject::tr("Round knife"), //1, 圆刀 + QObject::tr("Shock knife"), //2, 震刀 + }); + //连续:0;间歇式:1 + strContinuous = createStrList + ({QObject::tr("Continuous moving frame"), //0, 连续动框 + QObject::tr("Intermittent"), //1, 间歇式 + }); + + //无加速或减速:0;Xy正弦加速度和减速度:1 + strAcceleration = createStrList + ({QObject::tr("No acceleration or deceleration"), //0, 无加速或减速 + QObject::tr("Xy sine acceleration and deceleration"), //1, Xy正弦加速度和减速度 + }); + + //不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + strTrimList = createStrList + ({QObject::tr("Do not trim"), //0, 不剪线 + QObject::tr("Automatic thread cutting"), //1, 自动剪线 + QObject::tr("Finally cut the thread"), //2, 最后剪线 + QObject::tr("Data cutting"), //3, 数据剪线 + }); + + strSewSource = createStrList + ({QObject::tr("Paras"), //0, 参数 + QObject::tr("Encoder"), //1, 编码器 + }); + + strEnable = QObject::tr("Enable"); //使能 + strDisable = QObject::tr("Disable"); //失能 + strJogP = QObject::tr("JogP"); //正转 + strJogN = QObject::tr("JogN"); //反转 + strTurn = QObject::tr("Turn"); //转动 + strZero = QObject::tr("Zero"); //归零 + strOpen = QObject::tr("Open"); //打开 + strClose = QObject::tr("Close");//关闭 + strAscend = QObject::tr("Ascending");//上升 + strDescend = QObject::tr("Descending");//下降 + strRelease = QObject::tr("Release");//放松 + strTighten = QObject::tr("Tighten");//收紧 + strTrim = QObject::tr("Trim"); //剪线 + strPull = QObject::tr("Pull"); //拉料 + strBack = QObject::tr("Back"); //退料 + strStretch = QObject::tr("Stretch"); //伸出 + strRecover = QObject::tr("Recover"); //收回 + strStop = QObject::tr("Stop"); //停止 + strStart = QObject::tr("Start"); //启动 + strSwing = QObject::tr("Swinging position"); //摆动位 + strRun = QObject::tr("Run"); //执行 + + strStartButton = QObject::tr("Start button"); //启动按钮 + strPauseButton = QObject::tr("Pause button"); //暂停按钮 + strPressDetection = QObject::tr("Air pressure detection"); //气压检测 + strZeroPosition = QObject::tr("zero position"); //零位 + strDeceleration = QObject::tr("deceleration"); //降速 + strPositiveLimit = QObject::tr("positive limit");//正限位 + strSecurityInput = QObject::tr("Security input");//安全输入 + strSewingMachineHead = QObject::tr("Sewing machine head");//缝纫机头 + strLowerLiftingLimit = QObject::tr("Lower lifting limit");//升降下限位 + strLiftingUpperLimit = QObject::tr("Lifting upper limit");//升降上限位 + strForwardLimit = QObject::tr("forward limit");//正向限位 + strReverseLimit = QObject::tr("reverse limit");//反向限位 + strMotorAlarm = QObject::tr("motor alarm");//电机报警 + strMotorResetFailed = QObject::tr("motor reset failed");//电机归零失败 + + initAllSensorList(); +} + +MachineTypeFun::~MachineTypeFun() +{ + m_allParasList.clear(); + m_allOutCtrlList.clear(); + m_allShortCutList.clear(); + m_allAssistList.clear(); + m_allPatternSetList.clear(); + m_allParaSetList.clear(); + m_allSensorList.clear(); + m_allErrorCodeAndStateList.clear(); +} + +//获取传感器列表 +QList MachineTypeFun::getSensorList() +{ + return m_allSensorList; +} + +QList MachineTypeFun::getTempSensorList() +{ + return m_tempSensorList; +} + +//获取错误代码列表 +QList MachineTypeFun::getErrorCodeAndStateList() +{ + return m_allErrorCodeAndStateList; +} + +const QHash &MachineTypeFun::getNinebtn() +{ + return m_nineBtn; +} + +const QList &MachineTypeFun::getFileInfoMSG() +{ + return m_fileInfo; +} + +void MachineTypeFun::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void MachineTypeFun::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(LocalPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +void MachineTypeFun::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,QObject::tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,QObject::tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,QObject::tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,QObject::tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,QObject::tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,QObject::tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,QObject::tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,QObject::tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,QObject::tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,QObject::tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,QObject::tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,QObject::tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,QObject::tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + // m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +void MachineTypeFun::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,QObject::tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,QObject::tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,QObject::tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,QObject::tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,QObject::tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +void MachineTypeFun::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,QObject::tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,QObject::tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,QObject::tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,QObject::tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,QObject::tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +void MachineTypeFun::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Width"),//宽度 + 5000, 1, U32_MAX, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Height"),//高度 + 5000, 1, U32_MAX, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + QObject::tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + QObject::tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, index++, operate)); + } + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + QObject::tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + QObject::tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, QObject::tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + QObject::tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, QObject::tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + //花样参数--------------------------- +} + +void MachineTypeFun::initRootParasList() +{ + //超级用户参数--------------------------- + //超级用户参数-界面配置;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_HMICONFIGURATION, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("HMI Configuration"),//界面配置 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0000 , root)); + + //超级用户参数-物联网配置 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_IOTCONFIGURATION, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("IOT Configuration"),//物联网配置 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0000 , root)); + //超级用户参数-网络设置 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_NETWORKSETTINGS, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("IOT NetWorkSetting"),//网络设置 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0000 , root)); + + + //超级用户参数-界面进入调试模式;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_DEBUGMODE, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("Interface debug mode"),//界面进入调试模式 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001 , root)); + + + //超级用户参数-删除默认文件路径 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_DELETE_DEF_PATH, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("Delete default file path"),//删除默认文件路径 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001 , root)); + //超级用户参数-删除config.ini配置文件;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_DELETEINI, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("Delete configure file"),//删除配置文件 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001 , root)); + + //超级用户参数-机器参数;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_MACHINEPARA, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("Machine parameters"),//机器参数 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0002, root)); + + //超级用户参数-工作参数;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_WORKPARA, 0, 0, PARA_VALUE_TYPE_CLICK, + tr("Work parameters"),//工作参数 + 0, 0, 0, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0003, root)); + + //超级用户参数-是否拟合针步;单位:无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_ROOT, + 0 , + ROOT_IF_SPLIT_STEP, 0, 0, PARA_VALUE_TYPE_SW, + tr("Do you want to fitting the needle steps"),//是否拟合针步 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0003, root)); +} + +void MachineTypeFun::initAllSensorList() +{ + //所有传感器列表,字符为空 + m_allSensorList.clear(); + int addr, byteaddr, bitaddr; + + SensorItem item; + + for (addr = 0; addr < MAX_SENSOR_NUM; addr++) + { + byteaddr = addr / 8; + bitaddr = addr % 8; //(0-7) + item.setItemValue(byteaddr, bitaddr, ""); + m_allSensorList.append(item); + } +} + +QList MachineTypeFun::getParaSetListByFilter() +{ + return m_allParaSetList; +} + +QList MachineTypeFun::getPatternSetListByFilter() +{ + return m_allPatternSetList; +} + +QList MachineTypeFun::getAssistListByFilter() +{ + return m_allAssistList; +} + +QList MachineTypeFun::getShortCutListByFilter() +{ + return m_allShortCutList; +} + +QList MachineTypeFun::getOutCtrlListByFilter() +{ + return m_allOutCtrlList; +} + +QList MachineTypeFun::getParasListByMcSel() +{ + QList paralist; + int size = m_allParasList.size(); + + for (int i = 0; i < size; i++) + { + const ParaItem & item = m_allParasList.at(i); + paralist.append(item); +#if(0) + if ((item.mcenSel & mcensel) != 0) + { + paralist.append(item); + } +#endif + } + + qStableSort(paralist.begin(), paralist.end(), comparePriority); + return paralist; +} diff --git a/mctype/machinetypefun.h b/mctype/machinetypefun.h new file mode 100644 index 0000000..fd9e77e --- /dev/null +++ b/mctype/machinetypefun.h @@ -0,0 +1,141 @@ +#ifndef MACHINETYPEFUN_H +#define MACHINETYPEFUN_H + +#include +#include +#include "items/itemsmanage.h" +#include "main.h" +#include + +enum PATTERNINFO{ + FileName,//文件名 + Index,//针数索引 + Schedule,//进度 + BeginPoint,//起始点 + BeginPoint2,//起始点2 + LocalPoint,//定位点 + RangeX,//X范围 + RangeY,//Y范围 + Position,//位置 + Position2,//位置2 + ZCoor,//Z坐标 + Production//产量 +}; + +class MachineTypeFun : public QObject +{ + Q_OBJECT +public: + explicit MachineTypeFun(QObject *parent = 0); + +public: + virtual ~MachineTypeFun(); + +public: + virtual QList getParasListByMcSel(); + virtual QList getOutCtrlListByFilter(); + virtual QList getShortCutListByFilter(); + virtual QList getAssistListByFilter(); + virtual QList getPatternSetListByFilter(); + virtual QList getParaSetListByFilter(); + virtual QList getSensorList(); + virtual QList getTempSensorList(); + virtual QList getErrorCodeAndStateList(); + virtual const QHash& getNinebtn(); + virtual const QList& getFileInfoMSG(); + virtual void initNinebtn1234(); + virtual void initFileInfoLabel(); + virtual void initAssistList(); + virtual void initPatternSetList();//花样设置 + virtual void initParaSetList();//参数设置 + virtual void initPatternsParasList();//花样参数 + +protected: + virtual void initRootParasList();//超级用户参数(包括机器参数、工作参数) + OutCtrlItem creatOpenCloseItem(int macType, int showPriority, QString name, int def);//打开关闭(放松,夹紧) + OutCtrlItem creatZeroForRevItem(int macType, int showPriority, QString name, int def);//(归零,正转,反转) + OutCtrlItem creatPNJoyItem(int macType, int showPriority, QString name, int def);//(正转,反转) + OutCtrlItem creatAscDscItem(int macType, int showPriority, QString name, int def);//(上升,下降) + OutCtrlItem creatStrRecItem(int macType, int showPriority, QString name, int def);//(伸出,收回) + OutCtrlItem creatEnableItem(int macType, int showPriority, QString name, int def, QString btnName);//(剪线) + OutCtrlItem creatZeroItem(int macType, int showPriority, QString name, int def);// (正转):转动 + OutCtrlItem createExecuteItem(int macType, int showPriority, QString name, int def);//执行 +public: + QList m_allParasList; + QList m_allOutCtrlList; + + QList m_allShortCutList; + QList m_allAssistList; + QList m_allPatternSetList; + QList m_allParaSetList; + QList m_allSensorList; + QList m_tempSensorList; + QList m_allErrorCodeAndStateList; + +protected: + QHash m_nineBtn; //九宫格四角按钮的机型化配置 + QList m_fileInfo;//右上角花样信息显示 +private: + void initAllSensorList();//初始化全部传感器列表 + +protected: + QString strManualAuto; + QString strClosedOpen; + QString strAllow; + QString strCurrentLocation; + QString strComLocation; + QString strParkingposition; + QString strFixedFrame; + QString strSlowDownMode; // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + QString strInvalid; + QString strImmediatelyReminder; + QString strImmediatelyReminder2; + QString strPersistentrefueling; + QString strRoundShockknife; + QString strContinuous; + QString strAcceleration; + QString strTrimList; + QString strEnable; + QString strDisable; + QString strJogP; + QString strJogN; + QString strTurn; + QString strZero; + QString strOpen; + QString strClose; + QString strAscend; + QString strDescend; + QString strRelease; + QString strTighten; + QString strTrim; + QString strPull; + QString strBack; + QString strStretch; + QString strRecover; + QString strStop; + QString strStart; + QString strSwing; + QString strRun; + QString strSewSource; + + QString strStartButton ; + QString strPauseButton; + QString strPressDetection; + QString strZeroPosition ; + QString strDeceleration ; + QString strPositiveLimit ; + QString strSecurityInput ; + QString strSewingMachineHead; + QString strLowerLiftingLimit; + QString strLiftingUpperLimit; + QString strForwardLimit ; + QString strReverseLimit ; + QString strMotorAlarm ; + QString strMotorResetFailed; + +}; + +extern QString createStrList(QStringList list); + + +#endif // MACHINETYPEFUN_H diff --git a/mctype/mainwidgetfunction.cpp b/mctype/mainwidgetfunction.cpp new file mode 100644 index 0000000..3e33e5e --- /dev/null +++ b/mctype/mainwidgetfunction.cpp @@ -0,0 +1,5567 @@ +#include "mainwidgetfunction.h" + +MainWidgetFunction::MainWidgetFunction(QObject *parent) : + QObject(parent), + m_pPromptDlg(NULL), + m_pSystemManageDlg(NULL), + m_pDebugInfoDlg(NULL) +{ + initialize(); + initializeLotData();//初始化物联网数据 + + m_pPromptDlg = new PromptDialog(); + m_pPromptDlg->hide(); + + connect(m_pPromptDlg, SIGNAL(siSpindleAction(int)),this, SLOT(slotSpindleAction(int))); + connect(m_pPromptDlg, SIGNAL(siSpindleRotate(int)),this, SLOT(slotSpindleRotate(int))); + connect(m_pPromptDlg, SIGNAL(siRotateRotate(int)),this, SLOT(slotRotateRotate(int))); + connect(m_pPromptDlg, SIGNAL(siAutoPull(int)),this, SLOT(slotAutoPull(int))); + connect(m_pPromptDlg, SIGNAL(siSpindleTime(int,int)),this, SLOT(slotSpindleResearch(int,int))); + + connect(m_pPromptDlg, SIGNAL(siUpdataCancel()),g_pMachine, SLOT(breakFileTrans())); + connect(g_pMachine, SIGNAL(siTransProgress(u8,int,int)),this, SLOT(slotTransProgress(u8,int,int)));//升级主控进度条 + // connect(g_pLotMachine,SIGNAL(siConnectToMqtt()),this,SLOT(slotSendJsonToMqtt())); + connect(g_pLotMachine,SIGNAL(siRunLotDataAction(QString)),this,SLOT(slotRunLotDataAction(QString))); + + //机器信息改变 + connect(g_pMachine, SIGNAL(siMcInfoChange()), this, SLOT(slotMCInfoChange())); + //接收物联数据 +// connect(g_pMachine, SIGNAL(siReceiveLotData()), this, SLOT(slotReceiveLotData())); + + //物联网 + QTimer* pLotTimer = new QTimer(this); + connect(pLotTimer, SIGNAL(timeout()), this, SLOT(slotReceiveLotData())); + pLotTimer->setInterval(5000); + pLotTimer->start(); + + m_shuttleDlg = new shuttlebottomlineDialog(); + m_shuttleDlg->hide(); + + m_pSystemManageDlg = new SystemManageDialog(); + connect(m_pSystemManageDlg,SIGNAL(siClearProductStatis()),this,SLOT(slotClearProductStatis())); + connect(m_pSystemManageDlg,SIGNAL(siCsvExport(int)),this,SLOT(slotCsvExport(int))); + connect(m_pSystemManageDlg,SIGNAL(siCsvChangeErro( )),this,SLOT(slotJournalError( ))); + connect(m_pSystemManageDlg,SIGNAL(siCsvChangeBrea( )),this,SLOT(slotJournalBreakage( ))); + connect(m_pSystemManageDlg,SIGNAL(siCsvChangeDebug( )),this,SLOT(slotCsvChangeDebug())); + connect(m_pSystemManageDlg,SIGNAL(siClearJournal()),this,SLOT(slotClearJournal())); + connect(m_pSystemManageDlg,SIGNAL(siRefreshWifiList()),this,SLOT(slotRefreshWifiList())); + + connect(m_pSystemManageDlg,SIGNAL(siSetDynamicIP(QString)),this,SLOT(slotSetDynamicIP(QString))); + connect(m_pSystemManageDlg,SIGNAL(siSetStaticIP(QString,QString,QString)),this,SLOT(slotSetStaticIP(QString,QString,QString))); + + m_pSystemManageDlg->hide(); + + m_pDebugInfoDlg = new DebugInfoDialog(); + m_pDebugInfoDlg->hide(); + + m_pTipsTimer = new QTimer(this); + m_pTipsTimer->setInterval(14400000);//设置定时器时间间隔 4小时 + connect(m_pTipsTimer, SIGNAL(timeout()), this, SLOT(onTipsTimer())); + + // 测试物联网用 + // connect(&timer, SIGNAL(timeout()), this, SLOT(slotReceiveLotData())); + // timer.setInterval(1000); + // timer.start(); +} + +MainWidgetFunction::~MainWidgetFunction() +{ + if(m_pPromptDlg != NULL) + { + delete m_pPromptDlg; + } + if(m_shuttleDlg != NULL) + { + delete m_shuttleDlg; + } + if(m_pSystemManageDlg != NULL) + { + delete m_pSystemManageDlg; + } + if(m_pDebugInfoDlg != NULL) + { + delete m_pDebugInfoDlg; + } +} + +void MainWidgetFunction::initialize() +{ + memset(&m_mcStatus,0,sizeof(MCStatus)); + m_curFileID = 1;// 当前文件ID + m_filePath.clear(); + m_fileName.clear(); + m_getScore = 0; + m_totalScore = 0; + initializeLotInfo(); +} + +void MainWidgetFunction::initializeLotInfo() +{ + QDir apppath(qApp->applicationDirPath()); + QString iniPath = apppath.path() + apppath.separator() + "config.ini"; + QSettings setting(iniPath, QSettings::IniFormat); //QSettings能记录一些程序中的信息,下次再打开时可以读取出来 + m_getScore = setting.value("Progress/getScore").toInt(); + + QString path = apppath.path() + apppath.separator() + CSV_PROGRESS; + QFile file(path); + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qDebug() << "Open CSV file failed!"; + return; + } + + QStringList strlist; + strlist.clear(); + QTextStream out(&file); + out.setCodec("GB2312"); //支持读取中文信息 + + //遍历行 + for(int i = 0; !out.atEnd(); i++) + { + QString strLine = out.readLine(); + if(strLine.size() <= 0) + { + continue; + } + m_csvFileStrList.append(strLine); + strlist = strLine.split(",", QString::SkipEmptyParts); //根据","分隔开每行的列 + if(i > 0) //第一行不执行操作 + { + if (strlist.size() > COLUMN_SCORE) + { + QString code = strlist.at(COLUMN_CODE); + QStringList strlist1 = code.split("_", QString::SkipEmptyParts); //根据"_"分隔开每行的列 + int type = 0; + if(strlist1.size() > 0) + { + char *buf = strdup(strlist1[1].toLatin1().data()); + sscanf (buf, "%x", &type); + } + s16 score = 0; + score = strlist.at(COLUMN_SCORE).toInt(); + m_totalScore += score; + } + } + } + + file.close();//关闭文件 +} + +//初始化物联网数据 +void MainWidgetFunction::initializeLotData() +{ + memset(&m_mcLotData,0,sizeof(McLotData)); + memset(&m_HMILotData,0,sizeof(HMILotData)); + + QString verStr = getVersionStr(); + memcpy(m_HMILotData.HMIVerStr, verStr.data(), verStr.length()); // 版本号 + + u32 rackNum = g_pSettings->readFromIniFile("IOT/rackNumber").toInt();//机架号 + m_HMILotData.machineNumber = rackNum; // 机架号 + + u16 dProgress = g_pSettings->readFromIniFile("IOT/debugProgress").toInt();//调试进度 + m_HMILotData.debugProgress = dProgress; //调试进度 + + QString deliveryTime = g_pSettings->readFromIniFile("IOT/deliveryTime").toString();//工厂预计交货时间 + QByteArray arr = deliveryTime.toLocal8Bit(); + memcpy(m_HMILotData.deliveryTime, arr.data(), arr.size()); //交货日期 + + //电机总数-先固定写为4个,如果后续变动较大,可把电机个数写为全局变量或从其他cpp中传参 + m_HMILotData.motorNum = 4; + + QString fileName = m_fileName; + memcpy(m_HMILotData.fileName, fileName.data(), fileName.length()); // 文件名称 +} + +//优盘检测 +QString MainWidgetFunction::detectUsb() +{ + QString usbPath = ""; + +#ifdef Q_OS_LINUX + QDir dir(LINUXUSBPATH); + if(!dir.exists()) + { + usbPath = ""; + } + else + { + usbPath = LINUXUSBPATH; + } +#endif + +#ifdef Q_OS_WIN + QFileInfoList list = QDir::drives(); + + for(int i = 0; i= 2) + { + QString str1 = lineStr[0]; + //qDebug()<initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("USB flash drive is not detected!");//未检测到优盘! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + QDir apppath(qApp->applicationDirPath()); + QString targetDir = apppath.absolutePath() + apppath.separator(); + + QDir dir (usbPath); + dir.setFilter(QDir::Files | QDir::NoSymLinks); // 设置类型过滤器,只为文件格式 + QFileInfoList fileList = dir.entryInfoList(); + + if(type == HMI_UPDATA)//界面升级 + { + qDebug()<<"update 1"; + //界面文件、语言文件、RCC资源文件、打包的AUT文件 + for (int var = 0; var < fileList.size(); var++) + { +#ifdef Q_OS_WIN + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper() == "EXE") || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + +#ifdef Q_OS_LINUX + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper().length() == 0) || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + } + qDebug()<<"update 2"; + } + else if(type == BACKUPS_UPDATA)//界面还原 ---------coco + { + //界面文件、语言文件、RCC资源文件、打包的AUT文件 + for (int var = 0; var < fileList.size(); var++) + { +#ifdef Q_OS_WIN + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper() == "EXE") || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + +#ifdef Q_OS_LINUX + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper().length() == 0) || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + } + } // -------------coco + else if(type == MC_UPDATA)//主控升级 + { + for (int var = 0; var < fileList.size(); var++) + { + if( fileList.at(var).suffix().toUpper() == "GNPU" || fileList.at(var).suffix().toUpper() == "GAUF" ) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } + } + qDebug()<<"update 3"; + } + else if(type == PARA_IMPORT)//参数导入 + { + QString fileSuffix = "PARADAT"; + + for (int var = 0; var < fileList.size(); var++) + { + if( fileList.at(var).suffix().toUpper() == fileSuffix) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } + } + qDebug()<<"update 4"; + } + //点击了确认按钮 + if(m_pSystemManageDlg->exec(type) == 1) + { + QString fileName = m_pSystemManageDlg->getCurFile(); + + if(type == HMI_UPDATA)//界面升级 + { + QString sPath,tPath; +#ifdef Q_OS_WIN + if(fileName.toUpper().indexOf(APPNAME) != -1 && + fileName.toUpper().indexOf(".EXE") != -1) + { + sPath = usbPath + fileName; + tPath = targetDir + WIN_APPNAME; + + // ----- coco + QString nowPath,oldPath,nPath; + nowPath = targetDir +"QUILTING.exe"; + oldPath = targetDir + "version"; + QDir dir(oldPath); + // 打开文件所在的路径 + if(!dir.exists()) + { + dir.mkdir(oldPath);// + } + //将文件复制到新建的version文件夹下 + nPath = targetDir + "/" + "version" + "/" + QFileInfo(tPath).fileName(); + QFile::copy( nowPath , nPath); + + // 获取当前日期和时间 + QDateTime currentDateTime = QDateTime::currentDateTime(); + QString formattedDateTime = currentDateTime.toString("yyyyMMdd_hhmmss"); + + // 构造新的文件名 +// QString baseName = QFileInfo(nPath).baseName(); + QString newName = "QUILTING"; + QString suffix = QFileInfo(nPath).suffix(); + QString newFileName = newName + "_" + formattedDateTime + "." + suffix; + QString newFilePath = QFileInfo(nPath).absolutePath() + "/" + newFileName; + + // 重命名文件 + if (QFile::rename(nPath, newFilePath)) + { + qDebug() << "File renamed successfully from" << nPath << "to" << newFilePath; + } + else + { + qDebug() << "Failed to rename file from" << nPath << "to" << newFilePath; + } + // ----- coco + + + qDebug()<<"HMI Update"; + qDebug()<<"sPath"<exit(); + } +#endif + +#ifdef Q_OS_LINUX + if(fileName.toUpper().indexOf(APPNAME) != -1 && + fileName.toUpper().indexOf(".EXE") == -1 && + fileName.toUpper().indexOf(".AUT") == -1)//非aut打包文件 + { + sPath = usbPath + fileName; + tPath = targetDir + LINUX_APPNAME; + + //--------------coco + QString nowPath,oldPath,nPath; + nowPath = targetDir + LINUX_APPNAME; + oldPath = targetDir + "version"; + QDir dir(oldPath); + // 打开文件所在的路径 + if(!dir.exists()) + { + dir.mkdir(oldPath);// + } + //将文件复制到新建的version文件夹下 + nPath = targetDir + "/" + "version" + "/" + QFileInfo(tPath).fileName(); + QFile::copy( nowPath , nPath); + + // 获取当前日期和时间 + QDateTime currentDateTime = QDateTime::currentDateTime(); + QString formattedDateTime = currentDateTime.toString("yyyyMMdd_hhmmss"); + + // 构造新的文件名 + QString newName = "QUILTING"; + QString newFileName = newName + "_" + formattedDateTime; + QString newFilePath = QFileInfo(nPath).absolutePath() + "/" + newFileName; + + // 重命名文件 + if (QFile::rename(nPath, newFilePath)) + { + qDebug() << "File renamed successfully from" << nPath << "to" << newFilePath; + } + else + { + qDebug() << "Failed to rename file from" << nPath << "to" << newFilePath; + } + //--------------coco + + qDebug()<<"HMI Update"; + qDebug()<<"sPath"<exit(); +#endif + +#ifdef Q_OS_LINUX + system("sync"); + system("reboot"); +#endif + } + + else if(fileName.toUpper().indexOf(".RCC") != -1 ) + { + QString sPath = usbPath + fileName ; + QString tPath = targetDir + "nxcui.rcc"; + + qDebug()<<"RCC Update"; + qDebug()<<"sPath"<exit(); +#endif + +#ifdef Q_OS_LINUX + system("sync"); + system("reboot"); +#endif + } + + else if(fileName.toUpper().indexOf(".AUT") != -1)//界面打包文件(包括升级文件、语言包、RCC等) + { + QString strFile = usbPath + fileName; + QFile file(strFile); + file.open(QIODevice::ReadOnly); + + QByteArray AllData = file.readAll(); + HMIFileHead *fhead = (HMIFileHead*)(AllData.data()); + int filenum = fhead->fileNum; + + int bSize = 0; + for(int j = 0; j < filenum; j++) + { + int cSize = j*sizeof(HMIItemFileHead) + sizeof(HMIFileHead) + bSize; + HMIItemFileHead *ahead; + ahead = (HMIItemFileHead*)(AllData.data() + cSize); + QString fName = ahead->fileName; + + int fileSize = ahead->fileSize; + if(fileSize <= 0) + { + return; + } + int sDataCheck = ahead->dataCheck; + + cSize = cSize + sizeof(HMIItemFileHead); + QByteArray buf = AllData.mid(cSize,fileSize); + int tDataCheck = calcCheckSum32((u8*)buf.data(),fileSize); + + bSize = bSize + fileSize; + + //校验相同,查找相同的文件替换 + if(sDataCheck == tDataCheck) + { + QString uFileName = targetDir + fName; + QFile uFile(uFileName); + QString cName = fName; + + if(uFile.exists())//执行目录中存在U盘中的文件fileName + { + QString targetPath; + targetPath.clear(); + +#ifdef Q_OS_WIN + if(fName.toUpper().indexOf(APPNAME) != -1 && + fName.toUpper().indexOf(".EXE") != -1) + { + targetPath = targetDir + WIN_APPNAME; + } +#endif + +#ifdef Q_OS_LINUX + if(fName.toUpper().indexOf(APPNAME) != -1 && + fName.toUpper().indexOf(".EXE") == -1) + { + targetPath = targetDir + LINUX_APPNAME; + cName = LINUX_APPNAME; + } +#endif + +#if(0) + if(fName.toUpper().indexOf(APPNAME) != -1) + { +#ifdef Q_OS_WIN + targetPath = targetDir + WIN_APPNAME; +#endif +#ifdef Q_OS_LINUX + + targetPath = targetDir + LINUX_APPNAME; + cName = LINUX_APPNAME; +#endif + } +#endif + else//其他文件 + { + targetPath = uFileName; + } + + QFile::remove(targetPath); + QFile tFile(targetPath); + + if(tFile.open(QIODevice::WriteOnly) == false) + { + return; + } + tFile.write(buf); + + qDebug()<<"AUT Update"; + qDebug()<<"targetPath"<initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("The program is corrupted, please re-upgrade after replacing the program!")); //程序已损坏,请更换程序后重新升级! + m_pPromptDlg->exec(); + return; + } + } + file.close(); + +#ifdef Q_OS_LINUX + qDebug()<<"reboot before"; + system("sync"); + system("reboot"); + qDebug()<<"reboot end"; +#endif + + //需放在linux重启命令后面 +#ifdef Q_OS_WIN + qDebug()<<"qApp->exit()"; + qApp->exit(); +#endif + } + else + { + //所选文件非升级文件 + //文件格式错误,请重新选择! + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("The file format is wrong, please select again!");//文件格式错误,请重新选择! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + } + } + else if(type == MC_UPDATA)//主控升级 + { + if(fileName.toUpper().indexOf(".GNPU") != -1 || fileName.toUpper().indexOf(".GAUF") != -1) + { + QString uPath = usbPath + fileName; + + qDebug()<<"GNPU update"; + qDebug()<<"uPath"<initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("File bytes are 0, please check the file!");//文件字节为0,请检查文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + file.open(QIODevice::ReadOnly); + file.read( (char *)pBuff , file.size()) ; + file.close(); + + int nameSize = uPath.toUtf8().size() ; + if( nameSize > 32 ) + { + nameSize = 32; + } + memcpy(appHead.fileName , uPath.toUtf8().data() , nameSize); + appHead.dataSize = file.size(); + appHead.dataChecksum = calcCheckSum32(pBuff , file.size()); + + static int nID = 0; + if( g_pMachine->isConnected() == 3) + { + g_pMachine->sendAPPFileProc(FILE_TYPE_PGM, + 0, + nID++, + appHead , + pBuff + ); + } + free(pBuff); + } + } + else if(type == PARA_IMPORT)//参数导入 + { + QString uPath = usbPath + fileName; + + qDebug()<<"Para Import"; + qDebug()<<"uPath"<initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = (tr("File size not match, invalid file!"));//文件大小不匹配,无效的参数文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + if( readSize != paraSize) + { + //文件大小不匹配,无效的参数文件 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = (tr("File size not match, invalid file!"));//文件大小不匹配,无效的参数文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + // 参数被正确的读取 + if( + ( paraFileStruct.s_head[0] == 'P' ) + && ( paraFileStruct.s_head[1] == 'A' ) + && ( paraFileStruct.s_head[2] == 'R' ) + && ( paraFileStruct.s_head[3] == 'A' ) + && ( paraFileStruct.s_type == 0 ) + && ( paraFileStruct.s_len == 4096 ) + ) + { + unsigned short i_crc = calcCrc16( (unsigned char *) paraFileStruct.s_para_buff , paraFileStruct.s_len); + + if( paraFileStruct.s_crc != i_crc ) + { + //数据校验错误,无效的参数文件 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = (tr("Data check error, invalid file!"));//数据校验错误,无效的参数文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + //将 一个文件 拆分成两个 缓冲区 + unsigned char mac_config [1024] ; + unsigned char work_config [1024] ; + unsigned char pre_mac_config [1024] ; + unsigned char pre_work_config [1024] ; + + // 清空 + memset( mac_config , 0 , 1024 ) ; + memset( work_config , 0 , 1024 ) ; + memset( pre_mac_config , 0 , 1024 ) ; + memset( pre_work_config , 0 , 1024 ) ; + + memcpy( work_config , paraFileStruct.s_para_buff , 1024 ) ; + memcpy( mac_config , ((char*)paraFileStruct.s_para_buff) + 1024 , 1024 ) ; + memcpy( pre_mac_config , ((char*)paraFileStruct.s_para_buff) + 2048 , 1024 ) ; + memcpy( pre_work_config , ((char*)paraFileStruct.s_para_buff) + 3072 , 1024 ) ; + + g_pMachine->setMcPara((ParaStruct *) mac_config); + g_pMachine->setWkPara((ParaStruct *) work_config); + g_pMachine->setMcPrePara((ParaStruct *) pre_mac_config); + g_pMachine->setWkPrePara((ParaStruct *) pre_work_config); + + QString str; + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + str = (tr("Parameters imported successfully!"));//参数导入成功! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + else + { + //文件头不匹配,无效的参数文件! + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = (tr("File head not match, invalid file!"));//文件头不匹配,无效的参数文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + } + } + } +} +// ---------coco +//备份升级 +void MainWidgetFunction::systembackupUpgrade(int type) +{ + QDir apppath(qApp->applicationDirPath()); + QString targetDir = apppath.absolutePath() + apppath.separator(); + + QString localPath = targetDir + "version"; + QDir dir(localPath); + // 打开文件所在的路径 + if(!dir.exists()) + { + dir.mkdir(localPath);// + } + + dir.setFilter(QDir::Files | QDir::NoSymLinks); // 设置类型过滤器,只为文件格式 + QFileInfoList fileList = dir.entryInfoList(); + if(type == BACKUPS_UPDATA)//界面还原 + { + for (int var = 0; var < fileList.size(); var++) + { +#ifdef Q_OS_WIN + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper() == "EXE") || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + +#ifdef Q_OS_LINUX + if((fileList.at(var).fileName().toUpper().indexOf(APPNAME) != -1 && + fileList.at(var).suffix().toUpper().length() == 0) || + fileList.at(var).fileName().toUpper().indexOf(".QM") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".RCC") != -1 || + fileList.at(var).fileName().toUpper().indexOf(".AUT") != -1) + { + m_pSystemManageDlg->addItem(fileList.at(var).fileName()); + } +#endif + } + } + + //点击了确认按钮 + if(m_pSystemManageDlg->exec(type) == 1) + { + QString fileName = m_pSystemManageDlg->getCurFile(); + QString nowPath,oldPath,newPath; + + if(type == BACKUPS_UPDATA)//界面还原 + { +#ifdef Q_OS_WIN + if(fileName.toUpper().indexOf(APPNAME) != -1 && + fileName.toUpper().indexOf(".EXE") != -1) + { + nowPath = targetDir + "QUILTING.exe"; + + oldPath = targetDir + "/" + "version" + "/" + fileName; + + newPath = targetDir + fileName; + + QFile::remove(nowPath); + QFile::copy(oldPath , newPath);// + + // 构造新的文件名 + + QString newName = "QUILTING1"; //为做区分多加一个1 + QString suffix = QFileInfo(newPath).suffix(); + QString newFileName = newName + "." + suffix; + QString newFilePath = QFileInfo(newPath).absolutePath() + "/" + newFileName; + + // 重命名文件 + if (QFile::rename(newPath, newFilePath)) + { + qDebug() << "File renamed successfully from" << newPath << "to" << newFilePath; + } + else + { + qDebug() << "Failed to rename file from" << newPath << "to" << newFilePath; + } + + qApp->exit(); + } +#endif + +#ifdef Q_OS_LINUX + if(fileName.toUpper().indexOf(APPNAME) != -1 && + QFileInfo(fileName).suffix().length() == 0) + { + nowPath = targetDir + LINUX_APPNAME; + + oldPath = targetDir + "/" + "version" + "/" + fileName; + + newPath = targetDir + fileName; + + QFile::remove(nowPath); + system("sync"); + QFile::copy(oldPath , newPath);// + system("sync"); + + // 构造新的文件名 + QString newName = "OPRT_CP"; // + QString newFilePath = QFileInfo(newPath).absolutePath() + "/" + newName; + + // 重命名文件 + if (QFile::rename(newPath, newFilePath)) + { + qDebug() << "File renamed successfully from" << newPath << "to" << newFilePath; + } + else + { + qDebug() << "Failed to rename file from" << newPath << "to" << newFilePath; + } + + system("reboot"); + qDebug()<<"reboot"; + } +#endif + } + + + } + + +} +// -------coco window上原来的exe,在remove函数下无法移除,Linux没问题 + +s16 MainWidgetFunction::refreshWifiList(QStringList &wifiStrList,s16 scan) +{ + if(scan == 0){}//为了去掉编译警告 + wifiStrList.clear(); + + QProcess cmd; + QString cmdStr; + cmdStr.clear(); + QString strCmdOut; + strCmdOut.clear(); + QStringList lineStrList; + lineStrList.clear(); + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + +#ifdef Q_OS_LINUX + cmdStr = "ifconfig";//查看wlan0初始化是否成功 + cmd.start(cmdStr); + cmd.waitForStarted(); + cmd.waitForFinished(); + strCmdOut=QString::fromLocal8Bit(cmd.readAllStandardOutput()); + lineStrList = strCmdOut.split("\n", QString::SkipEmptyParts); //换行符 + int initFlag = 0; + for(int i = 0; i < lineStrList.size(); i++) + { + QString lineStr = lineStrList[i]; + if(lineStr.indexOf("wlan0") != -1) + { + initFlag = 1; + break; + } + } + if(initFlag == 0) + { + m_pPromptDlg->setContentStr(tr("Failed to initialize wlan0!"));//初始化wlan0失败! + m_pPromptDlg->exec(); + return -1; + } + + if(scan != 0) + { + cmdStr = "wpa_cli -i wlan0 scan";//搜索可见wifi + cmd.start(cmdStr); + cmd.waitForStarted(); + cmd.waitForFinished(); + strCmdOut=QString::fromLocal8Bit(cmd.readAllStandardOutput()); + int flag = 0; + while(strCmdOut.toUpper().indexOf("OK") == -1) + { + cmdStr = "wpa_cli -i wlan0 scan";//搜索可见wifi + cmd.start(cmdStr); + cmd.waitForStarted(); + cmd.waitForFinished(); + strCmdOut=QString::fromLocal8Bit(cmd.readAllStandardOutput()); + flag++; + if(flag>=100){ + break; + } + } + } + + cmdStr = "wpa_cli -i wlan0 scan_result";//获取搜索结果 + cmd.start(cmdStr); + cmd.waitForStarted(); + cmd.waitForFinished(); + strCmdOut=QString::fromLocal8Bit(cmd.readAllStandardOutput()); + lineStrList = strCmdOut.split("\n", QString::SkipEmptyParts);//换行符 + for(int i = 0; i < lineStrList.size(); i++) + { + //qDebug()<= 2 && lineStr[lineStr.size()-1].indexOf("]") == -1) + { + QString str = lineStr[lineStr.size()-1].remove(QRegExp("^ +\\s*"));//正则表达式去掉空格 + s16 ifExist = 0; + for(s16 m = 0; m < wifiStrList.size(); m++) + { + if(wifiStrList[m] == str) + { + ifExist = 1; + break; + } + } + if(ifExist == 0) + { + wifiStrList.append(str); + } + } + } + if(wifiStrList.size() <= 0) + { + m_pPromptDlg->setContentStr(tr("Failed to search for WiFi list. Please try again later!"));//搜索wifi列表失败,请稍后重试! + m_pPromptDlg->exec(); + return -1; + } +#endif + return 1; +} + +QString MainWidgetFunction::getIpSegment(bool bl) +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString ipStr; + ipStr.clear(); + if(bl == true){}//为了去掉编译警告 + //linux下查询wifi连接状态 +#ifdef Q_OS_LINUX + s16 value = -1; + QProcess cmd; + QString cmdStr; + cmdStr.clear(); + + QString strCmdOut; + strCmdOut.clear(); + + QStringList lineStrList; + lineStrList.clear(); + + cmdStr = "wpa_cli -i wlan0 status";//查询wifi连接状态 + cmd.start(cmdStr); + cmd.waitForStarted(); + cmd.waitForFinished(); + strCmdOut=QString::fromLocal8Bit(cmd.readAllStandardOutput()); + //qDebug()<<"strCmdOut"<= 2) + { + QString str1 = lineStr[0]; + //qDebug()<= 0) + { + QString modeStr; + modeStr.clear(); + if(bl == false) + { + modeStr = tr("dynamic");//动态 + } + else if(bl == true) + { + modeStr = tr("static");//静态 + } + + ipStr = ipStr + "(" + modeStr + ")"; + } + else + { + if(bl == true) + { + m_pPromptDlg->setContentStr(tr("Failed to obtain IP. Please check the settings!"));//获取IP失败,请检查设置! + m_pPromptDlg->exec(); + } + } +#endif + return ipStr; +} + +//参数导入 +void MainWidgetFunction::funImportParameter(QString tStyle) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("Parameter Import")); + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Parameter Import")); + m_pSystemManageDlg->initDialog(); + systemUpgrade(PARA_IMPORT); +} + +//主控升级 +void MainWidgetFunction::funMCUpgrade(QString tStyle) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("MCUpgrade")); + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" MC Upgrade")); + m_pSystemManageDlg->initDialog(); + systemUpgrade(MC_UPDATA); +} + +//界面升级 +void MainWidgetFunction::funHMIUpgrade(QString tStyle) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("HMIUpgrade")); + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" HMI Upgrade")); + m_pSystemManageDlg->initDialog(); + + systemUpgrade(HMI_UPDATA); +} + +//界面还原 +void MainWidgetFunction::funHMIBackupsUpgrade(QString tStyle) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("HMI backups Upgrade")); + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr("HMI backups Upgrade")); + m_pSystemManageDlg->initDialog(); + + systembackupUpgrade(BACKUPS_UPDATA); +} + +void MainWidgetFunction::funWIFI(QString tStyle) +{ + QStringList wifiStrList; + wifiStrList.clear(); + s16 rel = refreshWifiList(wifiStrList); + if(rel > 0) + { + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("WIFI")); + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + ">" + tr("WIFI")); + + bool mode = false;//动态获取IP方式 + QString iniPath = WIFIINIPATH; + QSettings setting(iniPath,QSettings::IniFormat); + QString wifiName = QByteArray::fromBase64(setting.value("WIFI/default_ssid").toByteArray()); + QString wifiPass = QByteArray::fromBase64(setting.value("WIFI/default_passwd").toByteArray()); + mode = setting.value("WIFI/static_mode").toBool(); + + QString ip = getIpSegment(mode); + if(ip.length() > 0)//已连接 + { + m_pSystemManageDlg->setWifiInfo(ip,wifiName,wifiPass,mode); + m_pSystemManageDlg->initDialog(1); + for(s16 i = 0; i < wifiStrList.size(); i++) + { + m_pSystemManageDlg->addItem(wifiStrList.at(i)); + } + emit siWifiState(true); + } + else//未连接 + { + m_pSystemManageDlg->initDialog(1); + for(s16 i = 0; i < wifiStrList.size(); i++) + { + m_pSystemManageDlg->addItem(wifiStrList.at(i)); + } + emit siWifiState(false); + } + m_pSystemManageDlg->exec(); + } +} + +//参数导出 +void MainWidgetFunction::funExportParameter() +{ + QString usbPath = detectUsb(); + if(usbPath.length() <= 0) + { + //优盘不存在 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("USB flash drive is not detected!");//未检测到优盘! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + MCInfo info1 = g_pMachine->getMcInfo(); + QString software_ver; + software_ver.sprintf("%s",info1.softwareVerStr); + qDebug()<getMcPara())) , 1024 ); + memcpy(para_wk , (u8*) (&(g_pMachine->getWkPara())) , 1024 ); + + memcpy(pre_para_mc , (u8*) (&(g_pMachine->getPreMcPara())) , 1024 ); + memcpy(pre_para_wk , (u8*) (&(g_pMachine->getPreWkPara())) , 1024 ); + + //两个缓冲区,输出成一个参数文件 + // 转换结构体 开始 + ParaFile paraFileStruct ; + memset(¶FileStruct,0,sizeof(ParaFile)) ; + + paraFileStruct.s_head[0] = 'P'; + paraFileStruct.s_head[1] = 'A'; + paraFileStruct.s_head[2] = 'R'; + paraFileStruct.s_head[3] = 'A'; + + paraFileStruct.s_type = 0 ; + paraFileStruct.s_len = 4096 ; + + memcpy( paraFileStruct.s_para_buff , para_wk , 1024 ); + memcpy( (char *) (paraFileStruct.s_para_buff) + 1024 , para_mc , 1024 ); + memcpy( (char *) (paraFileStruct.s_para_buff) + 2048 , pre_para_mc , 1024 ); + memcpy( (char *) (paraFileStruct.s_para_buff) + 3072 , pre_para_wk , 1024 ); + + paraFileStruct.s_crc = calcCrc16( (u8 * ) paraFileStruct.s_para_buff , 4096 ) ; + // 转换结构体 结束 + + // 保存文件 开始 + QFile file(paraFileName); + file.open(QIODevice::ReadWrite | QIODevice::Truncate); + file.write((char*)¶FileStruct,sizeof(ParaFile)); + file.flush(); + file.close(); + // 保存文件 结束 + +#ifdef Q_OS_LINUX + system("sync"); +#endif + + //参数导出成功 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Parameters exported successfully!");//参数导出成功! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; +} + +//全部归零 +void MainWidgetFunction::funAllToZero() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("All to zero"));//全部归零 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->allToZero(); + } + } +} + +//产量清零 +void MainWidgetFunction::funResetOutput() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("All to reset"));//产量清零 + + QString str; + str = tr("Whether to reset the output?");//是否重置产量? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->resetOutput(); + } + } +} + +//流程复位 +void MainWidgetFunction::funAllToReset() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("All to reset"));//流程复位 + + QString str; + str = tr("If all process to reset?");//是否全部流程复位? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + qDebug()<<"MainWidgetFunction::funAllToReset() >>>>>>>>>>>>>>>> g_pMachine->allToReset();"; + g_pMachine->allToReset(); + } + } +} + +//主轴点动 +void MainWidgetFunction::funSpindleJog() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Spindle jog"));//主轴点动 + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->sewJog(); + } + } +} + +//主轴旋转 +void MainWidgetFunction::funSpindleRotate() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_SPINDLE_ROTATE); + m_pPromptDlg->setTitleStr(tr("Spindle rotate angle"));//主轴旋转角度 + m_pPromptDlg->exec(); // coco + // if (m_pPromptDlg->exec() == 1) + // { + // s32 val = m_pPromptDlg->getSpindleRotateAngle(); + + // if(g_pMachine != NULL) + // { + // } + // } +} + +//旋转电机旋转 +void MainWidgetFunction::funRotateRotate() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_ROTATE_ROTATE); + m_pPromptDlg->setTitleStr(tr("Rotating motor rotation angle"));//旋转电机旋转角度 + m_pPromptDlg->exec(); + // if (m_pPromptDlg->exec() == 1) + // { + // //s32 val = m_pPromptDlg->getSpindleRotateAngle(); + + // if(g_pMachine != NULL) + // { + // } + // } +} + +//回工作点 +void MainWidgetFunction::funBackWorkPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back work point"));//回工作点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoWorkPos(); + } + } +} + +//工作机头允许设置 +void MainWidgetFunction::funWorkHeadSet() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_WORKHEADSET); + m_pPromptDlg->setTitleStr(tr("Work Head Set")); + m_pPromptDlg->exec(); + +} + +//回原点(回零点(回绣框原点)) +void MainWidgetFunction::funBackToOrigin() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back to zero"));//回原点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoZeroPos(); + } + } +} + +//定起始点 +void MainWidgetFunction::funSetStartPoint(QString filePath,int x,int y,int showFlag, bool allToReset, bool isSendPatternHead) +{ + if(filePath.length() <= 0) + { + return; + } + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set start point"));//定起始点 + QString str = tr("Whether to set the current point as the start point?");//是否将当前点设置为起始点? + m_pPromptDlg->setContentStr(str); + int setFlag = 1; + if(showFlag == 1) + { + setFlag = m_pPromptDlg->exec(); + } + + if(g_pCurEmbData == NULL) + { + return; + } + + if(setFlag == 1) + { + writeFilePoint(filePath,x,y); + + g_pCurEmbData->setStartPosition(x,y); + + if(isSendPatternHead) + sendPatternHead(filePath);//发送花样ds16头文件 + + //流程复位 + if(allToReset) + g_pMachine->allToReset(); + } +} + +void MainWidgetFunction::funSetLeftFrontPoint(QString filePath, int left, int front, bool allToReset, bool isSendPatternHead) +{ + if(filePath.length() <= 0) + { + return; + } + + if(g_pCurEmbData == NULL) + { + return; + } + + int x,y; + x = y = 0; + writeFileLeftFrontPoint(filePath,x,y,left,front); + g_pCurEmbData->setStartPositionFromLeftFront(left,front); + //g_pCurEmbData->setStartPosition(x,y); + + if(isSendPatternHead) + sendPatternHead(filePath);//发送花样ds16头文件 + + //流程复位 + if(allToReset) + g_pMachine->allToReset(); + +} + +void MainWidgetFunction::funSetLeftFrontPointDoubleHead(QString filePath, int left, int front, int showFlag, bool allToReset, bool isSendPatternHead) +{ + if(filePath.length() <= 0) + { + return; + } + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set left front point"));//定左前点 + QString str = tr("Whether to set the current point as the left front point?");//是否将当前点设置为左前点? + m_pPromptDlg->setContentStr(str); + int setFlag = 1; + if(showFlag == 1) + { + setFlag = m_pPromptDlg->exec(); + } + + if(g_pCurEmbData == NULL) + { + return; + } + + if(setFlag == 1) + { + writeFileLeftFrontPointDoubleHead(filePath,left,front); + g_pCurEmbData->setStartPositionDoubleHead(left,front); + + if(isSendPatternHead) + sendPatternHead(filePath);//发送花样ds16头文件 + + //流程复位 + if(allToReset) + g_pMachine->allToReset(); + } +} + +//定上料点 +void MainWidgetFunction::funSetFeedPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("set feeding point"));//定上料点 + + QString str; + str = tr("Whether to set the current point as the feeding point?");//是否将当前点设置为上料点? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->setFeedPos(); + } + } +} +//回上料点 +void MainWidgetFunction::funBackFeedPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back feed point"));//回上料点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoFeedPos(); + } + } +} + +// 回起针点 +void MainWidgetFunction::funBackStartPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + + m_pPromptDlg->setTitleStr(tr("Back start point"));//回起针点 + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoStartPos(); + } + } +} + +void MainWidgetFunction::funGotoFinish() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("goto Finish"));//回结束点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoFinish(); + } + } +} + +//定偏移点 +void MainWidgetFunction::funSetOffsetPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set offset point"));//定偏移点 + + QString str; + str = tr("Whether to set the current point as the offset point?");//是否将当前点设置为偏移点? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->setOffsetPos(); + } + } +} + +//回偏移点 +void MainWidgetFunction::funBackOffsetPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back offset point"));//回偏移点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoOffsetPos(); + } + } +} + +//边框检查 +void MainWidgetFunction::funBorderCheck() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Border check"));//边框检查 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if((m_mcStatus.workStatus & WORK_STA_BUSY) != 0) // 下位机在执行动作 + { + return; + } + + g_pMachine->checkFrame(); // 发给下位机,边框检查 + slotCalMachineProgress(CSV_00_CODE_4); + } +} + +//手动剪线 +void MainWidgetFunction::funManualTrim() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Trim"));//剪线 + QString str; + str = tr("The machine is about to cut the thread, please pay attention to safety!");//机器即将剪线,请注意安全! + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + //g_pMachine->sewCutThread(); + } + } +} + +//设置可工作区域 +void MainWidgetFunction::funSetWorkArea() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_WORK_AREA); + m_pPromptDlg->setTitleStr(tr("Setting workable area"));//设置可工作区域 + //int areaValue = m_pPromptDlg->getArea(); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + } + } +} + +//剪刀开合 +void MainWidgetFunction::funCutterOpenAndClose() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Lower cutter"));//下剪线 + QString str; + str = tr("The scissors are about to move, please pay attention to safety!");//剪刀即将动作,请注意安全! + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + } + } +} + +//空走边框 +void MainWidgetFunction::funSimulateFrame() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Simulate frame"));//空走边框 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if((m_mcStatus.workStatus & WORK_STA_BUSY) != 0) // 下位机在执行动作 + { + return; + } + + g_pMachine->simulateFrame(); // 发给下位机,空走边框 + } +} + +//流程复位 +void MainWidgetFunction::funProcessReset() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Process reset"));//流程复位 + + QString str; + str = tr("The machine is about to reset, please pay attention to safety!");//机器即将流程复位,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->allToReset(); + } + } +} + +//手动加油 +void MainWidgetFunction::funManualOil() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Manual oil"));//手动加油 + + QString str; + str = tr("The machine is about to oil!");//机器即将加油! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualOil(1); + } + slotCalMachineProgress(CSV_00_CODE_6); + } +} + +//梭盘计数复位 +void MainWidgetFunction::funShuttleChange() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Shuttle count reset"));//梭盘计数复位 + + QString str; + str = tr("The machine is about to change the shuttle automatically!");//机器即将自动换梭! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->shuttleCounter(); + } + } +} + +//框架归零 +void MainWidgetFunction::funGotoZeroPos() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Goto zero pos"));//框架归零 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoZeroPos(); + } + } +} + +//定工作范围 +void MainWidgetFunction::funSetWorkRange() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set work range"));//定工作范围 + + QString str; + str = tr("If automatically set work range?");//是否自动定工作范围? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + } + } +} + +void MainWidgetFunction::sendPatternHead(QString filePath) +{ + if(DATA_FORMATE == DATA_DS16) + { + //获取文件头并重新发送文件头 + DataDs16FileHead *pDs16Head = g_pCurEmbData->getDsDatHead(); + qDebug()<< "m_curFileID" <setFilePara(0, m_curFileID, (DataFilePara&)*pDs16Head); + } + else if(DATA_FORMATE == DATA_DS8) + { + QString ds8FilePath = filePath + ".ds8"; + QFile file(ds8FilePath); + + if(file.exists())//存在ds8文件 + { + if(!file.open(QIODevice::ReadOnly)) + { + qDebug() << "open file fail when read"; + return; + } + + QByteArray ary = file.readAll(); + DataDs16FileHead *pDs8Head = (DataDs16FileHead *)(ary.data()); + + DataDs16FileHead *pDs16Head = g_pCurEmbData->getDsDatHead(); + pDs8Head->anchorX = pDs16Head->anchorX; + pDs8Head->anchorY = pDs16Head->anchorY; + pDs8Head->beginX = pDs16Head->beginX; + pDs8Head->beginY = pDs16Head->beginY; + pDs8Head->beginR = pDs16Head->beginR; + //pDs8Head->combineMode = pDs16Head->combineMode; + pDs8Head->maxX = pDs16Head->maxX; + pDs8Head->maxY = pDs16Head->maxY; + pDs8Head->minX = pDs16Head->minX; + pDs8Head->minY = pDs16Head->minY; + + g_pMachine->setFilePara(0, m_curFileID, (DataFilePara&)*pDs8Head); + + file.close(); + } + else + { + QByteArray ds16dat = g_pCurEmbData->getDsDat();//获得ds16数据 + + QByteArray ds8dat; + ds8dat.clear(); + + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("data less then head size"); + return; + } + DataDs16FileHead * pDs16Head = (DataDs16FileHead *)(ds16dat.data()); + ds8dat.append((char*)pDs16Head,sizeof(DataDs16FileHead)); + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("ds16 dataBegin err"); + return; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return; + } + Ds16Item *pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + Ds16Item * dataPtr = pData; + + u8 ctrl,attr; + s16 dx,dy,dr; + Ds8Item ds8Item; + + for (int i = 0; i < stepsize; i++) + { + ctrl = dataPtr->ctrl; + attr = dataPtr->attr; + dx = dataPtr->dx; + dy = dataPtr->dy; + dr = dataPtr->dr; + + ds8Item.ctrl = ctrl; + ds8Item.attr = attr; + ds8Item.dx = dx; + ds8Item.dy = dy; + ds8Item.dr = dr; + + ds8dat.append((char*)&ds8Item,sizeof(Ds8Item)); + + dataPtr++; + } + + //发送ds8数据 + DataDs16FileHead * pDs8Head = (DataDs16FileHead *)(ds8dat.data()); + Ds8Item *tData = (Ds8Item *)(ds8dat.data() + sizeof(DataDs16FileHead)); + + //重新生成文件头 + pDs8Head->dataSize = pDs8Head->itemNums*sizeof(Ds8Item); // 数据字节数 + pDs8Head->bytesPerItem = sizeof(Ds8Item); // 每项占的字节数 + pDs8Head->dataChecksum = calcCheckSum32((u8 *)(tData) , pDs8Head->dataSize);; // 数据累加校验和 + pDs8Head->checkCrc = calcCrc16((u8 *)(pDs8Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + + g_pMachine->setFilePara(0, m_curFileID, (DataFilePara&)*pDs8Head); + } + } +} + +//选择花样后发送数据并显示大图 +void MainWidgetFunction::sendPatternData(QString filePath,int type) +{ + m_filePath = filePath; + + //保存最后一次绣作的花样路径到配置文件中 + if(g_pSettings != NULL) + { + g_pSettings->writeOneToIniFile("Pattern/name",filePath); + } + + if(DATA_FORMATE == DATA_DS16) + { + sendDs16PatternData(type);//发送ds16数据 + } + else if(DATA_FORMATE == DATA_DS8) + { + convertDs16ToDs8AndSend(filePath,type);//将ds16数据转换为ds8数据并发送 + } +} + +void MainWidgetFunction::funBottomDetect() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_BOTTOM); + m_pPromptDlg->setTitleStr(tr("Bottom line detection")); + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funFaceDetect() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_FACE); + m_pPromptDlg->setTitleStr(tr("Face line detection")); + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funExitRoot() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + g_emUser = operate; + m_pPromptDlg->setContentStr(tr("Exit successfully!"));//成功退出! + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funGetMCVersionInfo() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("System info")); + m_pPromptDlg->setContentInfoShow(); + + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funProductStatistics(QString tStyle,QString filePath,int patternBreakLineNum) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("Production statistics"));//生产统计 + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Production statistics"));//辅助功能 > 生产统计 + m_pSystemManageDlg->initDialog(); + + m_filePath = filePath; + QFileInfo file(m_filePath); + QString fileName = file.fileName(); + m_fileName = fileName; + addProductStatisInfo(patternBreakLineNum); + m_pSystemManageDlg->exec(PRODUCTSTATIS); +} + +//错误日志 +void MainWidgetFunction::slotJournalError() +{ + //m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("Error Log"));//错误日志 + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Error Log"));//辅助功能 > 错误日志 + m_pSystemManageDlg->initDialog(); + addJournalInfoError(); + //m_pSystemManageDlg->exec(JOURNALERROR);//显示窗体 +} + +//断线日志 +void MainWidgetFunction::slotJournalBreakage() +{ + //m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("Breakage Log"));//断线日志 + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Breakage Log"));//辅助功能 > 断线日志 + m_pSystemManageDlg->initDialog(); + addJournalInfoBreakage(); + //m_pSystemManageDlg->exec(JOURNALBREAKAGE);//显示窗体 +} + +void MainWidgetFunction::slotCsvChangeDebug() +{ + //m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("Debug Info"));//调试信息 + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr("Debug Info"));//辅助功能 > 调试信息 + m_pSystemManageDlg->initDialog(); + addJournalInfoDebug(); + //m_pSystemManageDlg->exec(JOURNALBREAKAGE);//显示窗体 +} + +//错误日志 +void MainWidgetFunction::funJournalError(QString tStyle) +{ + m_pSystemManageDlg->setTypeLogo(tStyle); + m_pSystemManageDlg->setMainTitle(tr("ErrorLog"));//错误日志 + m_pSystemManageDlg->setSubTitle(tr("Auxiliary Function") + " > " + tr(" ErrorLog"));//辅助功能 > 错误日志 + m_pSystemManageDlg->initDialog(); + addJournalInfoError(); + m_pSystemManageDlg->exec(JOURNAL);//显示窗体 +} + +void MainWidgetFunction::funDebugInfo() +{ + m_pDebugInfoDlg->initDialog(); + m_pDebugInfoDlg->addListInfo(); + m_pDebugInfoDlg->exec();//显示窗体 +} + +void MainWidgetFunction::funSoftwareAuthor() +{ + if (g_pMachine != NULL) + { + if(g_pMachine->isConnected() == 3) + { + g_pMachine->getInfoFromMachine(); + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("No connection")); + m_pPromptDlg->exec(); + return; + } + } + + // 设置板卡ID值的显示 + m_pPromptDlg->initDialog(PromptDialog::BTN_WARRANT); + m_pPromptDlg->setTitleStr(tr("Warrant")); + m_pPromptDlg->setContentWarrantShow(); + m_pPromptDlg->exec(); +} + +//报错信息 +int MainWidgetFunction::funErrorPrompt(QString info) +{ + int ret = 0; + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + //QString errInfo= errcode+info; + m_pPromptDlg->setContentStr(info); + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->cleanError(); + } + return ret; +} + +int MainWidgetFunction::funDetectBreakLineStatus() +{ + //断线状态 + QString allStr; + allStr.clear(); + QString headStr; + headStr.clear(); + + QString infoStr;//记录到csv的内容 + infoStr.clear(); + + int ret = 0; + if(g_pMachine != NULL) + { + ParaStruct mcParaValues; + mcParaValues = g_pMachine->getMcPara(); + } + g_pSettings->writeToCsv(infoStr,TYPE_BREAK);//保存到csv + + return ret; +} + +void MainWidgetFunction::funSetPromptDlgVisibleFalse() +{ + if(m_pPromptDlg->isVisible()) + { + m_pPromptDlg->done(1); + } +} + +//底线计数复位 +void MainWidgetFunction::funBottomLineCountReset() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("Is the bottom line count reset?")); //是否底线计数复位? + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->resetBobbinCounter(); // 底线计数复位 + } +} + +//手自动工作状态切换 0:手动 1:自动 +void MainWidgetFunction::funManualOrAutoSwitch(s16 val) +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt")); + if(val == 0) + { + m_pPromptDlg->setContentStr(tr("Are you sure to ManualSwitch?")); //是否手动工作状态切换? + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->setToManualWork(); + } + } + else if( val ==1) + { + m_pPromptDlg->setContentStr(tr("Are you sure to AutoSwitch?")); //是否自动工作状态切换? + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->setToAutoWork(); + } + } +} + +void MainWidgetFunction::slotCalMachineProgress(s16 csvCode,s16 type) +{ + int per = 0; + int ifPress = 0; + + for(int i = 1; i < m_csvFileStrList.size(); i++) + { + QStringList strlist = m_csvFileStrList[i].split(",", QString::SkipEmptyParts); //根据","分隔开每行的列 + if(strlist.size() > 0) + { + QString code = strlist.at(COLUMN_CODE); + QStringList strlist1 = code.split("_", QString::SkipEmptyParts); //根据"_"分隔开每行的列 + int infoCode = 0; + int csvType = 0; + if(strlist1.size() >= 2) + { + char *bufCode = strdup(strlist1[2].toLatin1().data()); + sscanf (bufCode, "%x", &infoCode); + + char *bufType = strdup(strlist1[1].toLatin1().data()); + sscanf (bufType, "%x", &csvType); + } + + if(infoCode == csvCode && type == csvType) + { + QStringList strlist2 = m_csvFileStrList[i].split(",", QString::SkipEmptyParts); //根据","分隔开每行的列 + if(COLUMN_PRESSNUM < strlist2.size()) + { + ifPress = strlist2.at(COLUMN_PRESSNUM).toInt()+1; + strlist2[COLUMN_PRESSNUM] = QString::number(ifPress); + QString str; + for(int m = 0; m < strlist2.size(); m++) + { + str.append(strlist2[m]); + if(m != strlist2.size() - 1) + { + str.append(","); + } + } + m_csvFileStrList[i] = str; + + //如果按钮没被点击过就加入百分比的计算 + if(ifPress == 1) + { + per += strlist2.at(COLUMN_SCORE).toInt(); + } + } + + m_getScore += per; + + if(per != 0) + { + if(m_totalScore == 0) + { + m_totalScore = 1; + } + + sendDataToGateway(csvCode,type); + } + + break; + } + } + } + + if(ifPress == 1) + { + QTextCodec * gbkCodec = QTextCodec::codecForName("GBK"); + + QByteArray array; + array.clear(); + for(int j = 0; j < m_csvFileStrList.size(); j++) + { + QString str = m_csvFileStrList[j]; + QByteArray ary; + if (gbkCodec != NULL) + { + ary = gbkCodec->fromUnicode(str); + } + else + { + ary = str.toLocal8Bit(); + } + + array.append(ary); + if(j != m_csvFileStrList.size() - 1) + { + array.append('\n'); + } + } + + QDir apppath(qApp->applicationDirPath()); + QString path = apppath.path() + apppath.separator() + CSV_PROGRESS; + QFile file(path); + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) + { + file.write(array); +#ifdef Q_OS_LINUX + system("sync"); +#endif + } + file.close(); + + QString iniPath = apppath.path() + apppath.separator() + "config.ini"; + QSettings setting(iniPath, QSettings::IniFormat); //QSettings能记录一些程序中的信息,下次再打开时可以读取出来 + setting.setValue("Progress/getScore",m_getScore); //记录路径到QSetting中保存 + + QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); + } +} + +//发送ds16花样数据 +void MainWidgetFunction::sendDs16PatternData(int type) +{ + QByteArray & ds16dat = g_pCurEmbData->getDsDat(); + + // ds16数据(转换的) + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("data less then head size"); + return; + } + DataDs16FileHead * pDs16Head = (DataDs16FileHead *)(ds16dat.data()); + + qDebug()<< __FUNCTION__ <<"fileid 2==========================="<fileid; + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("ds16 dataBegin err"); + return; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return; + } + Ds16Item *pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + +// int x = 0; +// int y = 0; +// for (int j = 0; j < stepsize; j++) +// { +// x += pData->dx; +// y += pData->dy; +// qDebug()<<"dx"<dx<<"dy"<dy; +// pData++; +// } +// qDebug()<<"x"<dx; + item.dy = pData->dy; + item.dr = pData->dr; + if(item.dx == 0 && item.dy == 0) + { + ds16dat.remove(0,sizeof(Ds16Item)); + pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + } +#endif + + //发送ds16数据 + m_curFileID++; + if ((m_curFileID & 0xffff) == 0) + { + m_curFileID = 1; + } + if(g_pMachine != NULL) + { + qDebug()<< "sendFileProc m_curFileID" << m_curFileID; + g_pMachine->sendFileProc(type, 0, m_curFileID, pDs16Head, (u8*)pData); + } +} + +//将ds16数据转换为ds8数据并发送 +void MainWidgetFunction::convertDs16ToDs8AndSend(QString filePath,int type) +{ + QByteArray ds16dat = g_pCurEmbData->getDsDat();//获得ds16数据 + + QByteArray ds8dat; + ds8dat.clear(); + + // ds16数据 + int size = ds16dat.size(); + if (size <= (int)sizeof(DataDs16FileHead)) + { + qDebug("data less then head size"); + return; + } + DataDs16FileHead * pDs16Head = (DataDs16FileHead *)(ds16dat.data()); + ds8dat.append((char*)pDs16Head,sizeof(DataDs16FileHead)); + + int datasize = size - sizeof(DataDs16FileHead); + if (datasize <= 0) + { + qDebug("ds16 dataBegin err"); + return; + } + int stepsize = datasize/sizeof(Ds16Item); + if (stepsize <= 0) + { + qDebug("ds16 data size err"); + return; + } + Ds16Item *pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead)); + Ds16Item * dataPtr = pData; + + u8 ctrl,attr; + s16 dx,dy,dr; + Ds8Item ds8Item; + + for (int i = 0; i < stepsize; i++) + { + ctrl = dataPtr->ctrl; + attr = dataPtr->attr; + dx = dataPtr->dx; + dy = dataPtr->dy; + dr = dataPtr->dr; + + ds8Item.ctrl = ctrl; + ds8Item.attr = attr; + ds8Item.dx = dx; + ds8Item.dy = dy; + ds8Item.dr = dr; + + ds8dat.append((char*)&ds8Item,sizeof(Ds8Item)); + + dataPtr++; + } + +#if(1) + //保存成ds8文件 + QString ds8FilePath = filePath + ".ds8"; + QFile file(ds8FilePath); + if(file.exists())//存在ds8文件 + { + QFile::remove(ds8FilePath); + } +#endif + + //发送ds8数据 + DataDs16FileHead * pDs8Head = (DataDs16FileHead *)(ds8dat.data()); + Ds8Item *tData = (Ds8Item *)(ds8dat.data() + sizeof(DataDs16FileHead)); + + //重新生成文件头 + pDs8Head->dataSize = pDs8Head->itemNums*sizeof(Ds8Item); // 数据字节数 + pDs8Head->bytesPerItem = sizeof(Ds8Item); // 每项占的字节数 + pDs8Head->dataChecksum = calcCheckSum32((u8 *)(tData) , pDs8Head->dataSize);; // 数据累加校验和 + pDs8Head->checkCrc = calcCrc16((u8 *)(pDs8Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + + m_curFileID++; + if ((m_curFileID & 0xffff) == 0) + { + m_curFileID = 1; + } + g_pMachine->sendFileProc(type, 0, m_curFileID, pDs8Head, (u8*)tData); + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << filePath; + return; + } + else + { + file.write(ds8dat); + file.close(); + } +} + +void MainWidgetFunction::addProductStatisInfo(int patternBreakLineNum) +{ + //刷新生产统计信息 + m_pSystemManageDlg->initDialog(); + + QString itemStr = tr("Total number of patterns processed: ") + QString::number(m_mcStatus.outCounter);//总共加工花样数量: + m_pSystemManageDlg->addItem(itemStr); + itemStr = tr("Total number of embroidery: ") + QString::number(m_mcStatus.needleNum);//总刺绣针数: + m_pSystemManageDlg->addItem(itemStr); + + itemStr = tr("Pattern name: ") + m_fileName;//花样名称: + m_pSystemManageDlg->addItem(itemStr); + + itemStr = tr("Pattern break line num: ") + QString::number(patternBreakLineNum);//花样断线次数: + m_pSystemManageDlg->addItem(itemStr); + + ParaStruct mcParaValues; + mcParaValues = g_pMachine->getMcPara(); + int needleBreakNum = 0; + //机头断线次数: + itemStr = tr("Head ") + QString::number(1) + tr(" break line num: ") + QString::number(needleBreakNum);// 机头断线次数: + m_pSystemManageDlg->addItem(itemStr); +} + +void MainWidgetFunction::addJournalInfoError() +{ + //刷新信息 + m_pSystemManageDlg->initDialog(); + m_pSystemManageDlg->addListError();//读取csv列表 +} + +void MainWidgetFunction::addJournalInfoBreakage() +{ + //刷新信息 + m_pSystemManageDlg->initDialog(); + m_pSystemManageDlg->addListBreakage();//读取csv列表 +} + +void MainWidgetFunction::addJournalInfoDebug() +{ + //刷新信息 + m_pSystemManageDlg->initDialog(); + m_pSystemManageDlg->addListDebug();//读取csv列表 +} + +QString MainWidgetFunction::getCompileDateTime() +{ + const char *pMonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + const char *date = __DATE__; // "mm dd yyyy" 例如: "Oct 31 2025" + const char *time = __TIME__; // "hh:mm:ss" 例如: "08:30:45" + + int month = 0, year = 0, day = 0; + int hour = 0, minute = 0, second = 0; + + // 解析月份 + for (int i = 0; i < 12; i++) { + if (memcmp(date, pMonth[i], 3) == 0) { + month = i + 1; // 1~12 + break; + } + } + + // 解析日期 + day = atoi(date + 4); // 日期从第4个字符开始,如 " 31" + year = atoi(date + 9); // 年份从第9个字符开始,如 "25" + + // 解析时间 + hour = atoi(time + 0); // 小时: "hh" + minute = atoi(time + 3); // 分钟: "mm" + second = atoi(time + 6); // 秒: "ss" + + // 格式化输出:你可以根据需要调整格式 + QString str; + str.sprintf("%02d%02d%02d.%02d%02d%02d", year, month, day, hour, minute, second); + // 输出示例: 251031.083045 + + return str; +} + +//组成json键值对 +QString MainWidgetFunction::compositionJson(QString key, QString value) +{ + QString mStr="\"";//引号的字符串 + QString str = mStr + key + mStr + ":" + mStr + value + mStr + ","; + return str; +} + +HMILotData MainWidgetFunction::getHMILotData() +{ + HMILotData lotFata; + memset(&lotFata, 0, sizeof(HMILotData)); + + memcpy(lotFata.HMIVerStr, getVersionStr().data(), getVersionStr().length()); // 版本信息 + memcpy(lotFata.fileName, m_fileName.data(), m_fileName.length()); // 文件名称 + + u32 rackNum = g_pSettings->readFromIniFile("IOT/rackNumber").toInt();//机架号 + lotFata.machineNumber = rackNum; // 机架号 + + QString deliveryTime = g_pSettings->readFromIniFile("IOT/deliveryTime").toString();//工厂预计交货时间 + QByteArray arr = deliveryTime.toLocal8Bit(); + memcpy(lotFata.deliveryTime, arr.data(), arr.size()); //交货日期 + + u16 debugProgress = g_pSettings->readFromIniFile("IOT/debugProgress").toInt();//调试进度 + lotFata.debugProgress = debugProgress; //调试进度 + + //电机总数-先固定写为4个,如果后续变动较大,可把电机个数写为全局变量或从其他cpp中传参 + lotFata.motorNum = 4; + + return lotFata; +} + +//发送数据到物联网 +void MainWidgetFunction::sendDataToGateway(s16 code,s16 type) +{ + QString mStr="\"";//引号的字符串 + + QString mcType = mStr+U00016+mStr+":"+mStr+"Emb"+mStr+","; + + QString mcStr1; + mcStr1.clear(); + QString mcStr2; + mcStr2.clear(); + mcStr1 = mStr+"Towel"+mStr+":0,"; + mcStr2 = mStr+"Coil"+mStr+":0,"; + s16 towel = g_pSettings->readFromIniFile("HMI/towel").toInt();//是否有毛巾功能 + s16 coil = g_pSettings->readFromIniFile("HMI/coil").toInt();//是否有缠绕功能 + if(towel == 1) + { + mcStr1 = mStr+"Towel"+mStr+":1,"; + } + if(coil == 1) + { + mcStr2 = mStr+"Coil"+mStr+":1,"; + } + + QString sensorMotorStr; + sensorMotorStr.clear(); + + sensorMotorStr = mStr+S00000+mStr+":1,"+mStr+S00010+mStr+":1,"+mStr+S00070+mStr+":1,"+mStr+S01000+mStr+":1,"; + + if(type == 0) + { + switch (code) + { + case CSV_00_CODE_1: + sensorMotorStr += mStr+S00020+mStr+":1,"; + sensorMotorStr += mStr+M0003+mStr+":1,"; + break; + case CSV_00_CODE_4://边框检查 + case CSV_00_CODE_8://自动定软限位 + sensorMotorStr += mStr+S00200+mStr+":1,"; + sensorMotorStr += mStr+S00201+mStr+":1,"; + sensorMotorStr += mStr+S00220+mStr+":1,"; + sensorMotorStr += mStr+S00221+mStr+":1,"; + sensorMotorStr += mStr+S00230+mStr+":1,"; + sensorMotorStr += mStr+S00231+mStr+":1,"; + sensorMotorStr += mStr+M0001+mStr+":1,"; + sensorMotorStr += mStr+M0002+mStr+":1,"; + break; + case CSV_00_CODE_5: + sensorMotorStr += mStr+M0004+mStr+":1,"; + break; + default: + break; + } + } + else if(type == CSV_MC_TYPE_02) + { + switch (code) + { + case CSV_02_CODE_1://毛巾M轴零位 + sensorMotorStr += mStr+S01020+mStr+":1,"; + sensorMotorStr += mStr+M0005+mStr+":1,"; + sensorMotorStr += mStr+M0006+mStr+":1,"; + break; + case CSV_02_CODE_2://毛巾打环轴归零 + sensorMotorStr += mStr+S01021+mStr+":1,"; + sensorMotorStr += mStr+M0007+mStr+":1,"; + break; + default: + break; + } + } + else if(type == CSV_MC_TYPE_03) + { + switch (code) + { + case CSV_03_CODE_1://缠绕压脚电机归零 + sensorMotorStr += mStr+M0008+mStr+":1,"; + sensorMotorStr += mStr+M0009+mStr+":1,"; + sensorMotorStr += mStr+M0010+mStr+":1,"; + break; + case CSV_03_CODE_2://缠绕锯齿电机归零 + sensorMotorStr += mStr+M0011+mStr+":1,"; + break; + default: + break; + } + } + + int val = ((double)m_getScore / (double)m_totalScore) * 100; + //emit siShowPercentage(val);//测试物联网用 + + QString timeStr; + timeStr.clear(); + +#ifdef Q_OS_LINUX + timeStr = QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch() - 28800000);//mcgs下时间差8个小时 +#endif + +#ifdef Q_OS_WIN + timeStr = QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()); +#endif + + QString lotStr; + lotStr.clear(); + lotStr = "{" + mStr + QString::number(m_HMILotData.machineNumber) + "#" + mStr + ":[{" + + mStr + "ts" + mStr + ":" + timeStr + "," + + mStr + "values" + mStr + ":{\"RackNumber\":\"" + QString::number(m_HMILotData.machineNumber) + "#\"" + "," + + mcType + mcStr1 + mcStr2 + sensorMotorStr; + + QString keyStr = compositionJson(U00001, QString::number(val)); + lotStr += keyStr; + lotStr.chop(1); + + lotStr += "}}]}"; + //qDebug()<sendLotDataToGateway(lotStr); +} + +void MainWidgetFunction::setErrorCodeAndStateList(QList list) +{ + m_errorCodeAndStateItemList.clear(); + m_errorCodeAndStateItemList.append(list); +} + +//上电计算 关机时间 并发送给主控 +void MainWidgetFunction::setShutDownTime() +{ + int oldSecond = g_pSettings->readFromIniFile("DateTime/second").toInt();//上次上电的系统时间 + + QDateTime dateTime = QDateTime::currentDateTime(); //当前时间 + int curSecond = dateTime.toTime_t();//单位为秒 //新的时间 + int diff = curSecond - oldSecond;//关机秒数 + if (diff >= 0) + { + } + else//小于0 + { + diff = 5000*3600; + } + qDebug()<<"shutdown second"<setShutDownTime(0, diff);//可能这个diff太大了 + } +} +//设置机器状态 +void MainWidgetFunction::setMcStates(MCStatus mcStatus) +{ + memset((char*)&m_mcStatus,0,sizeof(MCStatus)); + memcpy((char*)&m_mcStatus,(char*)&mcStatus,sizeof(MCStatus)); +} + +QString MainWidgetFunction::getVersionStr() +{ + QString str; + if(g_emMacType == MACHINE_CUTTINGWALK + || g_emMacType == MACHINE_GLASSFIBRE) + { + str.sprintf("GOA-CUT-V%s",VERSIONNO); + } + else + { + str.sprintf("GOA-QUI-V%s",VERSIONNO); + } + return str; +} + +//将定位点或起绣点写回到文件中 +void MainWidgetFunction::writePonitToFile(QString filePath,int x, int y, int flag) +{ + QFileInfo fileInfo(filePath); + QString suffix = fileInfo.suffix().toUpper();//后缀大写 + + if(suffix == "DST") + { + DataFileDst dst; + dst.initFile(filePath); + dst.loadFile(); + dst.writePointToFile(x,y,flag); + } + else if(suffix == "DSR") + { + DataFileDsr dsr; + dsr.initFile(filePath); + dsr.loadFile(); + dsr.writePointToFile(x,y,flag); + } + else if(suffix == "QUI") + { + } + else if(suffix == "QUIX") + { + } + else if(suffix == "PLT") + { + } + else if(suffix == "DXF") + { + } +} + +void MainWidgetFunction::writeFilePoint(QString filePath, int curX, int curY) +{ + QFileInfo fileInfo(filePath); + QString suffix = fileInfo.suffix().toUpper();//后缀大写 + + if(suffix == "DST") + { + if(g_pCurEmbData == NULL) + { + return; + } + DataFileDst dst; + dst.initFile(filePath); + dst.loadFile(); + DstHead *head = dst.getDstHead(); + if(head == NULL) + { + return; + } + int left = head->left; + int front = head->front; + //旧的起始点坐标 + int oldStartX = g_pCurEmbData->getBeginX(); + int oldStartY = g_pCurEmbData->getBeginY(); + int cx = curX - oldStartX; + int cy = curY - oldStartY; + left += cx; + front += cy; + dst.writeFileLL(left,front); + dst.writeStartPointToFile(curX,curY); + } + else if(suffix == "DSR") + { + if(g_pCurEmbData == NULL) + { + return; + } + DataFileDsr dsr; + dsr.initFile(filePath); + dsr.loadFile(); + DsrHead *head = dsr.getDsrHead(); + if(head == NULL) + { + return; + } + int left = head->left; + int front = head->front; + //旧的起始点坐标 + int oldStartX = g_pCurEmbData->getBeginX(); + int oldStartY = g_pCurEmbData->getBeginY(); + int cx = curX - oldStartX; + int cy = curY - oldStartY; + left += cx; + front += cy; + dsr.writeFileLL(left,front); + dsr.writeStartPointToFile(curX,curY); + } + else if(suffix == "QUI") + { + if(g_pCurEmbData == NULL) + { + return; + } + DataFileQui qui; + qui.initFile(filePath); + qui.loadFile(); + QuiFileHead *head = qui.getQuiHead(); + if(head == NULL) + { + return; + } + int left = head->left*100;//因为存储时除以100了,所以这里乘以100 + int front = head->front*100; + //旧的起始点坐标 + int oldStartX = g_pCurEmbData->getBeginX(); + int oldStartY = g_pCurEmbData->getBeginY(); + int cx = curX - oldStartX; + int cy = curY - oldStartY; + left += cx; + front += cy; + qui.writeFileLL(left, front, curX, curY); + } + else if(suffix == "QUIX") + { + if(g_pCurEmbData == NULL) + { + return; + } + DataFileQuix quix; + quix.initFile(filePath); + quix.loadFile(); + QuixFileHead *head = quix.getQuixHead(); + if(head == NULL) + { + return; + } + int left = head->left*10; + int front = head->front*10; + //旧的起始点坐标 + int oldStartX = g_pCurEmbData->getBeginX(); + int oldStartY = g_pCurEmbData->getBeginY(); + int cx = curX - oldStartX; + int cy = curY - oldStartY; + left += cx; + front += cy; + quix.writeFileLL(left,front,curX,curY); + } + else if(suffix == "PLT") + { + } + else if(suffix == "DXF") + { + } +} + +void MainWidgetFunction::writeFileLeftFrontPoint(QString filePath, int &x, int &y, int left, int front) +{ + QFileInfo fileInfo(filePath); + QString suffix = fileInfo.suffix().toUpper();//后缀大写 + + if(suffix == "DST") + { + DataFileDst dst(filePath); + x = left + dst.getFirstPoint().x(); + y = front + dst.getFirstPoint().y(); + dst.writeFileLL(left,front); + dst.writeStartPointToFile(x,y); + } + else if(suffix == "DSR") + { + DataFileDsr dsr(filePath); + x = left + dsr.getFirstPoint().x(); + y = front + dsr.getFirstPoint().y(); + dsr.writeFileLL(left,front); + dsr.writeStartPointToFile(x,y); + } + else if(suffix == "QUI") + { + DataFileQui qui(filePath); + + //第一点坐标 + int firstAX = qui.getFirstPoint().x(); + int firstAY = qui.getFirstPoint().y(); + int minX = qui.getMinX(); + int minY = qui.getMinY(); + x = left + (firstAX - minX); + y = front + (firstAY - minY); + qui.writeFileLL(left,front,x,y); + } + else if(suffix == "QUIX") + { + DataFileQuix quix(filePath); + + //第一点坐标 + int firstAX = quix.getFirstPoint().x(); + int firstAY = quix.getFirstPoint().y(); + int minX = quix.getMinX(); + int minY = quix.getMinY(); +// int maxX = quix.getMaxX(); +// int maxY = quix.getMaxY(); + x = left + (firstAX - minX); + y = front + (firstAY - minY); + + quix.writeFileLL(left,front,x,y); + } + else if(suffix == "PLT") + { + } + else if(suffix == "DXF") + { + } +} + +void MainWidgetFunction::writeFileLeftFrontPointDoubleHead(QString filePath,int left,int front) +{ + QFileInfo fileInfo(filePath); + QString suffix = fileInfo.suffix().toUpper();//后缀大写 + + if(suffix == "QUIX") + { + DataFileQuix quix; + + //将左边前边写入数据区 + quix.writeLeftFrontToFileDoubleHead(filePath,left,front); + } +} + +//机器信息改变 +void MainWidgetFunction::slotMCInfoChange() +{ + static int fID = 0; + m_mcStatus = g_pMachine->getMcStatus(); + + //可使用时长 + int workTime = m_mcStatus.workableTimer; + if( workTime > 0 && workTime < INT_MAX ) + { + QString strTime; + QString strDay; + QString strHour; + QString strSec; + + int day = workTime/(60 *24); + + //使用时长不足5天就主动提示用户 + if(day < 5 && fID == 0) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + + strDay = QString::number(workTime/(60 *24) , 10); + strHour = QString::number((workTime%(60 *24))/60 , 10) ; + strSec = QString::number(workTime%60 , 10); + + strTime = strDay + " " + tr("Day") + " " + strHour + " " + tr("Hour") + " " + strSec + " " + tr("Minutes") ; // 天 小时 分钟 + + //机器剩余可用时间为 + str = tr("The remaining available time of the machine is ") + strTime; + + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + //开启一个定时器,隔4个小时就发一次查询机器状态 + m_pTipsTimer->start(); + fID++; + } + } +} + +//给主控发查询机器信息 +void MainWidgetFunction::onTipsTimer() +{ + if (g_pMachine != NULL) + { + g_pMachine->getInfoFromMachine(); + } + m_pTipsTimer->stop(); //关定时器 +} + +void MainWidgetFunction::slotSetDynamicIP(QString ssid) +{ + if(ssid.length() <= 0) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("ssid is empty!"));//ssid为空! + m_pPromptDlg->exec(); + return; + } + + WordsInputDialog wordInputDlg; + wordInputDlg.wifiClean(); + wordInputDlg.setTitleStr(tr("Password input"));//密码输入 + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { +#ifdef Q_OS_LINUX + QString psd = wordInputDlg.getInputStr(); + //base64解密 + //向配置文件写入加密结果,设置动态IP + QString iniPath = WIFIINIPATH; + QSettings setting(iniPath,QSettings::IniFormat); + setting.beginGroup("WIFI"); + setting.setValue("default_passwd",psd.toLatin1().toBase64()); + setting.setValue("default_ssid",ssid.toLatin1().toBase64()); + setting.setValue("static_ip",""); + setting.setValue("static_mask",""); + setting.setValue("static_mode","false"); + setting.endGroup(); + + system("sync"); + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Settings require screen restart to take effect!");//设置需要重启屏幕才生效! + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + system("reboot"); + } +#endif + } +} + +void MainWidgetFunction::slotSetStaticIP(QString ssid, QString psd,QString dnip) +{ + if(ssid.length() <= 0) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("ssid is empty!"));//ssid为空! + m_pPromptDlg->exec(); + return; + } + if(psd.length() <= 0){}//为了去掉编译警告 + + PassWordDialog passWordDlg; + QString ip; + ip.clear(); + passWordDlg.setTitleStr(tr("IP input"),-1);//IP输入 + passWordDlg.setShowIfVisible(true); + passWordDlg.setIpStr(dnip); + int rslt = passWordDlg.exec(); + if(rslt == 1) + { + ip = passWordDlg.getInputStr(); + } + +#ifdef Q_OS_LINUX + if(ip.length() <= 0) + { + return; + } + + //base64解密 + //向配置文件写入加密结果,设置静态IP + QString iniPath = WIFIINIPATH; + QSettings setting(iniPath,QSettings::IniFormat); + setting.beginGroup("WIFI"); + setting.setValue("default_passwd",psd.toLatin1().toBase64()); + setting.setValue("default_ssid",ssid.toLatin1().toBase64()); + setting.setValue("static_ip",ip); + setting.setValue("static_mask","255.255.255.0"); + setting.setValue("static_mode","true"); + setting.endGroup(); + + system("sync"); + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Settings require screen restart to take effect!");//设置需要重启屏幕才生效! + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + system("reboot"); + } + return; + +#endif +} + +void MainWidgetFunction::slotSpindleAction(int action) +{ + if(g_pMachine != NULL) + { + g_pMachine->motoMove(MT_LM, action, 0); + } +} + +void MainWidgetFunction::slotSpindleRotate(int angle) +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->manualAction(MS_TO_ANGLE,angle); + } + else + { + g_pMachine->manualAction(MT_LM,angle); + } + } +} + +void MainWidgetFunction::slotRotateRotate(int angle) +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->manualAction(ROT_TO_ANGLE,angle); + } + else + { + g_pMachine->manualAction(MT_LRR,angle); + } + } +} + +void MainWidgetFunction::slotAutoPull(int length) +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->manualAction(AUTO_PULL,length); + } + } +} + +void MainWidgetFunction::slotSpindleResearch(int spindleTime , int spindleSpeed) +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->manualAction(WIRE_MS_RUN,spindleTime,spindleSpeed); + } + } +} + +void MainWidgetFunction::slotReceiveLotData() +{ + static int nID = 0; + + //因为串口模式打开串口成功在连接的信号和槽之前,所以写以下代码表示刚建立连接就向网关发送连接符 + //网口连接方式不会有此问题,串口转wifi又不能检测wifi断开,所以每次都发送连接符 + QString mStr="\"";//引号的字符串 + QString lotStr; + lotStr.clear(); +#if 0 + if(nID % 2 == 0)//为了让两条间隔分开,用取余做判断,否则网关收到键值对错误 + { + lotStr += "{" + mStr + "device" + mStr + ":" + mStr + QString::number(m_HMILotData.machineNumber) + "#" + mStr + "}"; + //如果物联网Machine 不是空 + if(g_pLotMachine != NULL) + { + //相当于Machine给主板发数据 + g_pLotMachine->sendLotDataToGateway(lotStr);//发送物联数据(机器编号)到网关 + } + nID++; + return; + } +#endif + + //emit siReceiveLotDat(); //测试物联网用 + //qDebug()<<"slotReceiveLotData"; //测试物联网用 + + McLotData nMcLotData = g_pMachine->getMcLotData();//得到下位机的物联网数据 + HMILotData nHMILotData = getHMILotData(); //得到界面要发给网关的物联网数据 + + QString timeStr; + timeStr.clear(); + +#ifdef Q_OS_LINUX + timeStr = QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch() - 28800000);//mcgs下时间差8个小时 +#endif + +#ifdef Q_OS_WIN + timeStr = QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()); +#endif + + lotStr.clear(); + lotStr = "{" + mStr + QString::number(m_HMILotData.machineNumber) + + mStr + ":[{" + + mStr + "ts" + mStr + ":" + timeStr + "," + + mStr + "values" + mStr + ":{\"RackNumber\":\"" + + QString::number(m_HMILotData.machineNumber) + "\"" + ","; + + QString keyStr; + keyStr.clear(); + + if(g_pLotMachine != NULL) + { + if(nID == 0) + { + keyStr = compositionJson(U00033, S0504); + } + else + { + if ((m_mcStatus.workStatus & WORK_STA_BUSY) != 0) // 下位机在执行动作 + { + keyStr = compositionJson(U00033, S0505); + } + else + { + keyStr = compositionJson(U00033, S0504); + } + } + lotStr += keyStr; + + //机器版本 + // 界面上存的下位机数据 下位机里的数据 + if(memcmp(&m_mcLotData.mBoardVerStr, &nMcLotData.mBoardVerStr, sizeof(nMcLotData.mBoardVerStr)) != 0) + { + keyStr = compositionJson(U00022, QString::fromLocal8Bit(nMcLotData.mBoardVerStr)); + lotStr += keyStr; + } + + //报警信息 + // 界面上存的下位机数据 不等于 下位机里的数据 + //这种情况应该就是主控里的数据和界面上存的不一样了 + if(m_mcLotData.errorCode != nMcLotData.errorCode) + { + if ((nMcLotData.errorCode > 0 && nMcLotData.errorCode < 0x100) || nMcLotData.errorCode > 0x200) + { + QString info; + info.clear(); + info = getErrStr(nMcLotData.errorCode); + //如果不是通用错误(即info为空),就从机型cpp中的错误代码查找 + if(info.length() <= 0) + { + for(int i = 0; i < m_errorCodeAndStateItemList.size(); i++) + { + if(nMcLotData.errorCode == m_errorCodeAndStateItemList[i].m_code) + { + info = m_errorCodeAndStateItemList[i].m_name; + break; + } + } + } + //如果不是通用错误也不是机型cpp中的错误代码,就显示未定义错误 + if(info.length() <= 0) + { + QString errorCode; + errorCode.sprintf("CODE 0x%x", nMcLotData.errorCode); + info.append(tr("Undefined error,") + errorCode);//未定义错误, + } + + keyStr = compositionJson(U00023, QString::number(nMcLotData.errorCode));// 原来为info,lxs修改 + lotStr += keyStr; + } + } + + //授权剩余时间(min) + if(m_mcLotData.workableTimer != nMcLotData.workableTimer) + { + keyStr = compositionJson(U00025, QString::number(nMcLotData.workableTimer)); + lotStr += keyStr; + } + + //开机时间(min) + if(m_mcLotData.bootTimer != nMcLotData.bootTimer) + { + keyStr = compositionJson(U00026, QString::number(nMcLotData.bootTimer)); + lotStr += keyStr; + } + + //工作时间(min) + if(m_mcLotData.workTimer != nMcLotData.workTimer) + { + keyStr = compositionJson(U00027, QString::number(nMcLotData.workTimer)); + lotStr += keyStr; + } + + //工作转速 + if(m_mcLotData.workRpm != nMcLotData.workRpm) + { + keyStr = compositionJson(U00004, QString::number(nMcLotData.workRpm)); + lotStr += keyStr; + } + + //当前产量 + keyStr = compositionJson(U00028, QString::number(m_mcStatus.outCounter)); + lotStr += keyStr; + + //累计产量 + if(m_mcLotData.totalOutCounter != nMcLotData.totalOutCounter) + { + keyStr = compositionJson(U00014, QString::number(nMcLotData.totalOutCounter)); + lotStr += keyStr; + } + + //产量设定 + if(m_mcLotData.expectedOutput != nMcLotData.expectedOutput) + { + keyStr = compositionJson(U00029, QString::number(nMcLotData.expectedOutput)); + lotStr += keyStr; + } + + //设备(机器)ID + if(memcmp(&m_mcLotData.boardId, &nMcLotData.boardId, sizeof(nMcLotData.boardId)) != 0) + { + keyStr = compositionJson(U00017, QString::fromLocal8Bit(nMcLotData.boardId)); + lotStr += keyStr; + } + + //主轴零位 + if(m_mcLotData.spindleZeroSta != nMcLotData.spindleZeroSta) + { + keyStr = compositionJson(U00034, QString::number(nMcLotData.spindleZeroSta)); + lotStr += keyStr; + } + + //主轴角度 + if(m_mcLotData.spindleAngle != nMcLotData.spindleAngle) + { + keyStr = compositionJson(U00035, QString::number(nMcLotData.spindleAngle)); + lotStr += keyStr; + } + + //电机1坐标(绣框X坐标) + if(m_mcLotData.motosPos[1] != nMcLotData.motosPos[1]) + { + keyStr = compositionJson(U00036, QString::number(nMcLotData.motosPos[1])); + lotStr += keyStr; + } + + //电机2坐标(绣框Y坐标) + if(m_mcLotData.motosPos[2] != nMcLotData.motosPos[2]) + { + keyStr = compositionJson(U00037, QString::number(nMcLotData.motosPos[2])); + lotStr += keyStr; + } + + //8对应m_mcLotData.sensorSignal的数量 + s16 sensorNum = 0; + for(int i = 0; i < 8; i++) + { + for(int j = 0; j < 32; j++)//一个u32是32位 + { + if(((m_mcLotData.sensorSignal[i] >> j) & 1) != ((nMcLotData.sensorSignal[i] >> j) & 1)) + { + QString sensorName; + sensorName.clear(); + switch (i*32+j) + { + case 0:sensorName = U00038;break;//启动按钮1 + case 1:sensorName = U00039;break;//暂停按钮1 + case 2:sensorName = U00040;break;//点动按钮1 + case 3:sensorName = U00041;break;//主框架X零位 + case 4:sensorName = U00042;break;//主框架Y零位 + case 5:sensorName = U00043;break;//主框架X负限位 + case 6:sensorName = U00044;break;//主框架Y负限位 + case 7:sensorName = U00045;break;//主框架X正限位 + case 8:sensorName = U00046;break;//主框架Y正限位 + case 9:sensorName = U00047;break;//剪刀回位 + default:sensorName.clear();break; + } + + if(sensorName.length() > 0) + { + keyStr = compositionJson(sensorName, QString::number((nMcLotData.sensorSignal[i] >> j) & 1)); + lotStr += keyStr; + sensorNum++; + } + } + } + } + //传感器总数 +// keyStr = compositionJson(U000103, QString::number(nMcLotData.sensonNumbers));//原为Qstring::number(sensorNum) +// lotStr += keyStr; + + // 机器配置 + // if(m_mcLotData.machinecfg != nMcLotData.machinecfg) + // { + + // keyStr = compositionJson(U000120, QString::number((nMcLotData.machinecfg >> 0) & 1)+ "#");//勾线模式 + // lotStr += keyStr; + + // keyStr = compositionJson(U000121, QString::number((nMcLotData.machinecfg >>1) & 1)+ "#");//锁头模式 + // lotStr += keyStr; + + // } + + // 缝纫机头个数 + if(m_mcLotData.sewHeadNumbers != nMcLotData.sewHeadNumbers) + { + keyStr = compositionJson(U000122, QString::number(nMcLotData.sewHeadNumbers)+ "#"); + lotStr += keyStr; + } + + // 绣花机头个数 + if(m_mcLotData.embHeadNumbers != nMcLotData.embHeadNumbers) + { + keyStr = compositionJson(U000123, QString::number(nMcLotData.embHeadNumbers)); + lotStr += keyStr; + } + + //绣花机针个数 + if(m_mcLotData.embneedleNumbers != nMcLotData.embneedleNumbers) + { + keyStr = compositionJson(U000124, QString::number(nMcLotData.embneedleNumbers)); + lotStr += keyStr; + } + //冲孔机头个数 + if(m_mcLotData.punchHeadNumbers != nMcLotData.punchHeadNumbers) + { + keyStr = compositionJson(U000125, QString::number(nMcLotData.punchHeadNumbers)); + lotStr += keyStr; + } + //冲孔机针个数 + if(m_mcLotData.punchneedleNumbers != nMcLotData.punchneedleNumbers) + { + keyStr = compositionJson(U000126, QString::number(nMcLotData.punchneedleNumbers)); + lotStr += keyStr; + } + + //界面版本 + //memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值 + if(memcmp(&m_HMILotData.HMIVerStr, &nHMILotData.HMIVerStr, sizeof(nHMILotData.HMIVerStr)) != 0) + { + keyStr = compositionJson(U00030, QString::fromLocal8Bit(nHMILotData.HMIVerStr)); + lotStr += keyStr; + } + + //机架号 + if(m_HMILotData.machineNumber != nHMILotData.machineNumber) + { + keyStr = compositionJson(U00018, QString::number(nHMILotData.machineNumber) + "#"); + lotStr += keyStr; + } + + //电机总数 + //界面上存的电机数 不等于 界面上存的电机数 的时候就往下发数据 + if(m_HMILotData.motorNum != nHMILotData.motorNum) + { + keyStr = compositionJson(U000102, QString::number(nHMILotData.motorNum)); + lotStr += keyStr; + } + //调试进度 + if(m_HMILotData.debugProgress != nHMILotData.debugProgress) + { + keyStr = compositionJson(U000119, QString::number(nHMILotData.debugProgress)); + lotStr += keyStr; + } + + //交付日期 + if(memcmp(&m_HMILotData.deliveryTime, &nHMILotData.deliveryTime, sizeof(nHMILotData.deliveryTime)) != 0) + { + keyStr = compositionJson(U000118, QString::fromLocal8Bit(nHMILotData.deliveryTime)); + lotStr += keyStr; + } + // workProgress = ; + // //机器工作进度 -rq + // if(m_HMILotData.workProgress != nHMILotData.workProgress) + // { + // keyStr = compositionJson(U000118, QString::numbert(nHMILotData.workProgress)); + // lotStr += keyStr; + // } +#if(0) + //当前加工文件名称 + if(memcmp(&m_HMILotData.fileName, &nHMILotData.fileName, sizeof(nHMILotData.fileName)) != 0) + { + keyStr = compositionJson(U00031, QString::fromLocal8Bit(nHMILotData.fileName)); + lotStr += keyStr; + } +#endif + + if(lotStr.at(lotStr.length()-1) == ',')//去除最后一个逗号 + { + lotStr.chop(1); //删除字符串右边n个字符 + } + lotStr += "}}]}"; +// qDebug()<< "g_pLotMachine->sendLotDataToGateway:" <sendLotDataToGateway(lotStr); + } + + m_mcLotData = nMcLotData; + m_HMILotData = nHMILotData; + nID++; + +} + +//执行网关数据动作 +void MainWidgetFunction::slotRunLotDataAction(QString str) +{ + int cmd = str.toInt(); + if(cmd == 1)//点动 + { + funSpindleJog(); + } + else if(cmd == 2)//剪线 + { + funManualTrim(); + } +} + +void MainWidgetFunction::slotTransProgress(u8 fileType, int send, int total) +{ + int csend = 0; + int ctotal = 0; + + if(fileType == FILE_TYPE_PGM)//主控升级文件 + { + csend += g_pMachine->getTotalSendNum(); + ctotal += g_pMachine->getTotalPacketNum(); + + if (csend < 0 && ctotal < 0) + { + // 失败 + m_pPromptDlg->initDialog(PromptDialog::BTN_UCANCEL); + m_pPromptDlg->setTitleStr(tr("MCUpgrade"));//主控升级 + //m_pPromptDlg->setButtonUCancelStr(tr("Close"));//关闭 + m_pPromptDlg->setContentProcessStr(tr("Failed to upgrade the main control system!")); //主控系统升级失败! + } + else if (csend == 0 && ctotal == 0) + { + // 成功 + m_pPromptDlg->initDialog(PromptDialog::BTN_RESTART); + m_pPromptDlg->setTitleStr(tr("MCUpgrade"));//主控升级 + m_pPromptDlg->setContentProcessStr(tr("The main control system has been successed, waiting until machine restart")); + int seconds = 10;//界面重启时间改成10秒 + for(int i = 0; i < seconds; i++) + { + QString str = QString(tr("System will restart %1 s later")).arg(seconds-i);//系统将在 %1 秒后重启 + m_pPromptDlg->setContentProcessStr(str); + g_pMachine->sleep(1); + } + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + + m_pPromptDlg->hide(); + } + else if(csend >= 0 && csend <= ctotal) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_UCANCEL); + m_pPromptDlg->setTitleStr(tr("MCUpgrade"));//主控升级 + m_pPromptDlg->setContentProcessStr(tr("Main control system is being upgraded...")); //主控系统升级中... + //m_pPromptDlg->setButtonUCancelStr(tr("Cancel"));//取消 + m_pPromptDlg->setRange(0, total); + m_pPromptDlg->setValue(send); + m_pPromptDlg->show(); + QCoreApplication::processEvents(QEventLoop::AllEvents); + } + else + { + m_pPromptDlg->hide(); + } + } + else + { + if (send < 0 && total < 0) + { + // 失败 + m_pPromptDlg->initDialog(PromptDialog::BTN_UCANCEL); + + if(fileType == FILE_TYPE_DAT)//花样数据文件(边框刺绣文件) + { + m_pPromptDlg->setTitleStr(tr("Prompt")); + //m_pPromptDlg->setButtonUCancelStr(tr("Close"));//关闭 + m_pPromptDlg->setContentStr(tr("Failed to send data file!")); //发送数据文件失败! + } + } + else if (send == 0 && total == 0) + { + if(fileType == FILE_TYPE_DAT)//花样数据文件 + { + // 成功 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt"));//主控升级 + m_pPromptDlg->setContentProcessStr(tr("The data file is send successfully!")); //数据文件发送成功! + } + m_pPromptDlg->hide(); + } + else if(send >= 0 && send <= total) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_UCANCEL); + if(fileType == FILE_TYPE_DAT)//花样数据文件 + { + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentProcessStr(tr("Data file sending...")); //数据文件发送中... + } + //m_pPromptDlg->setButtonUCancelStr(tr("Cancel"));//取消 + m_pPromptDlg->setRange(0, total); + m_pPromptDlg->setValue(send); + m_pPromptDlg->show(); + QCoreApplication::processEvents(QEventLoop::AllEvents); + } + else + { + m_pPromptDlg->hide(); + } + } +} + +//导出csv文件到U盘 +void MainWidgetFunction::slotCsvExport(int logType) +{ + QString usbPath = detectUsb();//U盘路径 + if(usbPath.length() <= 0) + { + //优盘不存在 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("USB flash drive is not detected!");//未检测到优盘! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + QDir apppath(qApp->applicationDirPath());//D:/work/workQT/QUILTING/Windows/debug + QString newName = usbPath + apppath.separator();//G + QString timeStr = QDateTime::currentDateTime().toString("_yyMMdd_hhmmss");//时间日期 _230215_144121 + + QString astr; + if(logType == TYPE_ERROR) + { + astr = "error"; + } + else if(logType == TYPE_BREAK) + { + astr = "break"; + } + else if(logType == TYPE_DEBUGINFO) + { + astr = "debuginfo"; + } + + QString newFileName = newName+astr+timeStr+".csv"; + + //csv文件路径 + QString csvfile; + if(logType == TYPE_ERROR) + { + csvfile = apppath.path() + apppath.separator() + CSV_ERROR; + } + else if(logType == TYPE_BREAK) + { + csvfile = apppath.path() + apppath.separator() + CSV_BREAK; + } + else if(logType == TYPE_DEBUGINFO) + { + csvfile = apppath.path() + apppath.separator() + CSV_DEBUGINFO; + } + QString csvfilePath = QDir(csvfile).absolutePath();//为了将"\"变为"/" + bool bl = QFile::copy(csvfilePath,newFileName); + + //强制写入 + //linux下写入文件或者拷贝、删除文件的情况 +#ifdef Q_OS_LINUX + system("sync"); +#endif + + QString str; + if(bl == true) + { + str = tr("Journal exported successfully!");//文件日志导出成功! + } + else + { + str = tr("Journal exported failed!");//文件日志导出失败! + } + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; +} + +void MainWidgetFunction::slotClearJournal() +{ + QDir apppath(qApp->applicationDirPath()); + QString csvfile = apppath.path() + apppath.separator(); + g_pSettings->fileClear(csvfile+CSV_ERROR);//清空文件日志内容,但文件还在 + g_pSettings->fileClear(csvfile+CSV_BREAK);//清空文件日志内容,但文件还在 + + // 刷新文件日志界面信息 + m_pSystemManageDlg->initDialog(); + m_pSystemManageDlg->exec(JOURNAL);//显示窗体 +} + +void MainWidgetFunction::slotRefreshWifiList() +{ + QStringList wifiStrList; + wifiStrList.clear(); + s16 rel = refreshWifiList(wifiStrList,1); + if(rel > 0) + { + m_pSystemManageDlg->setItemList(wifiStrList); + } +} + +//清空产量统计 +void MainWidgetFunction::slotClearProductStatis() +{ + if(g_pMachine != NULL) + { + g_pMachine->resetOutput();//清除产量统计(主控计数) + } + + emit siClearPatternBreakLineNum(); + + addProductStatisInfo(0);//花版断线次数清零 + m_pSystemManageDlg->refreshUi(); +} + +//用户登录 +void MainWidgetFunction::slotUserLogin(s16 user) +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + PassWordDialog passWordDlg; + QString str(""); + if(user == repair) + { + passWordDlg.setTitleStr(tr("Password input *"));//密码输入 + } + else if(user == root) + { + passWordDlg.setTitleStr(tr("Password input **"));//密码输入 + } + else if(user == resetpara) + { + passWordDlg.setTitleStr(tr("Password input ****"));//密码输入 + } + int rslt = passWordDlg.exec(); + if(rslt == 1) + { + str = passWordDlg.getInputStr(); + + if(user == repair) + { + if (str == PASSWORD_ONE) + { + g_emUser = repair; + emit siSetButtonUserLogo(1); + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("The password is wrong,please re-enter!"));//密码错误,请重新输入密码! + m_pPromptDlg->exec(); + return; + } + } + else if(user == root) + { + if (str == PASSWORD_TWO) + { + g_emUser = root; + emit siSetButtonUserLogo(2); + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("The password is wrong,please re-enter!"));//密码错误,请重新输入密码! + m_pPromptDlg->exec(); + return; + } + } + else if(user == resetpara) + { + if (str == PASSWORD_RESETPARA) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + g_emUser = resetpara; + m_pPromptDlg->setContentStr(tr("reset parameters password successfully logged in!"));//重置参数密码成功登入! + m_pPromptDlg->exec(); + emit siSetButtonUserLogo(2); + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("The password is wrong,please re-enter!"));//密码错误,请重新输入密码! + m_pPromptDlg->exec(); + return; + } + + + } + } +} + +//界面解密 +void MainWidgetFunction::slotHMIDecrypt(QString id) +{ + // 获取网卡号并输入序列号 + m_pPromptDlg->initDialog(PromptDialog::BTN_HMI_DECRYPT); + m_pPromptDlg->setTitleStr(tr("HMI decrypt")); + m_pPromptDlg->setContentHMIDecryptShow(id); + if(m_pPromptDlg->exec() == 1) + { + QString inputStr = m_pPromptDlg->getInputPassword(); + QByteArray inputAry = inputStr.toLatin1(); + + QString idStr = m_pPromptDlg->getNetworkCardID(); + QByteArray idAry = idStr.toLatin1(); + + char inputBuf[20]; //输入的注册码 + u8 idBuf[12]; //id号16进制字符串 + memset(inputBuf,0,sizeof(inputBuf)); + memset(idBuf,0,sizeof(idBuf)); + memcpy(inputBuf,inputAry.data(),inputStr.toLatin1().length()); + memcpy(idBuf,idAry.data(),idStr.toLatin1().length()); + + char outputBuf[20]; //生成的注册码 + int num,i; + u8 anBuf[16],chanBuf[16]; + memset(anBuf,0,sizeof(anBuf)); + memset(chanBuf,0,sizeof(chanBuf)); + memset(outputBuf,0,sizeof(outputBuf)); + for(i = 0; i < 4; i++) + { + if((inputBuf[i] >= '0') && (inputBuf[i] <= '9')) + anBuf[i]=inputBuf[i] - '0'; + else if((inputBuf[i] >= 'a') && (inputBuf[i] <= 'f')) + anBuf[i]=inputBuf[i] - 'a' + 10; + else if((inputBuf[i] >= 'A') && (inputBuf[i] <= 'F')) + anBuf[i]=inputBuf[i] - 'A' + 10; + else + break; + } + + for(u16 i = 0; i < sizeof(idBuf);) + { + if((idBuf[i] >= '0') && (idBuf[i] <= '9')) + idBuf[i]=idBuf[i] - '0'; + else if((idBuf[i] >= 'a') && (idBuf[i] <= 'f')) + idBuf[i]=idBuf[i] - 'a' + 10; + else if((idBuf[i] >= 'A') && (idBuf[i] <= 'F')) + idBuf[i]=idBuf[i] - 'A' + 10; + + if((idBuf[i+1] >= '0') && (idBuf[i+1] <= '9')) + idBuf[i+1]=idBuf[i+1] - '0'; + else if((idBuf[i+1] >= 'a') && (idBuf[i+1] <= 'f')) + idBuf[i+1]=idBuf[i+1] - 'a' + 10; + else if((idBuf[i+1] >= 'A') && (idBuf[i+1] <= 'F')) + idBuf[i+1]=idBuf[i+1] - 'A' + 10; + + i += 2; + } + + num=((u8)(anBuf[0]*16 + anBuf[1]))*256 + (u8)(anBuf[2]*16 + anBuf[3]); + anBuf[4]=(u8)(((idBuf[0] << 4) | idBuf[1]) + num) >> 4; + anBuf[5]=(u8)(((idBuf[0] << 4) | idBuf[1]) + num) & 0x0f; + anBuf[6]=(u8)(((idBuf[2] << 4) | idBuf[3]) + num) >> 4; + anBuf[7]=(u8)(((idBuf[2] << 4) | idBuf[3]) + num) & 0x0f; + anBuf[8]=(u8)(((idBuf[4] << 4) | idBuf[5]) + num) >> 4; + anBuf[9]=(u8)(((idBuf[4] << 4) | idBuf[5]) + num) & 0x0f; + anBuf[10]=(u8)(((idBuf[6] << 4) | idBuf[7]) + num) >> 4; + anBuf[11]=(u8)(((idBuf[6] << 4) | idBuf[7]) + num) & 0x0f; + anBuf[12]=(u8)(((idBuf[8] << 4) | idBuf[9]) + num) >> 4; + anBuf[13]=(u8)(((idBuf[8] << 4) | idBuf[9]) + num) & 0x0f; + anBuf[14]=(u8)(((idBuf[10] << 4) | idBuf[11]) + num) >> 4; + anBuf[15]=(u8)(((idBuf[10] << 4) | idBuf[11]) + num) & 0x0f; + + chanBuf[0]=(u8)(anBuf[0]*16 + anBuf[1]); + chanBuf[1]=(u8)(anBuf[2]*16 + anBuf[3]); + chanBuf[2]=(u8)(anBuf[7]*16 + anBuf[9]); + chanBuf[3]=(u8)(anBuf[6]*16 + anBuf[8]); + chanBuf[4]=(u8)(anBuf[10]*16 + anBuf[15]); + chanBuf[5]=(u8)(anBuf[5]*16 + anBuf[11]); + chanBuf[6]=(u8)(anBuf[13]*16 + anBuf[4]); + chanBuf[7]=(u8)(anBuf[14]*16 + anBuf[12]); + + //id号长度大于12,以此类推 + //chanbuf[8]=(u8)(anbuf[17]*16 + anbuf[16]); + //chanbuf[9]=(u8)(anbuf[19]*16 + anbuf[18]); + //chanbuf[10]=(u8)(anbuf[21]*16 + anbuf[20]); + sprintf(outputBuf,"%02x%02x%02x%02x%02x%02x%02x%02x",chanBuf[0], + chanBuf[1],chanBuf[2],chanBuf[3],chanBuf[4],chanBuf[5],chanBuf[6],chanBuf[7]); + + QDir apppath(qApp->applicationDirPath()); + QString HMIDecryptConfigfile; + HMIDecryptConfigfile = apppath.path() + apppath.separator() + "HMIDecryptConfig.ini"; + QSettings iniSetting(HMIDecryptConfigfile, QSettings::IniFormat); + + if( 0 == memcmp(inputBuf, outputBuf, sizeof(inputBuf)) ) // 比较两个缓存区内容是否相同(等于0相等) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("The interface program is licensed, and then take effect after restarting, please restart manually!");//界面程序授权成功,重启后生效,请手动重启! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + + iniSetting.setValue("HMIDecrypt/ifdecrypt",1); + + return; + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Password error, interface program authorization failed!");//密码错误,界面程序授权失败! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + + //iniSetting.setValue("HMIDecrypt/ifdecrypt",0); + + return; + } + } +} + +//超级用户退出程序 +void MainWidgetFunction::slotExitApp() +{ + //是否退出程序 + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Whether to exit the program?");//是否退出程序? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + QApplication* app; + app->exit(0); + } +} + +//超级用户版本恢复 +void MainWidgetFunction::slotVerRecovery() +{ + //是否版本恢复 + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Is the version restored?");//是否版本恢复? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + } +} + +//超级用户修改一级密码 +void MainWidgetFunction::slotChangePassword() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_CHANGE_PASSWORD);//修改一级密码界面 + m_pPromptDlg->setTitleStr(tr("Modify the first level password")); + m_pPromptDlg->setContentChangePasswordShow(); + if(m_pPromptDlg->exec() == 1)//点击确认按钮,确认修改密码 + { + /*点击确定,首先检查编辑框中是否为空,然后检查两次输入的密码是否一致, + 一致就将原密码和新密码*/ + QString n_pwd = m_pPromptDlg->getInputNewPassword();//新密码 + QString rn_pwd = m_pPromptDlg->getInputConfirmPassword();//确认新密码 + if(n_pwd != rn_pwd) + { + //新密码和确认密码不一致 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + QString str; + str = tr("The two passwords are inconsistent!");//新密码和确认密码不一致! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + } + else + { + g_passwordOne = n_pwd;//新的密码变成一级密码 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + QString str; + str = tr("Password reset complete!");//密码修改成功! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + g_pSettings->writeOneToIniFile("HMI/passwordOne",g_passwordOne); + } + } +} + +//删除执行目录下的config.ini +void MainWidgetFunction::slotDeleteIni() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Do you delete the configuration file?");//是否删除配置文件? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + QDir apppath(qApp->applicationDirPath()); + + //配置文件路径 + QString configfile; + configfile = apppath.path() + apppath.separator() + "config.ini"; + QFile::remove(configfile); + + QString HMIConfigfile; + HMIConfigfile = apppath.path() + apppath.separator() + "HMIConfig.ini"; + QFile::remove(HMIConfigfile); + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("The settings take effect after restarting the interface!");//重启界面后设置生效! + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + } +} + +//导入csv文件 +void MainWidgetFunction::slotImportCSV() +{ + QString usbPath = detectUsb(); + if(usbPath.length() <= 0) + { + //优盘不存在 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("USB flash drive is not detected!");//未检测到优盘! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); + return; + } + + QString sPath = usbPath + CSV_PROGRESS; + QDir apppath(qApp->applicationDirPath()); + QString tPath= apppath.absolutePath() + apppath.separator() + CSV_PROGRESS; + QFile::remove(tPath); + QFile::copy(sPath,tPath); + +#ifdef Q_OS_LINUX + system("sync"); +#endif + + //成功导入csv文件! + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Import csv file successful!");//成功导入csv文件! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); +} +//删除csv文件 +void MainWidgetFunction::slotDeleteCSV() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Do you delete the csv file?");//是否删除csv文件? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + QDir apppath(qApp->applicationDirPath()); + + //配置文件路径 + QString csvfile; + csvfile = apppath.path() + apppath.separator() + CSV_PROGRESS; + QFile::remove(csvfile); + +#ifdef Q_OS_LINUX + system("sync"); +#endif + } +} + +//重置csv文件 +void MainWidgetFunction::slotResetCSV() +{ + m_csvFileStrList.clear(); + + QDir apppath(qApp->applicationDirPath()); + QString path = apppath.path() + apppath.separator() + CSV_PROGRESS; + QFile file(path); + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qDebug() << "Open file failed!"; + return; + } + + QTextStream out(&file); + out.setCodec("GB2312"); //支持读取中文信息 + + //遍历行 + for(int i = 0; !out.atEnd(); i++) + { + QString strLine = out.readLine(); + if(strLine.size() <= 0) + { + continue; + } + + QStringList strlist = strLine.split(",", QString::SkipEmptyParts); //根据","分隔开每行的列 + if(COLUMN_PRESSNUM < strlist.size()) + { + if(i != 0) + { + strlist[COLUMN_PRESSNUM] = "0"; + } + QString str; + for(int m = 0; m < strlist.size(); m++) + { + str.append(strlist[m]); + if(m != strlist.size() - 1) + { + str.append(","); + } + } + m_csvFileStrList.append(str); + } + } + file.close(); + + QTextCodec * gbkCodec = QTextCodec::codecForName("GBK"); + + QByteArray array; + array.clear(); + for(int j = 0; j < m_csvFileStrList.size(); j++) + { + QString str = m_csvFileStrList[j]; + QByteArray ary; + if (gbkCodec != NULL) + { + ary = gbkCodec->fromUnicode(str); + } + else + { + ary = str.toLocal8Bit(); + } + + array.append(ary); + if(j != m_csvFileStrList.size() - 1) + { + array.append('\n'); + } + } + + QFile wfile(path); + if (wfile.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) + { + wfile.write(array); +#ifdef Q_OS_LINUX + system("sync"); +#endif + } + wfile.close(); + + QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); + + QString iniPath = apppath.path() + apppath.separator() + "config.ini"; + QSettings setting(iniPath, QSettings::IniFormat); + setting.setValue("Progress/getScore",0); + m_getScore = 0; + + //成功导入csv文件! + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + + QString str; + str = tr("Reset succeeded!");//重置成功! + m_pPromptDlg->setContentStr(str); + m_pPromptDlg->exec(); +} + +//界面调试模式,调试模式时不需要密码 -rq +void MainWidgetFunction::slotDebugMode() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + if (g_emDebugMode == nodebugMode) + { + str = tr("Whether to enter debug mode?");//是否进入调试模式? + } + else + { + str = tr("whether to exit debug mode?");//是否退出调试模式? + } + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if (g_emDebugMode == nodebugMode) + { + g_emDebugMode = debugMode; + } + else //退出了调试模式 + { + g_emDebugMode = nodebugMode;//全局的 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str2; + str2 = tr("Please log in to super user again!");//请重新登录超级用户! + m_pPromptDlg->setContentStr(str2); + if(m_pPromptDlg->exec() == 1) //退出超级用户界面 + { + emit siCloseRootPara();//关闭超级用户参数界面 + } + } + g_pSettings->writeOneToIniFile("HMI/debugMode",g_emDebugMode);//写入配置文件 + emit siDebugState();//主界面接收信号,调试模式时,界面不需要密码,界面标题变红 + } +} + +//超级用户花样总清 +void MainWidgetFunction::slotPatternClear() +{ + //是否花样总清 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Is the pattern clear?");//是否花样总清? + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { //删除文件 + QDir apppath(qApp->applicationDirPath()); + QString targetDir = apppath.absolutePath() + apppath.separator(); + QString tPath = targetDir + PATTERNPATH; + deleteDir(tPath); + } +} + +void MainWidgetFunction:: deleteDir(QString tPath) +{ + QDir dir(tPath);//项目中所保存的路径 + dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);//设置过滤 + QFileInfoList fileList = dir.entryInfoList();// 获取所有的文件信息 + foreach (QFileInfo file,fileList)//遍历文件信息 + { + if (file.isFile()) //是文件,删除,文件夹也要删除 + { + file.dir().remove(file.fileName()); + } + else //递归删除 + { + deleteDir(file.absoluteFilePath()); + } + } + dir.rmpath(dir.absolutePath()); + //检测是否删除 + QDir dir1(tPath); + dir1.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);//设置过滤 + QFileInfoList fileList_1 = dir1.entryInfoList();//获取所有的文件信息 + if(fileList_1.size() == 0) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + m_pPromptDlg->setTitleStr(tr("Prompt")); + m_pPromptDlg->setContentStr(tr("Delete complete!"));//删除完成! + m_pPromptDlg->exec(); + emit siClearPattern();//清空当前选择的花样 + return; + } + else + { + deleteDir(tPath); + // m_pPromptDlg->initDialog(PromptDialog::BTN_OK); + // m_pPromptDlg->setTitleStr(tr("Prompt")); + // m_pPromptDlg->setContentStr(tr("Not cleaned up!"));//未清理完成! + // m_pPromptDlg->exec(); + // return; + } +} + +void MainWidgetFunction::funSimulatedSewing() +{ + if(g_pMachine == NULL) + { + return; + } + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Simulated working"));//模拟工作 + QString str = tr("Whether to switch working status");//是否切换工作状态 + m_pPromptDlg->setContentStr(str); + + u32 workStatus = g_pMachine->getMcStatus().workStatus; + + if ((workStatus & WORK_STA_SIMULATE) == WORK_STA_SIMULATE) //模拟工作 + { + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->setNormalWork(); + } + } + else + { + if(m_pPromptDlg->exec() == 1) + { + g_pMachine->setSimulateWork(); + } + } +} + +void MainWidgetFunction::manualThreadCutting() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Manual thread cutting"));//手动剪线 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->cutThreadByhand(); + } + } +} + +void MainWidgetFunction::makeup(int mode) +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("makeup sewing"));//补缝 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->makeup(mode); + } + } +} + +void MainWidgetFunction::headLiftUpDown() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Head lifting and lowering"));//机头升降 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + //粗线布线机 + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->ThicklineSewHeadLiftUpDown(); + } + else + { + g_pMachine->sewHeadLiftUpDown(); + } + } + } +} + +void MainWidgetFunction::headLifting() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Head lifting"));//机头上升 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->sewHeadLiftUp(); + } + } +} + +void MainWidgetFunction::headLowering() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Head lowering"));//机头下降 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->sewHeadLiftDown(); + } + } +} + +void MainWidgetFunction::headLifting2() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Head lifting") + "2");//机头上升2 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->sewHeadLiftUp2(); + } + } +} + +void MainWidgetFunction::headLowering2() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Head lowering") + "2");//机头下降2 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->sewHeadLiftDown2(); + } + } +} + +void MainWidgetFunction::sewNeedlesShuttleReset() +{ + PromptDialog promptDialog; + promptDialog.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDialog.setTitleStr(tr("Sewing needle and shuttle reset"));//缝纫针梭复位 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + promptDialog.setContentStr(str); + + if(promptDialog.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->msReset(); + } + } +} + +void MainWidgetFunction::funSetAnchorPoint(QString filePath,int x,int y,int showFlag, bool allToReset, bool isSendPatternHead) +{ + if(filePath.length() <= 0) + { + return; + } + + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set anchor point"));//定定位点 + QString str = tr("Whether to set the current point as the start point?");//是否将当前点设置为定位点? + m_pPromptDlg->setContentStr(str); + + int setFlag = 1; + if(showFlag == 1) + { + setFlag = m_pPromptDlg->exec(); + } + + if(setFlag == 1) + { + if(g_pCurEmbData != NULL) + { + g_pCurEmbData->setAnchorPosition(x,y);//将主控当前机头存在ds16头文件里 + //改变中间数据(ds16)的头文件 + } + if(isSendPatternHead) + sendPatternHead(filePath);//发送花样ds16头文件 + + //每次点击选择花样的时候才会生成ds16数据,其他时候就是给下位机发头文件 + //dsr,dst整个文件->中间数据->ds16 + writePonitToFile(filePath,x,y,1); //将新的起始点,机头,写回到(dst,dsr)源文件中 + + //流程复位 + if(allToReset) + g_pMachine->allToReset(); + + slotCalMachineProgress(CSV_00_CODE_2); + } +} + +//边走边裁 +void MainWidgetFunction::funSetAnchorPointForCut(QString filePath,int x, int y,s16 showFlag,s16 saveFlag) +{ + if(showFlag == 1) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Set anchor point"));//定定位点 + QString str = tr("Whether to set the current point as the anchor point?");//是否将当前点设置为定位点? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() != 1) + return; + } + + if(saveFlag != 0) + { + //写入配置文件 + g_pSettings->writeOneToIniFile("FlatPanel/AnchorPointX", x); + g_pSettings->writeOneToIniFile("FlatPanel/AnchorPointY", y); + } + + if(g_pCurEmbData != NULL && filePath.length() > 0) + { + g_pCurEmbData->setAnchorPosition(x,y);//设置定位点 + g_pCurEmbData->setStartPositionFromLeftFront(x,y); +#if(0) + //根据定位点计算起始点 + int maxX = g_pCurEmbData->getMaxX(); + //int minX = g_pCurEmbData->getMinX(); + int begX = g_pCurEmbData->getBeginX(); + int cx = x - (maxX - begX); + int maxY = g_pCurEmbData->getMaxY(); + //int minY = g_pCurEmbData->getMinY(); + int begY = g_pCurEmbData->getBeginY(); + int cy = y - (maxY - begY); + g_pCurEmbData->setStartPosition(cx,cy);//设置起始点 +#endif + sendPatternHead(filePath);//发送花样ds16头文件 + } +} + +void MainWidgetFunction::funBackAnchorPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back anchor point"));//回定位点 + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoAnchor(); + slotCalMachineProgress(CSV_00_CODE_3); + } + } +} + +void MainWidgetFunction::funBackShuttlePos() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back shuttle pos"));//回换梭位 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->gotoShuttlePos(); + } + } +} + +void MainWidgetFunction::funNeedleShuttleReset() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Needle shuttle adjust"));//针梭校对 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_GLASSFIBRE || g_emMacType == MACHINE_CUTTINGWALK) + g_pMachine->msAdjust(MAINSHAFT_ADJUST_GLASS, 0); + else + g_pMachine->msAdjust(MAINSHAFT_ADJUST, 0); + } + } +} + +void MainWidgetFunction::funKnifeCollect() +{ + PromptDialog PromptDlg; + PromptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + PromptDlg.setTitleStr(tr("Knife pressure collection"));//刀压采集 + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + PromptDlg.setContentStr(str); + + if(PromptDlg.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(KNIFE_COLLECT); + }else + { + qDebug()<<"erro no machine"; + } + } +} + +void MainWidgetFunction::funKnifeTest() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_KNIFE_PRESSURE); + m_pPromptDlg->setTitleStr(tr("Knife pressure test"));//刀压测试 + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funSetKnifeTestPos() +{ + if(promptBox(tr("Set the position for tool pressure detection")) != 1)//设置刀压检测位置 + return; + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SET_KNIFETEST_POS); + } +} + +void MainWidgetFunction::funCrossCut() +{ + if(promptBox(tr("Cross cutting")) != 1)//横切 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(CROSS_CUT); + } +} + +void MainWidgetFunction::funFanArea() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_FAN_AREA); + m_pPromptDlg->setTitleStr(tr("Fan area"));//风机区域 + m_pPromptDlg->exec(); +} + +void MainWidgetFunction::funPenUpOrDown(int def, s16 val) +{ + if(val == 0) + { + if(g_pMachine != NULL) + { + g_pMachine->outputCtrl(def, DOWN_CLOSE_OFF, 0); + } + } + else if(val == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->outputCtrl(def, UP_OPEN_ON, 0); + } + } +} + +void MainWidgetFunction::funBackToCuttringPoint() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Back to Cuttring"));//回切割点 + + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + if(m_pPromptDlg->exec() != 1) return; + + if(g_pMachine !=NULL) + { + //从配置文件中读取切割点 + int x = g_pSettings->readFromIniFile("FlatPanel/AnchorPointX").toInt(); + int y = g_pSettings->readFromIniFile("FlatPanel/AnchorPointY").toInt(); + g_pMachine->moveFrameTo(x,y); + } +} + +void MainWidgetFunction::funResetAnchorPoint(QString filePath, DataFilePos pos) +{ + if(filePath.length() <= 0) + { + return; + } + + funSetAnchorPointForCut(filePath,pos.anchorX,pos.anchorY,-1,1); +} + +void MainWidgetFunction::funBoardLowPosition() +{ + if(!promptBox(tr("Flip board low position")))// 翻板到低位 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MOTO_LOW_POS); + } +} + +void MainWidgetFunction::funBoardCenterPosition() +{ + if(!promptBox(tr("Flip board center position")))// 翻板到中位 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MOTO_MID_POS); + } +} + +void MainWidgetFunction::funResetAll() +{ + if(!promptBox(tr("Reset All")))// 翻板到中位 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MT_MANUAL_A1); + } +} + +void MainWidgetFunction::funOneClickMaterialPulling() +{ + if(!promptBox(tr("One click material pulling")))// 一键拉料 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MT_MANUAL_A2); + } +} + +void MainWidgetFunction::funOneClickCrossCutting() +{ + if(!promptBox(tr("One click cross cutting")))// 一键横切 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MT_MANUAL_A3); + } +} + +void MainWidgetFunction::funBottomLineClearingCount() +{ + if(!promptBox(tr("Bottom line clearing count")))// 底线清空计数 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MT_MANUAL_A4); + } +} + +void MainWidgetFunction::funPullSta() +{ + if(!promptBox(tr("Enter the material pulling state")))// 进入拉料状态 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(CTB_INTO_PULL_STA); + } +} + +void MainWidgetFunction::funFullAutoCrossCutting() +{ + if(!promptBox(tr("One click cross cutting")))// 一键横切 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(CTB_ONEKEY_CROSSCUT); + } +} + +void MainWidgetFunction::funSewSta() +{ + if(!promptBox(tr("Enter the material pulling state")))// 进入拉料状态 + return; + + if(g_pMachine != NULL) + { + g_pMachine->manualAction(CTB_INTO_SEW_STA); + } +} + +void MainWidgetFunction::funThickWiringmac(int funEnum) +{ + QString str; + int funType = -1; + + switch (funEnum) { + case FUN_MS_TO_ANGLE: + str = tr("Spindle to specified angle");//主轴去指定角度 + funType = MS_TO_ANGLE; + break; + case FUN_WIRE_MS_RUN: + str = tr("Spindle grinding machine");//主轴研车 + funType = WIRE_MS_RUN; + break; + case FUN_ROT_TO_ANGLE: + str = tr("Rotate the motor to the specified angle");//旋转电机去指定角度 + funType = ROT_TO_ANGLE; + break; + case FUN_AUTO_PULL: + str = tr("Automatic material pulling");//自动拉料 + funType = AUTO_PULL; + break; + case FUN_CUT_UD: + str = tr("Cut the bottom surface line");//剪底面线 + funType = CUT_UD; + break; + case FUN_CUT_WIRE: + str = tr("Cutting resistance wire");//剪电阻丝 + funType = CUT_WIRE; + break; + case FUN_GOTO_PULLPOS: + str = tr("Starting point of pull back material");//回拉料起始点 + funType = GOTO_PULLPOS; + break; + case FUN_JAW_WORK: + str = tr("Working status of fabric clamping");//夹布工作状态 + funType = JAW_WORK; + break; + case FUN_JAW_FEED: + str = tr("Cloth loading status");//夹布上料状态 + funType = JAW_FEED; + break; + case FUN_ZIGZAG_POS1: + str = tr("To swing position 1");//去摆动位1 + funType = ZIGZAG_POS1; + break; + case FUN_ZIGZAG_POS2: + str = tr("Go to swing position 2");//去摆动位2 + funType = ZIGZAG_POS2; + break; + case FUN_YPB_MOVE: + str = tr("Manual material pulling");//手动拉料 + funType = YPB_MOVE; + break; + case FUN_AUTO_CHANGE_ONE_SHUT: + str = tr("Automatically switch to another shuttle");//自动换一个梭 + funType = AUTO_CHANGE_ONE_SHUT; + break; + case FUN_INSTALL_FIRST_BOBBIN: + str = tr("Install the first shuttle shell");//安装第一个梭壳 + funType = INSTALL_FIRST_BOBBIN; + break; + case FUN_SHUT_FROM_PLATE_TO_HEAD: + str = tr("Take the rotary shuttle from the machine head to the shuttle disc");//将旋梭从机头拿到梭盘 + funType = SHUT_FROM_PLATE_TO_HEAD; + break; + case FUN_SHUT_FROM_HEAD_TO_PLATE: + str = tr("Take the rotary shuttle from the machine head to the shuttle disc");//将旋梭从机头拿到梭盘 + funType = SHUT_FROM_HEAD_TO_PLATE; + break; + case FUN_SHUT_INTO_TAKE_PLATE: + str = tr("Entering the state of replacing the shuttle disk");//进入更换梭盘状态 + funType = SHUT_INTO_TAKE_PLATE ; + break; + case FUN_SHUT_INTO_INDX_STA: + str = tr("Entering sewing mode");//进入缝纫状态 + funType = SHUT_INTO_INDX_STA; + break; + case FUN_SHUT_FEED_STATE: + str = tr("Entering feed mode");//进入送料状态 + funType = SHUT_FEED_STATE; + break; + case FUN_SHUT_BACK_STATE: + str = tr("Entering take back mode");//进入收料状态 + funType = SHUT_BACK_STATE; + break; + default: + break; + } + + if(promptBox(str) != 1)//设置被动刀旋转位置 + return; + if((g_pMachine != NULL) && (funType != -1)) + { + g_pMachine->manualAction(funType); + } +} + +/** + * @brief 机器运动提示框 + * @param title + * @return + */ +int MainWidgetFunction::promptBox(QString title) +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(title); + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + + return m_pPromptDlg->exec(); +} + +//win下关机按钮 +void MainWidgetFunction::funShutDown() +{ + //是否关闭计算机 + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Whether to shut down the computer?");//是否关闭计算机? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + system("shutdown -s -t 00");//电脑关机 + } +} + +//自动换一个梭 +void MainWidgetFunction::funChangeOneShuttle() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Whether to set to change a shuttle automatically?");//是否设置自动换一个梭? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->changeOneShuttle(); + } + } +} + +// 安装第一个梭壳 +void MainWidgetFunction::InstallTheFirstShuttleShell() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Whether to set to the first shuttle shell installed?");//是否安装第一个梭壳? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->installShuttle(); + } + } +} + +// 将旋梭从梭盘拿到机头 +void MainWidgetFunction::ShuttleFromTrayToHead() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Whether to take the rotary shuttle from the shuttle tray to the machine head?");//是否将旋梭从梭盘拿到机头? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->shuttleToHead(); + } + } +} + +// 将旋梭从机头拿到梭盘 +void MainWidgetFunction::ShuttleFromHeadToTray() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Whether to take the rotary shuttle from the machine head to the shuttle tray?");//是否将旋梭从机头拿到梭盘? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->headToShuttle(); + } + } +} + + +// 改变弹窗位置 +void MainWidgetFunction::moveDlgPos(void) +{ + m_pPromptDlg->move((GLB_SCR_WIGHT*getFactoryX()-m_pPromptDlg->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*getFactoryY()-m_pPromptDlg->height())/2+g_mainWidgetPos.y()); + m_pSystemManageDlg->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + m_pDebugInfoDlg->move(101*getFactoryX()+g_mainWidgetPos.x(),36*getFactoryX()+g_mainWidgetPos.y()); +} + +void MainWidgetFunction::funAllMtZero() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Spindle motor to zero"));//主轴电机归零 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->motoToZero(MT_LM); + } +} + +//启动工作 +void MainWidgetFunction::funStartWork() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Start work"));//启动工作 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->startWork(); + } +} + +//暂停工作 +void MainWidgetFunction::funPauseWork() +{ + if(g_pMachine != NULL) + { + g_pMachine->pauseWork(); + } +} + +//主轴去勾线位 +void MainWidgetFunction::funHookPos() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Hook position"));//主轴去勾线位 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->spindleHookPos(MAIN_TO_CUSP); + } +} + +//主轴去停车位 +void MainWidgetFunction::funParkPos() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Park position"));//主轴去停车位 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->spindleParkPos(MAIN_TO_STOP); + } +} + +void MainWidgetFunction::funAllMtG() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("AllSpindleHookLines"));//所有主轴勾线 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->motoToZero(MT_ALLG); + } +} + +void MainWidgetFunction::funAllMtM() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("AllSpindleJogs"));//所有主轴点动 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->motoToZero(MT_ALLM); + } +} + +void MainWidgetFunction::funAllMainShaftRun() +{ + if(g_emMacType == MACHINE_THICK_WIRING) + { + m_pPromptDlg->initDialog(PromptDialog::BTN_SPINDLE_GRANDE); + m_pPromptDlg->setTitleStr(tr("AllMainShaftRun"));//所有主轴研车 + m_pPromptDlg->exec(); + } + else + { + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("AllMainShaftRun")); // 所有主轴研车 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(ALL_MS_RUN); + } + } + +} +// 粗线布线机针梭校对 +void MainWidgetFunction::ThicklinefunMainshaftAdjust() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("NeedleShuttleProofreading")); // 针梭校对 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(MAINSHAFT_ADJUST); + } +} +//自动拉料 +void MainWidgetFunction::AutomaticMaterialPull() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_AUTOMATIC_PULLMA); + m_pPromptDlg->setTitleStr(tr("Automatic material pulling"));//自动拉料 + m_pPromptDlg->exec(); + + // m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + // m_pPromptDlg->setTitleStr(tr("Automatic material pulling")); // 自动拉料 + // QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + // m_pPromptDlg->setContentStr(str); + // if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + // { + // g_pMachine->manualAction(AUTO_PULL); + // } +} +//剪底面线 +void MainWidgetFunction::CutBottomLine() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Cut the bottom surface line")); // 剪底面线 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(CUT_UD); + } +} +//剪电阻丝 +void MainWidgetFunction::CutResistanceWire() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Cutting resistance wire")); // 剪电阻丝 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(CUT_WIRE); + } +} +//回拉料起始点 +void MainWidgetFunction::StartPointOfBackMaterial() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Starting point of pull back material")); // 回拉料起始点 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(GOTO_PULLPOS); + } +} +// 夹布工作状态 +void MainWidgetFunction::WorkStatusOfClamp() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Working status of fabric clamping")); // 夹布工作状态 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(JAW_WORK); + } +} +// 夹布上料状态 +void MainWidgetFunction::ClothStatus() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Cloth loading status")); // 夹布上料状态 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(JAW_FEED); + } +} +// 去摆动位1 +void MainWidgetFunction::SwingPositionOne() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("To swing position 1")); // 去摆动位1 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(ZIGZAG_POS1); + } +} +// 去摆动位2 +void MainWidgetFunction::SwingPositionTwo() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("To swing position 2")); // 去摆动位2 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(ZIGZAG_POS2); + } +} +// 手动拉料 +void MainWidgetFunction::ManualMaterial() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Manual material pulling")); // 手动拉料 + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + m_pPromptDlg->setContentStr(str); + if((m_pPromptDlg->exec() == 1) && (g_pMachine != NULL)) + { + g_pMachine->manualAction(YPB_MOVE); + } +} +// 进入更换梭盘状态 +void MainWidgetFunction::ShuttleState() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Whether to entering the state of replacing the shuttle disk?"); + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SHUT_INTO_TAKE_PLATE); + } + } +} +// 进入缝纫状态 +void MainWidgetFunction::SewState() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + m_pPromptDlg->setContentStr(tr("Whether to entering the state of sewing mode?"));//是否进入进入缝纫状态? + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SHUT_INTO_TAKE_PLATE); + } + } +} + +// 进入送料状态 +void MainWidgetFunction::FeedState() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + m_pPromptDlg->setContentStr(tr("Have you entered the feeding state?"));//是否进入进入送料状态? + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SHUT_FEED_STATE); + } + } +} + +// 进入收料状态 +void MainWidgetFunction::BackState() +{ + m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); + m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 + QString str; + str = tr("Have you entered the receiving state?");//是否进入收料状态? + m_pPromptDlg->setContentStr(str); + if(m_pPromptDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SHUT_BACK_STATE); + } + } +} + +// 梭芯底线显示 +//根据换梭芯提醒功能来决定具体使用哪个参数,如果选择1或3,按针数计数,当前梭芯底线剩余量就等于底线长度计数/换梭针数计数得到的百分比 +//如果选择2按片数计数,当前梭芯底线剩余量就等于底线片数计数/换梭片数计数得到的百分比 +//如果选择0不提醒,就按照1按针数计数处理 + +void MainWidgetFunction::ShuttleBottemLine() +{ + int funtion = g_pMachine->getWkPara().buf[70]; //换梭芯提醒功能, 0, 不启用该功能; 1, 按针度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + + int quantityNeedle = g_pMachine->getWkPara().buf[71]; //换梭针数计数 + + int quantityPiece = g_pMachine->getWkPara().buf[72]; //换梭片数计数 + + int bottomLength = m_mcStatus.btrdLength; // 底线长度计数 + int bottomPiece = m_mcStatus.btrdPics; // 底线片数计数 + + int remainShuttle = m_mcStatus.motosPos4; //剩余梭芯数量 + + int NowBottom = 0; //梭芯底线剩余量 + + + //除数不能为零,如果其中有一个为零则返回 + if(quantityPiece == 0 || quantityNeedle == 0) + { + return ; + } + else + { + if(remainShuttle > 8 || remainShuttle < 0) + { + return ; + } + else + { + if(funtion == 2) + { + NowBottom = (bottomPiece*100)/quantityPiece; + } + else + { + NowBottom = (bottomLength*100)/quantityNeedle; + } + } + + } + + m_shuttleDlg->showShuttlenumber(remainShuttle, NowBottom); + + if(m_shuttleDlg->exec() == 1) + { + if(g_pMachine != NULL) + { + + } + } +// m_pPromptDlg->initDialog(PromptDialog::BTN_OK_CANCEL); +// m_pPromptDlg->setTitleStr(tr("Prompt"));//提示 +// QString str; +// str = tr("Whether to entering the state of back mode?");//是否进入收料状态? +// m_pPromptDlg->setContentStr(str); +// if(m_pPromptDlg->exec() == 1) +// { +// if(g_pMachine != NULL) +// { +// g_pMachine->manualAction(SHUT_BACK_STATE); +// } +// } +} diff --git a/mctype/mainwidgetfunction.h b/mctype/mainwidgetfunction.h new file mode 100644 index 0000000..c0907f9 --- /dev/null +++ b/mctype/mainwidgetfunction.h @@ -0,0 +1,299 @@ +#ifndef MAINWIDGETFUNCTION_H +#define MAINWIDGETFUNCTION_H + +#include +#include +#include +#include +#include +#include +#include "main.h" +#include "machine/error.h" +#include "sharedviews/promptdialog.h" +#include "sharedviews/shuttlebottomlinedialog.h" +#include "sharedviews/passworddialog.h" +#include "sharedviews/systemmanagedialog.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "datafile/datafilequi.h" +#include "datafile/datafilequix.h" +#include "settings/lotsettings.h" +#include "items/errorcodestateitem.h" +#include "Lot/csvcode.h" +#include "items/paraitem.h" +#include "sharedviews/debuginfodialog.h" + +#ifdef Q_OS_WIN +#include +#endif + +#define DATA_DS8 1 +#define DATA_DS16 2 +#define DATA_FORMATE DATA_DS16 + +#define COLUMN_CODE 0 //信息代码(第一列) +#define COLUMN_INFO 1 //映射信息(第二列) +#define COLUMN_SCORE 2 //分值(第三列) +#define COLUMN_PRESSNUM 3 //是否被点击过(第四列) + +#define HEADNUM 32 +#define NEEDLENUM 15 + +#define WIFIINIPATH "/etc/iot_cfg/mcgs_box_conf.ini" + +struct HMIFileHead +{ + int fileNum; +}; + +struct HMIItemFileHead +{ + char filePath[64]; + char fileName[64]; + int dataCheck; + int fileSize; +}; + +class MainWidgetFunction : public QObject +{ + Q_OBJECT +public: + explicit MainWidgetFunction(QObject *parent = 0); + ~MainWidgetFunction(); + + QString getCompileDateTime(); +private: + PromptDialog *m_pPromptDlg; + shuttlebottomlineDialog * m_shuttleDlg; + SystemManageDialog *m_pSystemManageDlg; + DebugInfoDialog *m_pDebugInfoDlg; + MCStatus m_mcStatus; + int m_curFileID; + QString m_filePath; + QString m_fileName; + McLotData m_mcLotData;//下位机物联数据 + HMILotData m_HMILotData;//上位机物联数据 + int m_sensorBitmapNum;//传感器位图个数 + QList m_errorCodeAndStateItemList;//错误代码和状态列表 + QTimer * m_pTipsTimer; //4小时定时器提示用户使用时长不足5天 + //QTimer timer; //测试物联网用 + int m_getScore;//安装进度调试得分 + int m_totalScore;//总分值 + QStringList m_csvFileStrList; + +private: + void initialize();//初始化 + void initializeLotInfo();//初始化物联网所需要的机器信息 + void initializeLotData();//初始化物联网数据 + void systemUpgrade(int type); + void systembackupUpgrade(int type); + s16 refreshWifiList(QStringList &wifiStrList,s16 scan = 0);//刷新wifi列表 + QString getIpSegment(bool bl);//获取已连接wifi分配的IP + void writePonitToFile(QString filePath,int x, int y, int flag = 0);//将定位点或起绣点写回到文件中(以及工作机头) + void writeFilePoint(QString filePath,int curX, int curY);//将左边前边写回到文件中 + void writeFileLeftFrontPoint(QString filePath,int &x, int &y,int left,int front);//将左边前边写回到文件中 + void writeFileLeftFrontPointDoubleHead(QString filePath,int left,int front);//将左边前边写回到文件中 + void sendDs16PatternData(int type = FILE_TYPE_DAT);//发送ds16花样数据 + void convertDs16ToDs8AndSend(QString filePath,int type = FILE_TYPE_DAT);//将ds16数据转换为ds8数据并发送 + void addProductStatisInfo(int patternBreakLineNum);//添加生产统计信息 + + void addJournalInfoError();//添加错误日志信息 + void addJournalInfoBreakage();//添加断线日志信息 + void addJournalInfoDebug();//添加调试信息 + + QString compositionJson(QString key,QString value);//组成json键值对 + HMILotData getHMILotData();//获取界面物联数据 + void sendDataToGateway(s16 code,s16 type = 0);//发送数据到物联网 + +public: + void setErrorCodeAndStateList(QList list);//设置错误代码和状态的列表 + void setShutDownTime();//上电计算关机时间并发送给主控 + void setMcStates(MCStatus mcStatus);//设置机器状态 + QString getVersionStr(); + QString detectUsb();//优盘检测 + s16 detectWifiConnect(); + void funImportParameter(QString tStyle);//参数导入 + void funExportParameter();//参数导出 + void funMCUpgrade(QString tStyle);//主控升级 + void funHMIUpgrade(QString tStyle);//界面升级 + void funHMIBackupsUpgrade(QString tStyle);//界面还原 + void funWIFI(QString tStyle);//WIFI管理 + void funAllToZero();//全部归零 + void funResetOutput();//产量清零 + void funAllToReset();//流程复位 + void funFlatEmbHook();//平绣勾线 + void funSpindleJog();//主轴点动 + + void funSpindleRotate();//主轴旋转 + void funRotateRotate();//旋转电机旋转 + void funBackWorkPoint();//回工作点 + void funWorkHeadSet(); //工作机头允许设置 + void funBackToOrigin();//回原点 + void funSetStartPoint(QString filePath,int x,int y,int showFlag = 0, bool allToReset = true, bool isSendPatternHead = true);//设置起始点 + void funSetLeftFrontPoint(QString filePath,int left,int front, bool allToReset = true, bool isSendPatternHead = true);//设置左前点 + void funSetLeftFrontPointDoubleHead(QString filePath, int left, int front, int showFlag = 0, bool allToReset = true, bool isSendPatternHead = true);//设置起始点 + void funBackStartPoint();// 回起针点 + void funGotoFinish();// 回结束点 + void funSetOffsetPoint();//设置偏移点 + void funBackOffsetPoint();//回偏移点 + void funBorderCheck();//边框检查 + void funManualTrim();//手动剪线 + void funCutterOpenAndClose();//剪刀开合 + void funSetWorkArea();// 设置可工作区域 + void funSimulateFrame();//空走边框 + void funProcessReset();//流程复位 + void funSetFeedPoint();//定上料点 + void funBackFeedPoint();//回上料点 + void funManualOil();//手动加油 + void funResetRepeatNum();//重置反复次数 + void funShuttleChange();//梭盘计数复位 + void funGotoZeroPos();//框架归零 + void funSetWorkRange();//定工作范围 + void sendPatternHead(QString filePath);//发送花样文件头 + void sendPatternData(QString filePath,int type = FILE_TYPE_DAT);//发送花样数据 + void funBottomDetect();//底线检测 + void funFaceDetect();//面线检测 + void funExitRoot();//退出登录 + void funAgingTest();//老化测试 + void funGetMCVersionInfo();//获取主控主板版本信息 + void funProductStatistics(QString tStyle,QString filePath,int patternBreakLineNum);//生产统计 +// void funJournal(QString bStyle,QString tStyle);//文件日志 + void funJournalError(QString tStyle);//错误日志 +// void funJournalBreakage(QString bStyle,QString tStyle);//断线日志 + void funDebugInfo(); + void funSoftwareAuthor();//软件授权 + void funChangeOneShuttle();//自动换一个梭 + void InstallTheFirstShuttleShell();//安装第一个梭壳 + void ShuttleFromTrayToHead();//将旋梭从梭盘拿到机头 + void ShuttleFromHeadToTray();//将旋梭从机头拿到梭盘 + void funAllMtZero();//所有主轴零位 + void funStartWork();//启动工作 + void funPauseWork();//暂停 + void funHookPos();//主轴去勾线位 + void funParkPos();//主轴去停车位 + void funAllMtG();//所有主轴勾线 + void funAllMtM();//所有主轴点动 + void ThicklinefunMainshaftAdjust();// 粗线布线机针梭校对 + void funAllMainShaftRun(); // 主轴研车 + void funShutDown();//win下关闭计算机 + int funErrorPrompt(QString info);//错误信息提示 + int funDetectBreakLineStatus();//检测断线状态 + void funSetPromptDlgVisibleFalse();//错误信息提示窗体隐藏 + void funBottomLineCountReset();//底线计数复位 + void funManualOrAutoSwitch(s16 val = 0);//手自动工作状态切换 0:手动 1:自动 + void deleteDir(QString path);//删除文件夹 + void funSimulatedSewing();//模拟工作 + void manualThreadCutting(); //手动剪线 + void makeup(int mode); //补缝 + void headLiftUpDown();//机头升降 + void headLifting();//机头上升 + void headLowering();//机头下降 + void headLifting2();//机头上升2 + void headLowering2();//机头下降2 + void sewNeedlesShuttleReset();//缝纫针梭复位 + int headup; + void funSetAnchorPoint(QString filePath,int x,int y,int showFlag = 0, bool allToReset = true, bool sendPatternHead = true);//设置定位点 + void funSetAnchorPointForCut(QString filePath,int x,int y,s16 showFlag = 1,s16 saveFlag = 0);//平板切割机(定定位点 + void funBackAnchorPoint();//回定位点 + void funBackShuttlePos();//回换梭位 + void funNeedleShuttleReset();//针梭校对 + void funKnifeCollect();//刀压采集 + void funKnifeTest();//刀压测试 + void funSetKnifeTestPos();//设置刀压检测位置 + void funCrossCut();//横切 + void funFanArea();//风机区域 + void funPenUpOrDown(int def,s16 val);//画笔升降 + void funBackToCuttringPoint();//回切割点 + void funResetAnchorPoint(QString filePath,DataFilePos pos);//重新定定位点 + + //粗线布线机 + void funThickWiringmac(int funEnum); + int promptBox(QString title);//机器运动提示框 + + void AutomaticMaterialPull();//自动拉料 + void CutBottomLine();//剪底面线 + void CutResistanceWire();//剪电阻丝 + void StartPointOfBackMaterial();//回拉料起始点 + void WorkStatusOfClamp();// 夹布工作状态 + void ClothStatus();// 夹布上料状态 + void SwingPositionOne();// 去摆动位1 + void SwingPositionTwo();// 去摆动位2 + void ManualMaterial();//手动拉料 + void ShuttleState();//进入更换梭盘状态 + void SewState();// 进入缝纫状态 + void FeedState(); + void BackState(); + void ShuttleBottemLine();//梭芯底线显示 + +private slots: + void slotMCInfoChange();//机器信息改变 + void slotReceiveLotData();//接收物联数据 + void slotRunLotDataAction(QString str);//执行网关数据动作 + //void slotSendJsonToMqtt();//当界面与网关建立连接时需要向网关发送固定的键值对 + void slotTransProgress(u8 fileType, int send, int total); // 发送文件进度条 + void slotClearProductStatis();//清空产量统计 + void slotCsvExport(int logType);//导出csv文件 + void slotClearJournal();//清空文件日志 + void slotRefreshWifiList();//刷新wifi列表 + void onTipsTimer();//4小时定时器 + void slotSetDynamicIP(QString ssid);//设置动态IP + void slotSetStaticIP(QString ssid,QString psd,QString dnip);//设置静态IP + void slotSpindleAction(int action);//主轴动作 + void slotSpindleRotate(int angle);//主轴旋转 + void slotRotateRotate(int angle);//旋转电机旋转 + void slotAutoPull(int length);//自动拉料 + void slotSpindleResearch(int spindleTime , int spindleSpeed);//主轴研车 + +signals: + void siSetButtonUserLogo(int level); + void siHeadBuf(u8* buf); + void siClearPatternBreakLineNum(); + void siDebugState(); + void siCloseRootPara(); + void siClearPattern(); + void siClearPatternFcg(); + void siShowPercentage(int val); + //void siReceiveLotDat(); //测试物联网用 + + void siAfterDeleteFileid();//xcy 0314 删掉影响fileid的数据后需要将m_fileHead置为0 + void siWifiState(bool bl);//wifi连接状态 + void siHeadParaImportFinish(int type); + +public slots: + void slotUserLogin(s16 user);//用户登录 + void slotHMIDecrypt(QString id);//界面解密 + void slotExitApp();//超级用户退出程序 + void slotVerRecovery();//超级用户下版本恢复 + void slotChangePassword();//超级用户下修改一级密码 + void slotDeleteIni();//删除执行目录下的config.ini + void slotImportCSV();//导入csv文件 + void slotDeleteCSV();//删除csv文件 + void slotResetCSV();//重置安装调试进度 + void slotDebugMode();//界面调试模式 + void slotPatternClear();//超级用户下花样总清 + void slotCalMachineProgress(s16 csvCode,s16 type = 0);//计算安装调试进度 + void slotJournalError();//错误日志 + void slotJournalBreakage();//断线日志 + void slotCsvChangeDebug();//调试信息 + //以下为测试记录断线次数精准到针位 + //void testBreakLineNeedle(); +public: + //QTimer *m_testNeedle; + void moveDlgPos(void); // 移动窗体位置 + + void funForce(); + void funFileTransfer(); + void funSetKnifeTestPoint(); + void funSetKnifeTestFlatness(); + void funBoardLowPosition(); // 翻板到低位 + void funBoardCenterPosition(); // 翻板到中位 + void funResetAll(); // 全部复位 + void funOneClickMaterialPulling(); // 一键拉料 + void funOneClickCrossCutting(); // 一键横切 + void funBottomLineClearingCount(); // 底线清空计数 + void funSewSta(); // 进入绗缝状态 + void funPullSta(); // 进入拉料状态 + void funFullAutoCrossCutting(); // 一键横切 全自动 +}; + +#endif // MAINWIDGETFUNCTION_H diff --git a/mctype/patternsingleboard/function/autodoubledoormac.cpp b/mctype/patternsingleboard/function/autodoubledoormac.cpp new file mode 100644 index 0000000..b646719 --- /dev/null +++ b/mctype/patternsingleboard/function/autodoubledoormac.cpp @@ -0,0 +1,1259 @@ +#include "autodoubledoormac.h" + +AutoDoubleDoorMac::AutoDoubleDoorMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initPatternsParasList(); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void AutoDoubleDoorMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void AutoDoubleDoorMac::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +void AutoDoubleDoorMac::initMcParasList() +{ + int index = 0; + // u32 autoChangeShut; // 自动换梭装置 , 0:打开 1关闭 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, index, root)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, root)); + //红外装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared curtain device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, index, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, index, operate)); + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, index, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, index, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, index, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""),99300, 99300, 0x0010, operate)); + + // u32 EncoderMolecule; // 编码器系数分子, 范围 1--100000,单位 无 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient molecule"),//进料编码器系数分子 + 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, index, root)); + + // u32 ZeroCutDistance; // 零切距离, 范围 1--500000,单位 0.01mm // 隐藏 + // u32 cutBoxDev; // 切料箱, + // bit.0, = 0, 无进料装置; 1, 有进料装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 1, 0, PARA_VALUE_TYPE_SW, + tr("Feeding device"),//进料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.1, = 0, 无横切装置; 1, 有横切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 2, 0, PARA_VALUE_TYPE_SW, + tr("Crosscutting device"),//横切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.2, = 0, 无夹布装置; 1, 有夹布装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 3, 0, PARA_VALUE_TYPE_SW, + tr("Cloth clamping device"),//夹布装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.3, = 0, 无张紧装置; 1, 有张紧装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 4, 0, PARA_VALUE_TYPE_SW, + tr("Tensioning device"),//张紧装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.4, = 0, 无边切装置; 1, 有边切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 5, 0, PARA_VALUE_TYPE_SW, + tr("Edge cutting device"),//边切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.7, = 0, 无切料确认功能; 1, 有切料确认功能 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 8, 0, PARA_VALUE_TYPE_SW, + tr("Cutting confirmation function"),//切料确认功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.8, = 0, 无边切升降装置; 1, 有边切升降装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 9, 0, PARA_VALUE_TYPE_SW, + tr("Edge cutting lifting device"),//边切升降装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.9, = 0, 无退料电机装置; 1, 有退料电机装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 10, 0, PARA_VALUE_TYPE_SW, + tr("Material return motor device"),//退料电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.11, = 0, 无中切装置; 1, 有中切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 12, 0, PARA_VALUE_TYPE_SW, + tr("Mid cutting device"),//中切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.13, = 1, 无出料装置; 0, 有出料装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 13, 0, PARA_VALUE_TYPE_SW, + tr("Discharge device"),//出料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.5, = 0, 无左上料装置; 1, 有左上料装置 // 隐藏 + // bit.6, = 0, 无右上料装置; 1, 有右上料装置 // 隐藏 + // bit.10, = 0, 无展布电机装置; 1, 有展布电机装置 // 隐藏 + // bit.12, = 0, 无中切对边装置; 1, 有中切对边装置 // 隐藏 + // bit.14, = 0, 无卷料装置; 1, 有卷料装置 // 隐藏 + + // s32 xGapCorrect; // X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index, root)); + // 超级用户 + // s32 yGapCorrect; // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index, root));// 超级用户 + // u32 EncoderDeno; // 编码器系数分母, 范围 1--100000,单位 无 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient denominator"),//进料编码器系数分母 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, index, root)); +} + +void AutoDoubleDoorMac::initWkParasList() +{ + int index = 0; + QTextCodec *cod = QTextCodec::codecForLocale(); + +// u32 msWorkRpm; // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认 2000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + // u32 msRevRpm; // 主轴回针转速, 范围 1--500,单位r/min,默认 200 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 sewMoveType; // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, + 0, 0, index++, root)); + + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; // 超级用户 + //无加速或减速:0;Xy正弦加速度和减速度:1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, + 1, 1, index++, root)); + + // bit2 = 0, 机头连续旋转; bit2 = 1, 机头间歇式旋转; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + //机头连续旋转:0;机头间歇式旋转:1 + tr("Continuous rotation of the machine head:0;Intermittent rotation of the machine head:1"), + 1, 1, index++, root)); + + // bit3 = 0, 机头无加减速; bit3 = 1, 机头正弦加减速; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + //机头无加减速:0;机头正弦加减速:1 + tr("Machine head without acceleration or deceleration:0;Sinusoidal acceleration and deceleration of the machine head:1"), + 1, 1, index++, root)); +// u32 actionWhenStart; // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit1, 夹线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 2, 0, PARA_VALUE_TYPE_SW, + tr("Needle and thread clamping allowed"),// 起针夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 cutTrdEn; // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, index++, operate)); + +// //5 +// u32 actionWhenCut; // 剪线时动作允许, 位图选择, +// bit0, 松线允许;0:不允许 1:允许 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for loose thread during thread cutting"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +// bit1, 拉线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 2, 0, PARA_VALUE_TYPE_SW, + tr("When cutting the thread, pulling the thread is allowed"),// 剪线时拉线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit2, 夹线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allowing for wire clamping during wire cutting"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit3, 提升压脚允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 4, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit4, 提升机头剪线;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit5, 提升机头夹线;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + +// bit6, 在压脚下勾线;0:不允许 1:允许 // 隐藏 + // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 7, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit7, 退针允许;0:不允许 1:允许 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// bit8, 扣线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 9, 0, PARA_VALUE_TYPE_LIST, + tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + +// u32 tbdNumber; // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数, 默认3 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index++, operate)); + +// u32 changeBobbinMode; // 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, index++, operate)); + +// u32 changeBobbinLength; // 底线长度, 单位 0.01mm,默认 10000000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 changeBobbinNums; // 换梭片数计数, 单位 次,默认 0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, index++, operate)); + +// // 10 + +// u32 oilMode; // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""), + strPersistentrefueling, 0, 0, index++, operate)); + +// u32 addOilGapStitch; // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 yuliu; //12 +// u32 addOilTime; // 针加油持续时长, 单位秒, // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duration"), + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index++, operate)); + +// u32 finishStopSel; // 完成后停车位置选择, 0, 当前位置; 1,起点,2,定位点,3,上料点; 4,偏移点 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 14, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Parking position selection after completion"),// 完成后停车位置选择 + 0, 0, 4, 0, 0, tr(""), tr(""), + strParkingposition, + 0, 0, index++, operate)); + +// u32 offsetEn; // 偏移点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index++, operate)); + +// s32 offsetX; // 偏移点坐标xx // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// s32 offsetY; // 偏移点坐标yy // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 fixPosEn; // 穿线点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index++, operate)); + +// s32 fixPosX; // 穿线点坐标x // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// //20 +// s32 fixPosY; // 穿线点坐标y // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 expectedOutput; // 产量预设 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 cutXYMovement; // 剪线动框位移, 1--1000, 单位0.01mm, 默认500 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 singlequiltActEn; // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blowing air is allowed during sewing"),// 缝纫时吹气允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // bit1 自动回穿线点允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + +// u32 liftHeadOption; // 机头升降选择, 位图选择, 0, 不允许; 1, 允许; + // bit0, 缝纫间越框机头升降; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 actionWhenMove; // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // bit1, 夹线允许; // 隐藏 + // bit2, 开框允许 // 隐藏 + // bit4. 叩线允许 // 隐藏 +// u32 softwareLimit; // 软件限位; 位图选择, 0, 不允许; 1, 允许; +// // bit0, xy移动; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, operate)); + + +// u32 cutMoveDir; // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, index++, operate)); + +// u32 msCornerRpm; // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 slowAngle; // 降速最小偏差角度,单位度,范围0--180,默认 180 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + +// // 30 +// u32 actionWhenBegin; // 开机动作; + //BIT0:1:开机自动找零, 0:开机不自动找零 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + +// u32 sewSlowMode; // 缝纫降速模式:0:自动降速,1参数降速,2不降速 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode,0, 0, index++, operate));//0:自动降速,1参数降速,2不降速 + +// u32 machActEn; // 机器动作配置, 0, 不允许; 1, 允许; + // bit0 自动拉料允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 1, 0, PARA_VALUE_TYPE_SW, + tr("Automatic drawing is allowed"),// 自动拉料允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // bit0 自动拉料允许; // 隐藏 + // bit1 进料时对边允许; // 隐藏 + // bit2 进料时展布允许; // 隐藏 + // bit3 进料时中切允许; // 隐藏 + // bit4 进料时中切对边允许; // 隐藏 + // bit5 机头升降时松线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + // bit6 裁切装置禁用 允许 0, 允许; 1, 不允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 7, 0, PARA_VALUE_TYPE_SW, + tr("Cutting device disabled"),// 裁切装置禁用 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 safetyEn; // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 红外; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index++, operate)); + + // bit1, 气压; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index++, operate)); + + // bit2, 上电信号; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, root)); + + // bit4, 安全门 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + // bit5 手自动按钮 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 6, 0, PARA_VALUE_TYPE_SW, + tr("Hand automatic button"),// 手自动按钮 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + +// u32 autoworkstart; // 循环工作功能,0, 不允许; 1, 允许; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 1, 0, PARA_VALUE_TYPE_SW, + tr("Circular working function"),// 循环工作功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, index++, operate)); + +// u32 addOilHookTime; // 梭加油持续时长, 单位秒, (针梭独立加油时有效) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Duration of shuttle refueling"),// 梭加油持续时长 + 0, 0, 60, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, index++, operate)); + +// u32 sewBlowConTime; // 缝纫吹气时间,范围0-10,单位s,默认0(0为持续吹气) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing and blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, index++, operate)); + +// u32 sewMoveStAng; // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + +// u32 cutTrdDivAngle; // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + +// u32 cutTrdEndAngle; // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + +// s32 mStopAng; // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 mscutRpm; // 主轴剪线转速, 范围 1--500,单位r/min,默认 120 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + +// s32 mHookAng; // 针梭勾线角度,0--36000, 单位 0.01度,默认 20200 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 pullingLength; // 拉料长度,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"),//拉料长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + + // u32 SecobdPullingCom; // 第二次拉料补偿,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 58, 0, 0, PARA_VALUE_TYPE_INT, + tr("Second material compensation"), + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 cuttingLength; // 裁切长度,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting length"),//裁切长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 tensionDistance; // 拉料张紧距离,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 45, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling and tensioning distance"),//拉料张紧距离 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, root)); + +// u32 sewingActEn; // 缝纫时动作允许, 0, 不允许; 1, 允许; +// // bit8 缝纫过程中进料允许 ; // 隐藏 + + +// u32 PullingPos; // 拉料电机拉料位置,单位 0.01mm //隐藏 +// u32 clipOpenLen; // 夹子开合保护距离(0~100.00mm, 范围0~100.00mm) //隐藏 + +// u32 llRunSpd; // 机械手拉料速度, 范围 1--1000,单位mm/s,默认 300 //隐藏 +// u32 llBakSpd; // 机械手返程速度, 范围 1--1000,单位mm/s,默认 300 //隐藏 +// u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 xymvlSpd; // xy空走运行速度, 范围 100--2000,单位mm/s,默认 300 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 100, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, index++, operate)); + +// u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + +// u32 WorkHeadMode; // 机头工作模式 , 范围0~1 1:单机头 0:双机头 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 57, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Head working mode"), + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Dual head:0;Single head:1"), 0, 0, index++, operate)); + +} + +#define OT_LOOSE_THREAD 0x0001 // 松紧线 打开 关闭 +#define OT_DCUT_THREAD 0x0004 // 下剪刀剪线 打开 关闭 +#define OT_OIL 0x0006 // 加油 打开 关闭 +#define OT_LIGHT 0x0007 // 照明灯 打开 关闭 +#define OT_SEW_LIFT 0x000E // 缝纫机头升降 上升 下降 +#define OT_SEW_BLOW 0x0010 // 缝纫吹气 打开 关闭 +#define OT_CRAMP_OPEN 0x0011 // 夹布 开合 +#define OT_TENS_OPEN 0x0012 // 张紧 开合 +#define OT_ROLL_OUT_DOWN 0x0014 // 出料压辊 升降 +#define OT_ROLL_IN_DOWN 0x0013 // 进料压辊 升降 +#define OT_ROLL_CUT_DOWN 0x0015 // 切料压杠 升降 + +#define MT_LIN 0x0016 // 进料电机 +#define MT_LPL 0x0017 // 拉料电机 +#define MT_LOT 0x0018 // 出料电机 +#define MT_LHM 0x0019 // 横切移动电机 +#define MT_LHX 0x001A // 横切旋刀电机 +#define MT_LBQ 0x001B // 边切刀电机 + +void AutoDoubleDoorMac::initOutCtrlList() +{ + int showPriority = 0; + m_allOutCtrlList.clear(); + + // X向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX)); + // Y向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY)); + // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor"),MT_LM)); + // 针电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Needle motor"),MT_LN)); + // 梭电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor"),MT_LH)); + // 升降电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor"),MT_LU)); + + //#define OT_LOOSE_THREAD 0x0001 // 松紧线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD)); + //#define OT_DCUT_THREAD 0x0004 // 下剪刀剪线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Cut the line with scissors"),OT_DCUT_THREAD)); + //#define OT_OIL 0x0006 // 加油 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Add oil"),OT_OIL)); + //#define OT_LIGHT 0x0007 // 照明灯 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Electric light"),OT_LIGHT)); + //#define OT_SEW_LIFT 0x000E // 缝纫机头升降 上升 下降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Sewing machine head lifting"),OT_SEW_LIFT)); + //#define OT_SEW_BLOW 0x0010 // 缝纫吹气 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Sewing and blowing air"),OT_SEW_BLOW)); + //#define OT_CRAMP_OPEN 0x0011 // 夹布 开合 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("textile"),OT_CRAMP_OPEN)); + //#define OT_TENS_OPEN 0x0012 // 张紧 开合 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("tensioning"),OT_TENS_OPEN)); + //#define OT_ROLL_OUT_DOWN 0x0014 // 出料压辊 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Discharge pressure roller"),OT_ROLL_OUT_DOWN)); + //#define OT_ROLL_IN_DOWN 0x0013 // 进料压辊 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Feed pressure roller"),OT_ROLL_IN_DOWN)); + //#define OT_ROLL_CUT_DOWN 0x0015 // 切料压杠 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Cutting pressure bar"),OT_ROLL_CUT_DOWN)); + + //#define MT_LIN 0x0016 // 进料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Feed motor"),MT_LIN)); + //#define MT_LPL 0x0017 // 拉料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Pulling motor"),MT_LPL)); + //#define MT_LOT 0x0018 // 出料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Discharge motor"),MT_LOT)); + //#define MT_LHM 0x0019 // 横切移动电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Transverse moving motor"),MT_LHM)); + //#define MT_LHX 0x001A // 横切旋刀电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Cross cutting rotary knife motor"),MT_LHX)); + //#define MT_LBQ 0x001B // 边切刀电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Edge cutter motor"),MT_LBQ)); + + +} + +void AutoDoubleDoorMac::initShortCutList() +{ + int index = 0; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING));//手动剪线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));//所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTUPDOWN));//机头升降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Enter the sewing state"),"buttonSewingState",FUN_CTB_INTO_SEW_STA));//进入绗缝状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Enter the material pulling state"),"buttonPullingState",FUN_CTB_INTO_PULL_STA));//进入拉料状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Cross Cut"),"chiselPoint",FUN_CTB_ONEKEY_CROSSCUT));//一键横切 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackOffset"),"buttonQuantityMoveFrame",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set Start Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + +} + +void AutoDoubleDoorMac::initParaSetList() +{ + +} + +#define DSS6_ADDR_02C4 0x02C4 // +// BIT1 : 进料压辊升 +// BIT2 : 出料压辊高 +// BIT3 : 夹布开 +// BIT4 : 张紧 放松 +// BIT5 : 出料压料升 +// BIT6 : 横切降速 +// BIT7 : 横切降速 +// BIT8 : 横切左限位 + +#define DSS6_ADDR_02C5 0x02C5 // +// BIT1 : 横切右限位 +// BIT2 : 一键横切按钮 +// BIT3 : 进料微调按钮 +// BIT4 : 退料微调按钮 + +#define DSS5_ST1_BKU1 0x0170 // 缝纫面线断线检测(1~8) + + +#define DSS3_HS_UZ1_POS 0x0080 //bit2 // 缝纫针2停车位 +#define DSS5_ST1_BKU1 0x0170 //bit2 // 缝纫面线断线检测 +#define DSS3_HS_DZ1_POS 0x0088 //bit2 // 缝纫梭2停车位 +#define DSS2_UD_SU1_POS 0x0040 //bit2 // 缝纫机头2 高位 +#define DSS2_UD_SD1_POS 0x0042 //bit2 // 缝纫机头2 低位 +#define DSS2_F1_PLIMT_POS 0x0023 //bit3 // x2 限位+ +#define DSS2_F1_NLIMT_POS 0x0022 //bit3 // x2 限位- +#define DSS2_F1_ZERO_POS 0x0020 //bit3 // x2 零位 + + +void AutoDoubleDoorMac::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 0, tr("Feeding roller lift")));//进料压辊升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 1, tr("High discharge pressure roller")));//出料压辊高 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 2, tr("High discharge pressure roller")));//夹布开 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 3, tr("Tighten and relax")));// BIT4 : 张紧 放松 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 4, tr("Discharge pressure material lift")));// 出料压料升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 5, tr("Horizontal speed reduction") + "1"));// 横切降速 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 6, tr("Horizontal speed reduction") + "2"));// 横切降速 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 7, tr("Horizontal left limit")));// 横切左限位 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 0, tr("Horizontal right limit position")));// 横切右限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 1, tr("One click cross cutting button")));// 一键横切按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 2, tr("Feed fine-tuning button")));// 进料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 3, tr("Return material fine adjustment button")));// 退料微调按钮 + + QString sewingdetection = tr("Sewing thread breakage detection");// 缝纫面线断线检测 + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 0, sewingdetection + "1")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 1, sewingdetection + "2")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 2, sewingdetection + "3")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 3, sewingdetection + "4")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 4, sewingdetection + "5")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 5, sewingdetection + "6")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 6, sewingdetection + "7")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 7, sewingdetection + "8")); + + +//#define DSS3_HS_UZ1_POS 0x0080 // 缝纫针2停车位 + m_tempSensorList.append(makeASensorItem(DSS3_HS_UZ1_POS, 1, tr("Sewing needle parking space 2")));// 缝纫针2停车位 +//#define DSS5_ST1_BKU1 0x0170 // 缝纫面线断线检测 + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 1, tr("Sewing thread breakage detection")));// 缝纫面线断线检测 +//#define DSS3_HS_DZ1_POS 0x0088 // 缝纫梭2停车位 + m_tempSensorList.append(makeASensorItem(DSS3_HS_DZ1_POS, 1, tr("Sewing shuttle parking spaces 2")));// 缝纫梭2停车位 +//#define DSS2_UD_SU1_POS 0x0040 // 缝纫机头2 高位 + m_tempSensorList.append(makeASensorItem(DSS2_UD_SU1_POS, 1, tr("Sewing machine head 2 high position")));// 缝纫机头2高位 +//#define DSS2_UD_SD1_POS 0x0042 // 缝纫机头2 低位 + m_tempSensorList.append(makeASensorItem(DSS2_UD_SD1_POS, 1, tr("Sewing machine head 2 low position")));// 缝纫机头2低位 +//#define DSS2_F1_PLIMT_POS 0x0023 // x2 限位+ + m_tempSensorList.append(makeASensorItem(DSS2_F1_PLIMT_POS, 2, tr("x2 Limit position+")));// x2 限位+ + +//#define DSS2_F1_NLIMT_POS 0x0022 // x2 限位- + m_tempSensorList.append(makeASensorItem(DSS2_F1_NLIMT_POS, 2, tr("x2 Limit position-")));// x2 限位- + m_tempSensorList.append(makeASensorItem(DSS2_F1_NLIMT_POS, 0, tr("x1 Limit position-")));// x1 限位- + m_tempSensorList.append(makeASensorItem(DSS2_F1_NLIMT_POS, 1, tr("y1 Limit position-")));// y1 限位- + +//#define DSS2_F1_ZERO_POS 0x0020 // x2 零位 + m_tempSensorList.append(makeASensorItem(DSS2_F1_ZERO_POS, 2, tr("x2 Zero position")));// x2 零位 + + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + + + +#define ERR_FEED_ROLLER 0x0200 // 进料压辊 异常 +#define ERR_DIS_ROLLER 0x0201 // 出料压辊 异常 +#define ERR_DIS_MATERIAL 0x0202 // 出料压料 异常 +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 +#define ERR_LIFT_TIMEOUT 0x005F // 机头升降超时 +#define ERR_RETURN_LIFT 0x0217 // 退料升降装置 异常 + +#define ERR_HEAD_NOT_SAFE 0x0060 // 机头不在安全区域 +#define ERRQUI_LIGHTCURTAINS 0x00010057 // 光幕介入 +#define ERRQUI_UPER_TBREAK 0x00010058 // 面线断线 +#define ERRQUI_BOBBIN_TBREAK 0x00010059 // 底线断线 +#define ERRQUI_UPER_TBREAK1 0x0001005A // 机头1断线面线断线 +#define ERRQUI_UPER_TBREAK2 0x0001005B // 机头2断线面线断线 +#define ERRQUI_LIFT_TIMEOUT 0x0001005F // 机头升降超时 + +void AutoDoubleDoorMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_ROLLER,tr("Abnormal feeding pressure roller")));// 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_ROLLER,tr("Abnormal discharge pressure roller")));// 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_MATERIAL,tr("Abnormal discharge and pressing")));// 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLOTH_DEVICE,tr("Abnormal cloth clamping device")));// 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CROSS_MOTOR,tr("Cross cutting motor abnormality")));// 横切电机 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout")));// 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_RETURN_LIFT,tr("Abnormality of Unloading Lifting Device")));// 退料升降装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area")));// 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Light curtain intervention")));// 光幕介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("upper thread break")));// 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("bobbin thread break")));// 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK1,tr("Head 1 has a broken surface wire")));// 机头1断线面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK2,tr("Head 2 has a broken surface wire")));// 机头2断线面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout")));// 机头升降超时 + +} diff --git a/mctype/patternsingleboard/function/autodoubledoormac.h b/mctype/patternsingleboard/function/autodoubledoormac.h new file mode 100644 index 0000000..21d2551 --- /dev/null +++ b/mctype/patternsingleboard/function/autodoubledoormac.h @@ -0,0 +1,35 @@ +#ifndef AUTODOUBLEDOORMAC_H +#define AUTODOUBLEDOORMAC_H + +#include + +#include "mctype/machinetypefun.h" + +/// +/// \brief The AutoDoubleDoorMac class 全自动双龙门单机头 +/// +class AutoDoubleDoorMac : public MachineTypeFun +{ + Q_OBJECT +public: + AutoDoubleDoorMac(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; + +#endif // AUTODOUBLEDOORMAC_H diff --git a/mctype/patternsingleboard/function/clothingmac.cpp b/mctype/patternsingleboard/function/clothingmac.cpp new file mode 100644 index 0000000..9ce4f55 --- /dev/null +++ b/mctype/patternsingleboard/function/clothingmac.cpp @@ -0,0 +1,1384 @@ +#include "clothingmac.h" + +ClothingMac::ClothingMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +ClothingMac::~ClothingMac() +{ + +} + +void ClothingMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTING,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void ClothingMac::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + + //花样参数-花样设置参数-定位点x;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_ANCHORX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Anchor") + ("X"),//定位点X + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0001, operate)); + + //花样参数-花样设置参数-定位点y;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_ANCHORY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Anchor") + ("Y"),//定位点Y + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0002, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, 0x0005, operate)); + } + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,0x0006, operate)); + + //花样参数--------------------------- +} + +void ClothingMac::initMcParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + + //模版识别装置, 范围0-3,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Template recognition device"),//模版识别装置 + 0, 0, 3, 0, 0, tr(""), tr(""), + //无装置: 0;条形码:1;编码孔:2;多文件选择:3 + tr("No device:0;Bar code:1;Coding hole:2;Multiple files:3"), + 0, 0, 0x0001, root)); + + //X框传感器坐标, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 50, 0, 0, PARA_VALUE_TYPE_INT, + tr("X frame sensor coordinates"),//X框传感器坐标 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //Y框传感器坐标, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y frame sensor coordinates"),//Y框传感器坐标 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴停车传感器角度, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),//主轴停车传感器角度 + 0, S32_MIN, S32_MAX, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //升降传感器坐标, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lift sensor coordinates"),//升降传感器坐标 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴勾线传感器角度, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 56, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle of spindle hook sensor"),//主轴勾线传感器角度 + 0, S32_MIN, S32_MAX, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴点动停车角度, 范围:-36000-36000,默认8500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 62, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle jog parking angle"),//主轴点动停车角度 + 8500, -36000, 36000, 8500, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //X可移动区域负边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 70, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area negative boundary"),//X可移动区域负边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //X可移动区域正边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 71, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //Y可移动区域负边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 72, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area negative boundary"),//Y可移动区域负边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //Y可移动区域正边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 73, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //X可缝纫区域负边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 84, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area negative boundary"),//X可缝纫区域负边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //X可缝纫区域正边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 85, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area positive boundary"),//X可缝纫区域正边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //Y可缝纫区域负边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 86, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area negative boundary"),//Y可缝纫区域负边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //Y可缝纫区域正边界, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 87, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area positive boundary"),//Y可缝纫区域正边界 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy启动停止速度, 范围1-100,默认10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 100, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY start stop speed"),//xy启动停止速度 + 10, 1, 100, 10, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy归零运行速度, 范围1-500,默认100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 101, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY zero running speed"),//xy归零运行速度 + 100, 1, 500, 100, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy空走运行速度, 范围1-1700,默认300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 102, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY simulate running speed"),//xy空走运行速度 + 300, 1, 1700, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy行走加速度, 范围1-10000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 103, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY movement acceleration"),//xy行走加速度 + 1000, 1, 10000, 1000, 0, tr("mm/s2"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy刹车加速度, 范围1-10000,默认10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 104, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY brake acceleration"),//xy刹车加速度 + 10000, 1, 10000, 10000, 0, tr("mm/s2"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy手动移动速度1, 范围1-1000,默认10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 105, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 1"),//xy手动移动速度1 + 10, 1, 1000, 10, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy手动移动速度2, 范围1-1000,默认100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 106, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 2"),//xy手动移动速度2 + 100, 1, 1000, 100, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy手动移动速度3, 范围1-1000,默认300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 107, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 3"),//xy手动移动速度3 + 300, 1, 1000, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //xy最高移动速度, 范围1-1700,默认300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 108, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY maximum moving speed"),//xy最高移动速度 + 300, 1, 1700, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴启动停止转速, 范围1-1000,默认100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 109, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"),//主轴启动停止转速 + 100, 1, 1000, 100, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴归零转速, 范围1-3000,默认120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle zero reset speed"),//主轴归零转速 + 120, 1, 3000, 120, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴运转转速, 范围1-3000,默认300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 111, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle running speed"),//主轴运转转速 + 300, 1, 3000, 300, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴运转加速度, 范围1-100,默认50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 112, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle running acceleration"),//主轴运转加速度 + 50, 1, 100, 50, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴刹车加速度, 范围1-100,默认100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 113, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle brake acceleration"),//主轴刹车加速度 + 100, 1, 100, 100, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴缝纫最高转速, 范围1-3000,默认1200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 114, 0, 0, PARA_VALUE_TYPE_INT, + tr("sewing maximum speed"),//主轴缝纫最高转速 + 1200, 1, 3000, 1200, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0089, root)); + + + //主轴归零补偿角度, 范围:-1000-1000,默认200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 146, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle zeroing compensation angle"),//主轴归零补偿角度 + 200, -1000, 1000, 200, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //X间隙补偿, 范围-200-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 175, 0, 0, PARA_VALUE_TYPE_INT, + tr("X gap compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, repair)); + + //Y间隙补偿, 范围-200-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 177, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y gap compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, repair)); + +} + +void ClothingMac::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + //主轴缝纫工作转速, 范围1-3600,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing main shaft working speed"),//主轴缝纫工作转速 + 2000, 1, 3600, 2000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //主轴剪线转速, 范围1-500,默认120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle cutting speed"),//主轴剪线转速 + 120, 1, 500, 120, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴回针转速, 范围1-1000,默认200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle needle return speed"),//主轴回针转速 + 200, 1, 1000, 200, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //主轴启动慢动转速, 范围1-1000,默认200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start slow speed"),//主轴启动慢动转速 + 200, 1, 1000, 200, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //倒车等效主轴转速, 范围1-3000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reverse equivalent spindle speed"),//倒车等效主轴转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //缝纫动框方式, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement mode"),//缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("XY continuous:0;XY intermittent:1"),//XY连续动框:0;XY间歇动框:1 + 0, 0, 0x0001, operate)); + + //缝纫动框起始角度, 范围0-36000,默认24000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing frame start angle"),//缝纫动框起始角度 + 24000, 0, 36000, 24000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //缝纫动框持续角度, 范围0-36000,默认24000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing frame steadiness angle"),//缝纫动框持续角度 + 24000, 0, 36000, 24000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //起针慢动针数, 范围0-10,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Slow stitch at beginning"),//起针慢动针数 + 3, 0, 10, 3, 0, tr("Needle"), tr(""),//针 + tr(""), + 0, 0, 0x0001, operate)); + + //起针动作松线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 9, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Needle action, thread loosen allowed"),//起针动作松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //起针动作顶线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 9, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Needle action,tight bobbin spring allowed"),//起针动作顶线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //起针动作夹线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 9, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Needle action, catch upper thread allowed"),//起针动作夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //剪线允许, 范围0-3,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut thread allowed"),//剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + //不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + tr("Do not trim:0;Automatic:1;Last trimming:2;Data trimming:3"), + 0, 0, 0x0001, operate)); + + //剪线分线角度, 范围0-36000,默认20000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimmer cutting angle"),//剪线分线角度 + 20000, 0, 36000, 20000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //剪线完成角度, 范围0-36000,默认6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming completion angle"),//剪线完成角度 + 6000, 0, 36000, 6000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //剪线时动作松线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Thread cut, upper thread loosen allowed"),//剪线时动作松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //剪线时动作拉线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Thread cut, tensile thread allowed"),//剪线时动作拉线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //剪线时动作夹线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Thread cut, catch upper thread allowed"),//剪线时动作夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //剪线时动作提升压脚允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Thread cut, presser foot lift allowed"),//剪线时动作提升压脚允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //断线检测针数, 范围0-10,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("Stitch detect if thread broken"),//断线检测针数 + 3, 0, 10, 3, 0, tr("Needle"), tr(""),//针 + tr(""), + 0, 0, 0x0001, operate)); + + //断线检测主轴角度, 范围0-36000,默认3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread brake detection, main shaft angle"),//断线检测主轴角度 + 3000, 0, 36000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //换梭芯提醒功能, 范围0-3,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 16, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Bobbin change reminder function"),//换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), + //不提醒: 0;按长度延时提醒:1;按片数提醒:2;按长度立刻提醒:3 + tr("Not enabled: 0;Delay reminder by length:1;Count by number of slices:2;Immediately reminder by length:3"), + 0, 0, 0x0001, operate)); + + //底线长度, 范围0-最大,默认10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin thread length"),//底线长度 + 3, 0, S32_MAX, 3, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //每针底线修正量, 范围 最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin thread correction per stitch"),//每针底线修正量 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //换梭片数计数, 范围0-10,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin change as per sewed pieces"),//换梭片数计数 + 3, 0, 10, 3, 0, tr("times"), tr(""),//次 + tr(""), + 0, 0, 0x0001, operate)); + + //加油方式选择, 范围0-3,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 20, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Oiling mode selection"),//加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""), + //不加油: 0;按时间加油:1;按针数加油:2;持续加油:3 + tr("No oil:0;Oiling by time:1;Oiling by stitches:2;Oiling continously:3"), + 0, 0, 0x0001, operate)); + + //加油针数间隔, 范围0-最大,默认10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Oiling interval by needle stitch"),//加油针数间隔 + 10000, 0, S32_MAX, 10000, 0, tr("Needle"), tr(""),//针 + tr(""), + 0, 0, 0x0001, operate)); + + //加油时间间隔, 范围1-最大,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Oiling interval by working time"),//加油时间间隔 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //针加油持续时长, 范围1-最大,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 23, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle Oiling sustained time"),//针加油持续时长 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //完成后停车位置选择, 范围0-4,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Stop position selection after work complete"),//完成后停车位置选择 + 0, 0, 4, 0, 0, tr(""), tr(""), + //当前位置:0;起始点:1;定位点:2;上料点:3;偏移点:4 + tr("Current:0;Start:1;Anchor:2;Feeding:3;Offset:4"), + 0, 0, 0x0001, operate)); + + //偏移点坐标有效标志, 范围0-3,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 25, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Valid flag for offset point coordinates"),//偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + //无效:0;X有效:1;Y有效:2;XY同时有效:3 + strInvalid, + 0, 0, 0x0001, operate)); + + //偏移点坐标X, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 26, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),//偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //偏移点坐标Y, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 27, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),//偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //穿线点坐标有效标志, 范围0-3,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 28, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate valid symbol"),//穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + //无效:0;X有效:1;Y有效:2;XY同时有效:3 + strInvalid, + 0, 0, 0x0001, operate)); + + //穿线点坐标X, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),//穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //穿线点坐标Y, 范围:最小-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 30, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),//穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //产量预设, 范围0-S32_MAX,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),//产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //气框关闭后延时, 范围0-2000,默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Delay after pneumatic frame off"),//气框关闭后延时 + 500, 0, 2000, 500, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //缝纫加速度, 范围1-100,默认5 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing acceleration"),//缝纫加速度 + 5, 1, 100, 5, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //剪线动框位移, 范围0-5000,默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),//剪线动框位移 + 500, 0, 5000, 500, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //自动回穿线点允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 38, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic move to threading point allowed"),//自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, operate)); + + //大压脚动作允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 38, 7, 0, PARA_VALUE_TYPE_LIST, + tr("Large presser foot action allowed"),//大压脚动作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //缝纫间越框机头升降, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 46, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing move head up down"),//缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //移框松线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 48, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Moving basket Loose line"),//移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //移框夹线允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 48, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Moving basket Clamp line"),//移框夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //软件限位XY移动允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 49, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),//软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //面线勾线针数, 范围0-5,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of Needle hooks"),//面线勾线针数 + 1, 0, 5, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //剪线动框方向, 范围0-4,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 57, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Trimming frame direction"),//剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + tr("No:0;left:1;Forward:2;Right:3;Backward:4"),//不移动:0;向左:1;向前:2;向右:3;向后:4 + 0, 0, 0x0001, root)); + + //主轴拐角转速, 范围1-3000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 59, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),//主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //降速最小偏差角度, 范围0-180,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 60, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),//降速最小偏差角度 + 0, 0, 180, 0, 0, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //提前降速针步, 范围0-20,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 61, 0, 0, PARA_VALUE_TYPE_INT, + tr("Early speed reduction"),//提前降速针步 + 0, 0, 20, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //延迟提速针步, 范围0-20,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 62, 0, 0, PARA_VALUE_TYPE_INT, + tr("Delayed speed step"),//延迟提速针步 + 0, 0, 20, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //安全输入红外允许, 范围0-1,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 101, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Secure input light curtain allows"),//安全输入红外允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //安全输入气压允许, 范围0-1,默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 101, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Safety input pressure allowed"),//安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, root)); + + //自动气框关闭允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 102, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic frame off"),//自动气框关闭允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, operate)); + + //自动气框打开允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 102, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Penumatic frame on"),//自动气框打开允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, operate)); + + //自动气框闭合延时, 范围0-5000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 103, 0, 0, PARA_VALUE_TYPE_INT, + tr("Penumatic frame on"),//自动气框闭合延时 + 0, 0, 5000, 0, 0, tr("ms"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //循环工作允许, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 105, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Loop work allowed"),//循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//不允许:0;允许:1 + 0, 0, 0x0001, operate)); + + //梭加油持续时长, 范围0-最大,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle Oiling sustained time"),//梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //缝纫运行速度1, 范围1-5000,默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 170, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing operation speed 1"),//缝纫运行速度1 + 500, 1, 5000, 500, 0, tr("r/min"), tr(""),//次 + tr(""), + 0, 0, 0x0001, root)); + + //缝纫运行速度2, 范围1-5000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 171, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing operation speed 2"),//缝纫运行速度2 + 1000, 1, 5000, 1000, 0, tr("r/min"), tr(""),//次 + tr(""), + 0, 0, 0x0001, root)); + + //缝纫运行速度3, 范围1-5000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 172, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing operation speed 3"),//缝纫运行速度3 + 1500, 1, 5000, 1500, 0, tr("r/min"), tr(""),//次 + tr(""), + 0, 0, 0x0001, root)); + + //更换缝纫针计数值, 范围0-S32_MAX,默认500000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 190, 0, 0, PARA_VALUE_TYPE_INT, + tr("Change the sewing needle count value"),//更换缝纫针计数值 + 500000, 0, S32_MAX, 500000, 0, tr("times"), tr(""),//次 + tr(""), + 0, 0, 0x0001, root)); +} + +void ClothingMac::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + + QString strEnable = tr("Enable"); //使能 + QString disableStr = tr("Disable"); //失能 + QString strJogP = tr("JogP"); //正转 + QString jogNStr = tr("JogN"); //反转 + QString zeroStr = tr("Zero"); //归零 + QString openStr = tr("Open"); //打开 + QString closeStr = tr("Close");//关闭 + QString upStr = tr("Up"); //上升 + QString downStr = tr("Down");//下降 + QString extStr = tr("Extend"); //伸出 + QString backStr = tr("Back");//收回 + QString comStr = tr("Combine"); //结合 + QString sepStr = tr("Separate");//分离 + //QString testStr = tr("Test");//测试 + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("X to move motor"),MT_LX,// X向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0002,tr("Y to move motor"),MT_LY,// Y向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0003,tr("Spindle motor"),MT_LM,// 主轴电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0004,tr("Needle motor"),MT_LN,// 针电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0005,tr("Shuttle motor"),MT_LH,// 梭电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0006,tr("Lifting motor"),MT_LU,// 升降电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + disableStr,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + zeroStr,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0007,tr("Frame"),OT_FRAME,// 气框 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0008,tr("Big foot"),OT_BIT_FOOT,// 大压脚 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + upStr,true,OUTCONTROL_OPEN,-1,-1, + downStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0009,tr("Middle foot"),OT_MID_FOOT,// 中压脚 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + upStr,true,OUTCONTROL_OPEN,-1,-1, + downStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000A,tr("Buckle the bottom line"),OT_PUSH_BTRD,// 扣底线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000B,tr("Top and bottom lines"),OT_STAND_BTRD,// 顶底线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000C,tr("Lower scissors to cut thread"),OT_DCUT_THREAD,// 下剪刀剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000D,tr("Sandwich line"),OT_CLIP_UTRD,// 夹面线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000E,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x000F,tr("Elastic thread 2"),OT_LOOSE_UTRD2,// 第二松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0010,tr("Laser control"),OT_LASER_CTRL,// 激光控制 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0011,tr("Laser blow"),OT_LASER_BLOW,// 激光控制 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0012,tr("Oil"),OT_OIL,// 加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0013,tr("Headlamp"),OT_LIGHT,// 照明灯 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0014,tr("Sewing Blow"),OT_SEW_BLOW,// 缝纫吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0015,tr("Hookline ext"),OT_CLIP_EXTEND,// 勾线伸出 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + extStr,true,OUTCONTROL_OPEN,-1,-1, + backStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0016,tr("Hookline open and close"),OT_CLIP_EXTEND,// 勾线开合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0016,tr("Scan code test"),OT_CLIP_EXTEND,// 扫码测试 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // testStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0016,tr("Sewing machine head lifting"),OT_SEW_LIFT,// 缝纫机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + upStr,true,OUTCONTROL_OPEN,-1,-1, + downStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0017,tr("Spindle clutch"),OT_HEAD_L_CLUTH,// 主轴离合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + comStr,true,OUTCONTROL_OPEN,-1,-1, + sepStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0018,tr("Pen"),OT_PEN_DOWN_C,// 画笔 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + upStr,true,OUTCONTROL_OPEN,-1,-1, + downStr,true,OUTCONTROL_CLOSE,-1,-1)); +} + +void ClothingMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("All to zero"),"buttonAllToZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Needle shuttle reset"),"buttonNeedleShuttleReset",FUN_NEEDLESHUTTLERESET));//针梭校对 + //m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back thread"),"buttonBackThread",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back offset"),"buttonBackOffsetPoint",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back shuttle"),"buttonBackShuttle",FUN_BACKSHUTTLE));//回换梭位 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back work"),"buttonBackWorkPoint",FUN_BACKWORKPOINT));//回工作点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Set anchor"),"buttonSetAnchorPoint",FUN_SETANCHORPOINT));//定定位点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back anchor"),"buttonBackAnchorPoint",FUN_BACKANCHORPOINT));//回定位点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back start"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back start"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Forwrak or back"),"buttonForwardOrBack",FUN_FORWARDORBACK));//前进回退 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Bottom count reset"),"buttonShutCount",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING)); + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET)); + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS)); +} + +void ClothingMac::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +} + +void ClothingMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +void ClothingMac::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +void ClothingMac::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" + " "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +void ClothingMac::initErrorCodeAndStateList() +{ + //暂时无专用的错误代码,都为通用的 + m_allErrorCodeAndStateList.clear(); +} diff --git a/mctype/patternsingleboard/function/clothingmac.h b/mctype/patternsingleboard/function/clothingmac.h new file mode 100644 index 0000000..b1afa6e --- /dev/null +++ b/mctype/patternsingleboard/function/clothingmac.h @@ -0,0 +1,39 @@ +#ifndef CLOTHINGMAC_H +#define CLOTHINGMAC_H + +#include "mctype/machinetypefun.h" + +#define OT_PEN_DOWN_C 0x0028 // 画笔升降 + +//服装机 +class ClothingMac : public MachineTypeFun +{ + Q_OBJECT +public: + ClothingMac(); + ~ClothingMac(); +public: + void initNinebtn1234(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +signals: + +public slots: +}; + +#endif // CLOTHINGMAC_H diff --git a/mctype/patternsingleboard/function/cuttingwalk.cpp b/mctype/patternsingleboard/function/cuttingwalk.cpp new file mode 100644 index 0000000..051ff7f --- /dev/null +++ b/mctype/patternsingleboard/function/cuttingwalk.cpp @@ -0,0 +1,1914 @@ +#include "cuttingwalk.h" + +CuttingWalk::CuttingWalk() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化文件设置功能列表 + initFileSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +CuttingWalk::~CuttingWalk() +{ + +} + +//初始化九宫格功能按键 +void CuttingWalk::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_ALLTOZERO,"buttonAllToZero"));//全部归零 + m_nineBtn.insert(2,NineItem(FUN_CUT_SETANCHORPOINT,"buttonSetEmbPoint"));//定定位点 + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset"));//流程复位 + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus"));// 模拟工作状态 +} + +void CuttingWalk::initFileInfoLabel() +{ + m_fileInfo.append(FileName);//文件名 + // m_fileInfo.append(Index); + m_fileInfo.append(Schedule);//进度 + m_fileInfo.append(BeginPoint);//起始点 + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position);//位置 + m_fileInfo.append(Production);//产量 +} + +//花样参数 +void CuttingWalk::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 拐点转角判断度数 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_CRUTCH_ANG, 0, 0, PARA_VALUE_TYPE_INT, + tr("Judgment degree of turning point and angle"), + 60, 0, 180, 60, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0,0x0001, operate)); + + // 分割数据步长,单位0.01mm (0.01~20.00) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_LINE_STP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Split data step size"), + 5000, 1000, 5000, 5000, 2, "mm", tr(""), + tr(""), 0, 0,0x0001, operate)); + + // X向可切割长度,单位0.01mm (1000.00~10000.00) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_X_LENGH, 0, 0, PARA_VALUE_TYPE_INT, + tr("X-direction cutting length"), + 500000, 100000, 1000000, 500000, 2, "mm", tr(""), + tr(""), 0, 0,0x0001, operate)); + + // 切割两端补偿,单位0.01mm (0.00~100.00) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_RNF_COMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Compensation for cutting both ends"), + 1000, 0, 10000, 1000, 2, "mm", tr(""), + tr(""), 0, 0,0x0001, operate)); + + // 切割垂直补偿,单位0.01mm (0.00~100.00) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_Vert_COMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Vertical compensation for cutting"),//切割垂直补偿 + 1000, 0, 10000, 1000, 2, "mm", tr(""), + tr(""), 0, 0,0x0001, operate)); + + //是否启用画笔 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_PLT , + CUT_ENABLE_BRUSH, 0, 0, PARA_VALUE_TYPE_SW, + tr("Enable brushes"), + 1, 0, 1, 1, 0, "", tr(""), + tr(""), 0, 0,0x0001, operate)); +} + +//机器参数 +void CuttingWalk::initMcParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + // 刀座1安装刀类型 + //0,无 1,圆刀 2,震刀 3,铣刀 4,偏心刀1 5,偏心刀2 6,画笔 7,尖刀 8,钻孔 9,压轮 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Knife holder 1 installation knife type"),//刀座1安装刀类型 + 0, 0, 9, 0, 0, tr(""), tr(""), + //无:0;圆刀:1;震刀:2; + strRoundShockknife,0, 0, 0x0001, operate)); + + // 刀座2安装刀类型 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Knife holder 2 installation knife type"),//刀座2安装刀类型 + 0, 0, 9, 0, 0, tr(""), tr(""), + strRoundShockknife,0, 0, 0x0001, operate)); + + // 刀座3安装刀类型 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Knife holder 3 installation knife type"),//刀座3安装刀类型 + 0, 0, 9, 0, 0, tr(""), tr(""), + strRoundShockknife,0, 0, 0x0001, root)); + + //13 + // X向格子数,范围0-24 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of X-direction grids"),//X向格子数 + 0, 0, 24, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //Y向格子数,范围0-19 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of Y-direction grids"),//Y向格子数 + 0, 0, 19, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // X向采集长度,单位mm,范围-5000-5000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 15, 0, 0, PARA_VALUE_TYPE_INT, + tr("X-direction acquisition length"),//X向采集长度 + 0, -5000, 5000, 0, 0, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // Y向采集长度,单位mm,范围-5000-5000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y-direction acquisition length"),//Y向采集长度 + 0, -5000, 5000, 0, 0, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // X向采集起始位置,单位mm,范围-5000-5000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting position of X-direction collection"),//X向采集起始位置 + 0, -5000, 5000, 0, 0, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // Y向采集起始位置,单位mm,范围-5000-5000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_DETECT, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting position of Y-direction collection"),//Y向采集起始位置 + 0, -5000, 5000, 0, 0, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // X框传感器坐标,单位 0.01mm,范围-500000-500000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("X-box sensor coordinates"),//X框传感器坐标 + 0, -500000, 500000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // Y框传感器坐标,单位 0.01mm,范围-500000-500000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y-box sensor coordinates"),//Y框传感器坐标 + 0, -500000, 500000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座1升降传感器高度,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 lifting sensor height"),//刀座1升降传感器高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 刀座2升降传感器高度,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 23, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 lifting sensor height"),//刀座2升降传感器高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 刀座3升降传感器高度,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 24, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 3 lifting sensor height"),//刀座3升降传感器高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 25 + // 刀座1旋转传感器角度,单位0.01度,范围0-36000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 25, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 rotation sensor angle"),//刀座1旋转传感器角度 + 0, 0, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座1旋转找零补偿,单位0.01度,范围-1000-1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 26, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 rotation zero compensation"),//刀座1旋转找零补偿 + 0, -36000, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座2旋转传感器角度,单位0.01度,范围0-36000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 27, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 rotation sensor angle"),//刀座2旋转传感器角度 + 0, 0, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座2旋转找零补偿,单位0.01度,范围-1000-1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 rotation zero compensation"),//刀座2旋转找零补偿 + 0, -36000, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座3旋转传感器角度,单位0.01度,范围0-36000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 3 rotation sensor angle"),//刀座3旋转传感器角度 + 0, 0, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座3旋转找零补偿,单位0.01度,范围-1000-1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 30, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 3 rotation zero compensation"),//刀座3旋转找零补偿 + 0, -36000, 36000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + + // 40 + // 可移动区域(X-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (X -)"),//可移动区域(X-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(X+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (X +)"),//可移动区域(X+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(Y-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (Y-)"),//可移动区域(Y-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(Y+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (Y+)"),//可移动区域(Y+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // x可切割区域负边界(X-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Negative boundary of X cuttable region(X-)"),//x可切割区域负边界(X-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // x可切割区域正边界(X+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 45, 0, 0, PARA_VALUE_TYPE_INT, + tr("Positive boundary of the X cutting region(X+)"),//x可切割区域正边界(X+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // y可切割区域正边界(Y-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 46, 0, 0, PARA_VALUE_TYPE_INT, + tr("Negative boundary of Y cuttable region(Y-)"),//y可切割区域负边界(Y-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // y可切割区域正边界(Y+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 47, 0, 0, PARA_VALUE_TYPE_INT, + tr("Positive boundary of the Y cutting region(Y+)"),//y可切割区域正边界(Y+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + + //画笔相对位置X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 64, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush relative position")+ " " + ("X"),//画笔相对位置X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //画笔相对位置Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 65, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush relative position")+" "+("Y"),//画笔相对位置Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //66 + // 刀座1相对位置X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 66, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 relative position")+ " " + ("X"),//刀座1相对位置X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座1相对位置Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 67, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 relative position")+" "+("Y"),//刀座1相对位置Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 刀座2相对位置X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 68, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 relative position")+ " " + ("X"),//刀座2相对位置X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 刀座2相对位置Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 69, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 relative position")+" "+("Y"),//刀座2相对位置Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 刀座1升降上限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 80, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder") + " 1 " + strLiftingUpperLimit,//刀座1升降上限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座1升降下限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 81, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 1 lifting lower limit"),//刀座1升降下限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座2升降上限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 82, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder") + " 2 " + strLiftingUpperLimit,//刀座2升降上限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座2升降下限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 83, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 2 lifting lower limit"),//刀座2升降下限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座3升降上限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 84, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder") + " 3 " + strLiftingUpperLimit,//刀座3升降上限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀座3升降下限,单位0.01mm,范围-100-10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 85, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife holder 3 lifting lower limit"),//刀座3升降下限 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //86 + // 圆刀加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 86, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool lifting during circular cutting"),//圆刀加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 圆刀加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 87, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool drop during circular cutting"),//圆刀加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 圆刀加工抬刀角度,范围 0--18000,单位0.01度 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 88, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle of tool lifting during circular cutting"),//圆刀加工抬刀角度 + 0, -100, 18000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //89 + // 震刀加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 89, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool lifting Shock knife"),//震刀加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 震刀加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 90, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool drop Shock knife"),//震刀加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 震刀加工抬刀角度,范围 0--18000,单位0.01度 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 91, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle of tool lifting Shock knife"),//震刀加工抬刀角度 + 0, -100, 18000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //92 + // 铣刀加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 92, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool lifting milling cutter"),//铣刀加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 铣刀加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 93, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool drop milling cutter"),//铣刀加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 铣刀加工抬刀角度,范围 0--18000,单位0.01度 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 94, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle of tool lifting milling cutter"),//铣刀加工抬刀角度 + 0, -100, 18000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //95 + // 偏心刀1加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 95, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + " 1 " + tr("machining lifting height"),//偏心刀1加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀1加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 96, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + " 1 " + tr("machining tool drop height"),//偏心刀1加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀2加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 97, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + " 2 " + tr("machining lifting height"),//偏心刀2加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 偏心刀2加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 98, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + " 2 " + tr("machining tool drop height"),//偏心刀2加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //99 + // 压轮加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 99, 0, 0, PARA_VALUE_TYPE_INT, + tr("Tool lifting height during wheel pressing processing"),//压轮加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 压轮加工落刀高度,范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 100, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height of tool drop during wheel pressing"),//压轮加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 压轮加工抬刀角度,范围 0--18000,单位0.01度 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 101, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pressing wheel processing tool lifting angle"),//压轮加工抬刀角度 + 0, -100, 18000, 0, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //102 + // 钻孔刀加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 102, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lifting height of drilling tool"),//钻孔刀加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 钻孔刀加工落刀高度 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 103, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting height of drilling tool during machining"),//钻孔刀加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //103 + // 刀笔加工抬刀高度, 范围 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 104, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife and pen lifting height"),//刀笔加工抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀笔加工落刀高度 -100--10000,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 105, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife and pen drop height"),//刀笔加工落刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + + //刀压检测工装抬刀高度 单位0.01mm 范围 -100--10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 106, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife pressure detection tool lifting height"),//刀压检测工装抬刀高度 + 0, -100, 10000, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //偏心刀1拐角升降,单位0.01mm 范围-500-500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 107, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + (" 1 ") + tr("corner lifting"),//偏心刀1拐角升降 + 0, -500, 500, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //偏心刀2拐角升降,单位0.01mm 范围-500-500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 108, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + (" 2 ") + tr("corner lifting"),//偏心刀2拐角升降 + 0, -500, 500, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 109 + // 工作过程中抬刀高度,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 109, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lifting height of the knife during the working process"),//工作过程中抬刀高度 + 0, -500, 500, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 110 + // 过窗电机编码器比例系数, 范围0~1000.00 单位:pulse/mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Proportional coefficient of window motor encoder"),//过窗电机编码器比例系数 + 0, 0, 100000, 0, 2, "pulse/mm", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 130 + // XY归零运行速度, 范围 1--100,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 130, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY zero running speed"),//XY归零运行速度 + 100, 1, 100, 100, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // XY空走运行速度, 范围 100--1500,单位mm/s,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_SPEED), + 131, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"),//XY空走运行速度 + 200, 100, 1500, 200, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度1, 范围 10--50,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 132, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 1"),//xy手动移动速度1 + 10, 10, 50, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度2, 范围 50--200,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 133, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 2"),//xy手动移动速度2 + 100, 50, 200, 100, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度3, 范围 200--500,单位mm/s,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 134, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 3"),//xy手动移动速度3 + 200, 200, 500, 200, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 135 + // 升降归零速度,单位mm/s,范围1-50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 135, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero speed of lifting and lowering"),//升降归零速度 + 10, 1, 50, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 升降空走速度,范围 10-1000, 单位mm/s,默认 50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 136, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lifting and descending speed"),//升降空走速度 + 50, 10, 1000, 50, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 升降手动移动速度,范围 5--20,单位mm/s,默认 5 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 137, 0, 0, PARA_VALUE_TYPE_INT, + tr("Manual movement speed for lifting and lowering"),//升降手动移动速度 + 5, 5, 20, 5, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 旋转归零速度,单位deg/s,范围10-100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 138, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation zeroing speed"),//旋转归零速度 + 10, 10, 100, 10, 0, "deg/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 旋转运行速度,单位deg/s,范围180-3600 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 139, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotating running speed"),//旋转运行速度 + 180, 180, 3600, 180, 0, "deg/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 旋转手动移动速度,单位deg/s,范围1-180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 140, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotating manual movement speed"),//旋转手动移动速度 + 10, 1, 180, 10, 0, "deg/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 141 + // 最小速度变化限制 默认10 范围1-2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 141, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed change limit"),//最小速度变化限制 + 10, 1, 2000, 10, 0, "", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 142 + // 传送带手动速度,单位mm/s,范围10-300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 142, 0, 0, PARA_VALUE_TYPE_INT, + tr("Manual speed of conveyor belt"),//传送带手动速度 + 10, 10, 300, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 143 + // 传送带运行速度,单位mm/s,范围10-500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_SPEED), + 143, 0, 0, PARA_VALUE_TYPE_INT, + tr("Running speed of conveyor belt"),//传送带运行速度 + 10, 10, 500, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 144 + // X移动加速度, 范围 1--5000,单位mm/s2,默认 50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 144, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movement acceleration"),//X移动加速度 + 50, 1, 5000, 50, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // Y移动加速度, 范围 1--5000,单位mm/s2,默认 50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 145, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movement acceleration"),//Y移动加速度 + 50, 1, 5000, 50, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //150 + // 画笔最小绘画速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 150, 0, 0, PARA_VALUE_TYPE_INT, + tr("The minimum drawing speed of the brush"),//画笔最小绘画速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔最大绘画速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_SPEED), + 151, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum painting speed of the brush"),//画笔最大绘画速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 画笔绘画加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 152, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush painting acceleration"),//画笔绘画加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 画笔绘画降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 153, 0, 0, PARA_VALUE_TYPE_INT, + tr("The minimum deviation angle and range of brush painting speed reduction"),//画笔绘画降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //154 + // 圆刀最小切割速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 154, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed of circular knife"),//圆刀最小切割速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 圆刀最大切割速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_SPEED), + 155, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum cutting speed of circular cutter"),//圆刀最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 圆刀切割加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 156, 0, 0, PARA_VALUE_TYPE_INT, + tr("Circular knife ")+tr("cutting acceleration"),//圆刀切割加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 圆刀切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 157, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle for cutting speed reduction") +" " +tr("circular knife"),//圆刀切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + //158 + // 震刀最小切割速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 158, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed of vibration knife"),//震刀最小切割速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 震刀最大切割速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_SPEED), + 159, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum cutting speed of the vibrating knife"),//震刀最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 震刀切割加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 160, 0, 0, PARA_VALUE_TYPE_INT, + tr("Vibration knife ")+tr("cutting acceleration"),//震刀切割加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 震刀切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 161, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle of vibration knife cutting speed reduction"),//震刀切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 162 + // 铣刀最小切割速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 162, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed of milling cutter"),//铣刀最小切割速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 铣刀最大切割速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 163, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum cutting speed of milling cutter"),//铣刀最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 铣刀切割加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 164, 0, 0, PARA_VALUE_TYPE_INT, + tr("Milling cutter")+ " "+tr("cutting acceleration"),//铣刀切割加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 铣刀切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 165, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle for milling cutter cutting speed reduction"),//铣刀切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + + + // 偏心刀1最小切割速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 166, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed") + " "+ tr("Eccentric knife") + "1",//偏心刀1最小切割速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 偏心刀1最大切割速度, 范围 1--800,单位mm/s,默认 600 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 167, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum cutting speed") + " "+ tr("Eccentric knife") + "1",//偏心刀1最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀1切割加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 168, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + (" 1 ")+tr("cutting acceleration"),//偏心刀1切割加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀1切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 169, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle for cutting speed reduction with a Eccentric knife 1"),//偏心刀1切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀2最小切割速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 170, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed") + " "+ tr("Eccentric knife") + " 2",//偏心刀2最小切割速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 偏心刀2最大切割速度, 范围 1--800,单位mm/s,默认 600 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 171, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum cutting speed") + " "+ tr("Eccentric knife") + " 2",//偏心刀2最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀2切割加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 172, 0, 0, PARA_VALUE_TYPE_INT, + tr("Eccentric knife") + (" 2 ")+tr("cutting acceleration"),//偏心刀2切割加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 偏心刀2切割降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 173, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle for cutting speed reduction") + " "+ tr("Eccentric knife") + " 2",//偏心刀2切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 压轮最小工作速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 174, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum cutting speed of Pressure wheel"),//压轮最小工作速度 + 10, 1, 100, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 压轮最大工作速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 175, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum work speed of Pressure wheel"),//压轮最大切割速度 + 600, 1, 800, 600, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 压轮工作加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 176, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pressure wheel cutting acceleration "),//压轮工作加速度 + 500, 1, 5000, 500, 0, "mm/s2", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 压轮工作降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 177, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum deviation angle for cutting speed reduction of Pressure wheel"),//偏心刀2切割降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 刀笔下降延时, 范围 0--5000,单位 毫秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + (MC_SORT_SETTING|MC_SORT_ACTION), + 200, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife and pencil descent delay"),//刀笔下降延时 + 0, 0, 5000, 0, 0, "ms", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 圆刀启动延时, 范围 0--5000,单位 毫秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 201, 0, 0, PARA_VALUE_TYPE_INT, + tr("Round knife start delay"),//圆刀启动延时 + 0, 0, 5000, 0, 0, "ms", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 震刀启动延时, 范围 0--5000,单位 毫秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 202, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shockknife start delay"),//震刀启动延时 + 0, 0, 5000, 0, 0, "ms", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 铣刀启动延时, 范围 0--5000,单位 毫秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 203, 0, 0, PARA_VALUE_TYPE_INT, + tr("Milling cutter start delay"),//铣刀启动延时 + 0, 0, 5000, 0, 0, "ms", tr(""), + tr(""), + 0, 0, 0x0001, root)); + + // 钻孔刀下降延时, 范围 0--5000,单位 毫秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 204, 0, 0, PARA_VALUE_TYPE_INT, + tr("Drilling tool descent delay"),//钻孔刀下降延时 + 0, 0, 5000, 0, 0, "ms", tr(""), + tr(""), + 0, 0, 0x0001, root)); +} + +//工作参数 +void CuttingWalk::initWkParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + // 79 + // 风机启动延时, 范围 0--10,单位秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + (MC_SORT_SETTING|MC_SORT_ACTION), + 79, 0, 0, PARA_VALUE_TYPE_INT, + tr("Fan start delay"),// 风机启动延时 + 0, 0, 10, 0, 0, "s", tr(""), + tr(""), 0, 0, 0x0001, operate)); + // 风机关闭延时, 范围 0--30,单位秒 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 80, 0, 0, PARA_VALUE_TYPE_INT, + tr("Fan shutdown delay"),// 风机关闭延时 + 0, 0, 30, 0, 0, "s", tr(""), + tr(""), 0, 0, 0x0001, root)); + + // 产量预设, 0, 关闭功能;其余,按照预设产量提示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 81, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, root)); + + // 完成后停车位置选择, 0, 当前位置 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 82, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Parking location selection after completion"),// 完成后停车位置选择 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + strCurrentLocation,0, 0, 0x0001, root));//当前位置 0 ,起点1 偏移点2,原点3 + + // 吸附区域选择,按位设置 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 83, 1, 0, PARA_VALUE_TYPE_SW, + tr("Adsorption Zone") +" 1",// 吸附区域1 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, root)); + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 83, 2, 0, PARA_VALUE_TYPE_SW, + tr("Adsorption Zone") +" 2",// 吸附区域2 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, root)); + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 83, 3, 0, PARA_VALUE_TYPE_SW, + tr("Adsorption Zone") +" 3",// 吸附区域3 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, root)); + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 83, 4, 0, PARA_VALUE_TYPE_SW, + tr("Adsorption Zone")+" 4",// 吸附区域4 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, root)); + + // 横切起始位置,单位0.01mm,范围-500000-500000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 84, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting position of cross cutting"),// 横切起始位置 + 0, -500000, 500000, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 横切结束位置,单位0.01mm,范围-500000-500000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 85, 0, 0, PARA_VALUE_TYPE_INT, + tr("End position of cross cutting"),// 横切结束位置 + 0, -500000, 500000, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 86 + // 横切x向补偿距离,单位0.01mm,范围-2000-2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 86, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cross cutting compensation distance"),// 横切补偿距离 + 0, -2000, 2000, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + + // 99 + + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 光幕; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_DETECT, + // 100, 1, 0, PARA_VALUE_TYPE_LIST, + // tr("Secure input light curtain allows"),// 安全输入光幕允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, 0x0001, operate)); + // // bit1 气压; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_DETECT, + // 100, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Safety input pressure allowed"),// 安全输入气压允许 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // strAllow, 1, 1, 0x0001, operate)); + + // 开机动作 //bit 0 电机归零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 101, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Startup motor to zero"),// 开机电机归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0001, root)); + + // 功能控制 + //bit0 :风机吸附开关 0,手动 1,自动 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + (MC_SORT_SETTING|MC_SORT_ACTION), + 102, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Fan adsorption switch"),// 风机吸附开关 + 0, 0, 1, 0, 0, tr(""), tr(""), + strManualAuto, 0, 0, 0x0001, operate)); + //bit1 :横切功能选择 0,手动 1,自动 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 102, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Cross cutting function selection"),// 横切功能选择 + 0, 0, 1, 0, 0, tr(""), tr(""), + strManualAuto, 0, 0, 0x0001, root)); + + //bit2 :被动旋转刀 0,手动 1,自动 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 102, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Passive rotary knife"),// 被动旋转刀 + 0, 0, 1, 0, 0, tr(""), tr(""), + strManualAuto, 0, 0, 0x0001, root)); + + // bit3:边走边裁 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + (MC_SORT_SETTING|MC_SORT_ACTION), + 102, 4, 0, PARA_VALUE_TYPE_SW, + tr("Cutting while walking"),// 边走边裁 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // bit4:连续切割 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + (MC_SORT_SETTING|MC_SORT_ACTION), + 102, 5, 0, PARA_VALUE_TYPE_SW, + tr("Continuous cutting"),// 连续切割 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // bit5:缺料检测 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + (MC_SORT_SETTING|MC_SORT_DETECT), + 102, 6, 0, PARA_VALUE_TYPE_SW, + tr("Shortage detection"),// 缺料检测 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 偏移点坐标X,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 103, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset")+ " " + ("X"),// 偏移点坐标 X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + // 偏移点坐标Y,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 104, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset")+" "+("Y"),// 偏移点坐标 Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + + // 刀压检测坐标X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 105, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife Check")+ " " + ("X"),// 刀压检测坐标X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + // 刀压检测坐标Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 106, 0, 0, PARA_VALUE_TYPE_INT, + tr("Knife Check")+" "+("Y"),// 刀压检测坐标Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + + // 被动刀旋转坐标X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 107, 0, 0, PARA_VALUE_TYPE_INT, + tr("Passive knife rotation coordinate")+ " " + ("X"),// 被动刀旋转坐标X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + // 被动刀旋转坐标Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 108, 0, 0, PARA_VALUE_TYPE_INT, + tr("Passive knife rotation coordinate")+" "+("Y"),// 被动刀旋转坐标Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + + // 109 原点坐标X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 109, 0, 0, PARA_VALUE_TYPE_INT, + tr("Origin coordinates")+ " " + ("X"),// 原点坐标X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + // 110 原点坐标Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Origin coordinates")+" "+("Y"),// 原点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, root)); + + //111 + // 图形间隔,单位0.01mm, 范围 0--1000.00mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 111, 0, 0, PARA_VALUE_TYPE_INT, + tr("Graph spacing"),// 图形间隔 + 0, 0, 100000, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); +} + +#define MT_LX 0x0001 // X向移动电机 +#define MT_LY 0x0002 // Y向移动电机 +#define MT_LU1 0x0003 // U1电机 +#define MT_LU2 0x0004 // U2电机 +#define MT_LU3 0x0005 // U3电机 +#define MT_LR1 0x0006 // R1电机 +#define MT_LR2 0x0007 // R2电机 +#define MT_LR3 0x0008 // R3电机 +#define MT_LEDGE 0x0009 // 纠偏电机 +//#define MT_LF 0x000A // 过窗电机 +#define MT_LB2 0x000B // 传送带电机 + +//电机和控制动作 +void CuttingWalk::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 1; + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX));// X向移动电机(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY));// Y向移动电机(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor 1"),MT_LU1));// 升降电机1(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor 2"),MT_LU2));// 升降电机2(归零,正转,反转) + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Rotating motor 1"),MT_LR1));// 旋转电机1(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Rotating motor 2"),MT_LR2));// 旋转电机2(归零,正转,反转) + // 纠偏电机(正转,反转) + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("MT_LEDGE"),MT_LEDGE,// 纠偏电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + // 传送带电机(正转,反转) + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("CONVEYOR BELT"),MT_LB2,// 传送带电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); +} + +//快捷功能 +void CuttingWalk::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("All_Zero"),"buttonAllToZero",FUN_ALLTOZERO));// 全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟工作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backZeroPoint"),"buttonBackToOrigin",FUN_BACKTOORIGIN));// 回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backStartPoint"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));// 回起始点 + // m_allShortCutList.append(makeAShortCutItem(0,index++,tr("gotoFinish"),"buttonBackAnchorPoint",FUN_GOTO_FINISH));// 回结束点 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetPositioning"),"buttonSetEmbPoint",FUN_CUT_SETANCHORPOINT));//定定位点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back anchor"),"buttonBackWorkPoint",FUN_CUTTINGPOINT));// 回定位点 + // m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetOffsetPoint"),"buttonSetAnchorPoint",FUN_SETOFFSETPOINT));// 定偏移点 + // m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backOffsetPoint"),"buttonBackOffsetPoint",FUN_BACKOFFSETPOINT));// 回偏移点 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Knife pressure collection"),"buttonKnifePressureCollection",FUN_KNIFE_COLLECT));//刀压采集 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Display collected data"),"DisplayCollectedData",FUN_DISPLAY_COLLECTED_DATA));//显示采集数据 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Knife pressure test"),"KnifePressure",FUN_KNIFE_TEST));//刀压测试 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set the position for tool pressure detection"),"SetPositionDetection",FUN_SET_KNIFETEST_POS));//设置刀压检测位置 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Cross cutting"),"chiselPoint",FUN_CROSS_CUT));//横切 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Fan area"),"buttonFanCtrl",FUN_FAN_AREA));//风机 + + //画笔上升、画笔下降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Pen up"),"buttonPenUp",FUN_PEN_UP));//画笔上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Pen down"),"buttonPenDown",FUN_PEN_DOWN));//画笔下降 +} + +//辅助功能 +void CuttingWalk::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 +#ifdef Q_OS_LINUX + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 +#endif + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +} + +//参数分类(参数分组功能) +void CuttingWalk::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("WorkPara"),"buttonActionSet",PARASET_SETTING));//工作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数(290810) + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数(290810) + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("DetectPara"),"buttonDetectParas",PARASET_DETECT));// 检测参数(290810) + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("PositionPara"),"buttonPositionParas",PARASET_POSITION));//位置参数(290810) + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("AllPara"),"buttonSettingParas",PARASET_ALL));//全部参数(262574) +} + +void CuttingWalk::initFileSetList() +{ + m_allPatternSetList.clear(); + + //m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Para"),"buttonPatternPara",PATTERNSET_ALGORITHMPARA));//分割参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//文件选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//文件导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//文件导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//文件删除 +} + +#define DSS_BIT1 0x01 // idx1 +#define DSS_BIT2 0x02 // idx2 +#define DSS_BIT3 0x04 // idx3 +#define DSS_BIT4 0x08 // idx4 +#define DSS_BIT5 0x10 // idx5 +#define DSS_BIT6 0x20 // idx6 +#define DSS_BIT7 0x40 // idx7 +#define DSS_BIT8 0x80 // idx8 + +#define DSS1_B_START_BT 0x0000 // 启动按钮(1~8) +#define DSS1_B_PAUSE_BT 0x0001 // 暂停按钮(1~8) +#define DSS1_B_READY_BT 0x0005 // 就绪按钮(1~8) +#define DSS2_F1_X DSS_BIT1 // X (主框架X) +#define DSS2_F1_Y DSS_BIT2 // Y (主框架Y) +#define DSS2_F1_ZERO_POS 0x0020 // 框架(轴)1 零位 +#define DSS2_UD_CU1_POS 0x0048 // 裁切机头 高位(1~8) +#define DSS1_B_AIR_TEST 0x0007 // 气压检测(1~8) +#define DSS_HEAD_01 DSS_BIT1 // idx1 +#define DSS_HEAD_02 DSS_BIT2 // idx2 +#define DSS_HEAD_03 DSS_BIT3 // idx3 +#define DSS_HEAD_04 DSS_BIT4 // idx4 +#define DSS_HEAD_05 DSS_BIT5 // idx5 +#define DSS_HEAD_06 DSS_BIT6 // idx6 +#define DSS_HEAD_07 DSS_BIT7 // idx7 +#define DSS_HEAD_08 DSS_BIT8 // idx8 +#define DSS1_B_SAFE_TEST 0x0008 // 安全输入(1~8) + +// J1 +//#define IsStartButton GetInput1Status // 启动按钮 +//#define IsStopButton GetInput2Status // 停止按钮 +//#define IsStartButton2 GetInput3Status // 启动按钮2(双手启动) +//#define IsResetButton GetInput4Status // 复位按钮 + +#define N1_INPUT1_IDX DSS1_B_START_BT // 启动按钮 +#define N1_INPUT1_BIT DSS_BIT1 +#define N1_INPUT2_IDX DSS1_B_PAUSE_BT // 暂停按钮 +#define N1_INPUT2_BIT DSS_BIT1 +#define N1_INPUT3_IDX DSS1_B_START_BT // 启动按钮 +#define N1_INPUT3_BIT DSS_BIT2 +#define N1_INPUT4_IDX DSS1_B_READY_BT // 复位按钮 +#define N1_INPUT4_BIT DSS_BIT1 + +// J2 +//#define IsXZeroPos GetInput7Status // X零位 + +#define N1_INPUT7_IDX DSS2_F1_ZERO_POS // 框架(轴)1 零位 +#define N1_INPUT7_BIT DSS2_F1_X + +// J3 +//#define IsAirPressureOk GetInput10Status // 气压保护检测 +#define N1_INPUT10_IDX DSS1_B_AIR_TEST // 气压检测 +#define N1_INPUT10_BIT DSS_BIT1 + +//#define IsYZeroPos GetInput11Status // Y零位 + +#define N1_INPUT11_IDX DSS2_F1_ZERO_POS // 框架(轴)1 零位 +#define N1_INPUT11_BIT DSS2_F1_Y + +// J4 +#if (LIFT_U1 == 1) +#define IsU1ZeroPos GetInput13Status // U1零位 + +#define N1_INPUT13_IDX DSS2_UD_CU1_POS +#define N1_INPUT13_BIT DSS_HEAD_01 + +#define IsU1ZPPos GetInput14Status // U1 ZP + +#define N1_INPUT14_IDX DSS2_UD_CU1_POS +#define N1_INPUT14_BIT DSS_HEAD_04 + +#endif + +#if (LIFT_U2 == 1) +#define IsU2ZeroPos GetInput15Status // U2零位 + +#define N1_INPUT15_IDX DSS2_UD_CU1_POS +#define N1_INPUT15_BIT DSS_HEAD_02 + +#define IsU2ZPPos GetInput16Status // U2 ZP + +#define N1_INPUT16_IDX DSS2_UD_CU1_POS +#define N1_INPUT16_BIT DSS_HEAD_05 + +#endif + +// J5 +#if (KNIFE_PRESSURE == 1) +#define IsKnifeCheckPos GetInput18Status // 刀压检测 +#define N1_INPUT18_IDX DSS2_UD_CU1_POS +#define N1_INPUT18_BIT DSS_HEAD_07 +#endif + +// J6 +//#define IsSafetyInput GetInput21Status // 光幕 +#define N1_INPUT21_IDX DSS1_B_SAFE_TEST +#define N1_INPUT21_BIT DSS_BIT1 + +#define DSS2_CT_ZERO1_POS 0x003C // 裁刀旋转零位(1~8) +#define DSS2_CT_ZERO2_POS 0x003D // 裁刀旋转零位(9~16) +#define DSS2_UD_CU1_POS 0x0048 // 裁切机头 高位(1~8) +#define DSS2_UD_CU2_POS 0x0049 // 裁切机头 高位(9~16) +#define DSS2_UD_CD1_POS 0x004A // 裁切机头 低位(1~8) +#define DSS2_UD_CD2_POS 0x004B // 裁切机头 低位(9~16) +#define DSS2_UD_IU1_POS 0x004C // 画笔机头 高位(1~8) +#define DSS2_UD_IU2_POS 0x004D // 画笔机头 高位(9~16) +#define DSS2_UD_ID1_POS 0x004E // 画笔机头 低位(1~8) +#define DSS2_UD_ID2_POS 0x004F // 画笔机头 低位(9~16) + + +#define DSS6_ADDR_03B8 0x03B8 // + // BIT1 : 切割压料气缸-上位 + // BIT2 : 切割压料气缸-下位 + // BIT3 : 上贴合液压缸-上位 + // BIT4 : 上贴合液压缸-下位 + // BIT5 : 下贴合液压缸-上位 + // BIT6 : 下贴合液压缸-下位 + // BIT7 : 控制板摇杆 X+ + // BIT8 : 控制板摇杆 X- + +#define DSS6_ADDR_03B9 0x03B9 // + // BIT1 : 控制板摇杆 Y+ + // BIT2 : 控制板摇杆 Y- + // BIT3 : 控制板横切按钮 + // BIT4 : 控制板Fn按钮 + // BIT5 : 对边传感器1 + // BIT6 : 对边传感器2 + // BIT7 : 对边正限位 + // BIT8 : 对边负限位 + +#define DSS6_ADDR_03BA 0x03BA // + // BIT1 : 收料报警状态 + // BIT2 : 收料手自动状态 + // BIT3 : + // BIT4 : + // BIT5 : + // BIT6 : + // BIT7 : + // BIT8 : + + +//初始化传感器列表 +void CuttingWalk::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(DSS1_B_START_BT, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(DSS1_B_START_BT, 1, strStartButton + "2"));//启动按钮2 + m_tempSensorList.append(makeASensorItem(DSS1_B_PAUSE_BT, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(DSS1_B_READY_BT, 0, tr("Reset button")));//复位按钮 + m_tempSensorList.append(makeASensorItem(DSS2_F1_ZERO_POS, 1, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(DSS2_F1_ZERO_POS, 0, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(DSS1_B_AIR_TEST, 0, tr("Pressure protection detection")));//气压保护检测 + m_tempSensorList.append(makeASensorItem(DSS2_UD_CU1_POS, 1, tr("U1 zero position")));//U1零位 + m_tempSensorList.append(makeASensorItem(DSS2_UD_CU1_POS, 0, tr("U1 ZP")));//U1 ZP + m_tempSensorList.append(makeASensorItem(DSS2_UD_CU1_POS, 3, tr("U2 zero position")));//U2零位 + m_tempSensorList.append(makeASensorItem(DSS2_UD_CU1_POS, 4, tr("U2 ZP")));//U2 ZP + m_tempSensorList.append(makeASensorItem(DSS2_UD_CU1_POS, 6, tr("Knife pressure detection")));//刀压检测 + m_tempSensorList.append(makeASensorItem(DSS1_B_SAFE_TEST, 0, tr("Light curtain")));//光幕 + + m_tempSensorList.append(makeASensorItem(DSS2_CT_ZERO1_POS, 0, tr("Cutting blade rotation zero position1")));//裁刀旋转零位1 + m_tempSensorList.append(makeASensorItem(DSS2_CT_ZERO1_POS, 1, tr("Cutting blade rotation zero position2")));//裁刀旋转零位2 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B8, 6, tr("Control panel joystick")+(" X+")));//控制板摇杆 X+ + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B8, 7, tr("Control panel joystick")+(" X-")));//控制板摇杆 X- + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 0, tr("Control panel joystick")+(" Y+")));//控制板摇杆 Y+ + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 1, tr("Control panel joystick")+(" Y-")));//控制板摇杆 Y- + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 2, tr("Control board crosscutting button")));//控制板横切按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 3, tr("Control board Fn button")));//控制板Fn按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 4, tr("Opposite edge sensor 1")));//对边传感器1 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 5, tr("Opposite edge sensor 2")));//对边传感器2 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 6, tr("Opposite limit +")));//对边正限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03B9, 7, tr("Opposite limit -")));//对边负限位 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03BA, 0, tr("Receiving alarm status")));//收料报警状态 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_03BA, 1, tr("Automatic status of material receiving hand")));//收料手自动状态 + + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define STA_MTZ_SUCCESS 0x0101 // 归零成功 +#define STA_NORMAL_STOP 0x0100 // 正常停止 + +#define ERR_FEED_MANUAL 0x0027 // 进料处于手动状态 +#define ERR_MC_MANUAL 0x0028 // 机器处于手动状态 +#define ERR_KEY_SW_OFF 0x0029 // 机器钥匙开关关闭 +#define ERR_ALM_WATERTANK 0x002A // 水箱报警 +#define ERR_ALM_COVEROPEN 0x002B // 开盖报警 +#define ERR_LIGHTCURTAINS1 0x002C // 光幕1介入 +#define ERR_LIGHTCURTAINS2 0x002D // 光幕2介入 +#define ERR_AIR_POWER 0x002E // 气压不足 +#define ERR_PRESS_SENSOR 0x002F // 压料传感器错误 +#define ERR_CLIP_SENSOR 0x0030 // 夹布传感器错误 +#define ERR_NO_MATERIEL 0x0031 // 缺料报警 +#define ERR_CUTFRAME 0x0032 // 边框切割错误 +#define ERR_MC_AUTO 0x0033 // 机器处于自动状态 +#define ERR_DOOR_TIMEOUT 0x0034 // 开关门超时 +#define ERR_NOT_AT_OFFSET 0x0035 // 不在偏移点 +#define ERR_NO_PHOTO_FILE 0x0036 // 没有拍照文件 +#define ERR_FEED_AUTO 0x0037 // 进料处于自动状态 +#define ERR_GANTRY_NOT_POS 0x0038 // 龙门不到位 +#define ERR_GUARDRAIL_OPEN 0x0039 // 安全门未关闭 + +//初始化错误代码和状态列表 +void CuttingWalk::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("freedom from error"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Not powered on"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of bounds"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strPositiveLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strPositiveLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_COOR_SYSTM,tr("Error in the coordinate system of the lifting motor"))); // 升降电机坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_MTZ_SUCCESS,tr("Zero successfully"))); // 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_NORMAL_STOP,tr("Normal stop"))); // 正常停止 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Work status not allowed"))); // 不允许工作状态 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_MANUAL,tr("Feed in manual mode"))); // 进料处于手动状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_MANUAL,tr("The machine is in manual mode"))); // 机器处于手动状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_KEY_SW_OFF,tr("Machine key switch off"))); // 机器钥匙开关关闭 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_ALM_WATERTANK,tr("Water tank alarm"))); // 水箱报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_ALM_COVEROPEN,tr("Cover opening alarm"))); // 开盖报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIGHTCURTAINS1,tr("Light curtain 1 intervention"))); // 光幕1介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIGHTCURTAINS2,tr("Light curtain 2 intervention"))); // 光幕2介入 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PRESS_SENSOR,tr("Pressure sensor error"))); // 压料传感器错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLIP_SENSOR,tr("Cloth clip sensor error"))); // 夹布传感器错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_MATERIEL,tr("Shortage alarm"))); // 缺料报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CUTFRAME,tr("Border cutting error"))); // 边框切割错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_AUTO,tr("The machine is in automatic mode"))); // 机器处于自动状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DOOR_TIMEOUT,tr("Opening and closing door timeout"))); // 开关门超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_OFFSET,tr("Not at offset point"))); // 不在偏移点 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_PHOTO_FILE,tr("No photo files available"))); // 没有拍照文件 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_AUTO,tr("Feed in automatic mode"))); // 进料处于自动状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_GANTRY_NOT_POS,tr("The gantry is not in place"))); // 龙门不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_GUARDRAIL_OPEN,tr("The safety door is not closed"))); // 安全门未关闭 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No data available"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DATA_ERROR,tr("data error"))); // 数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_GRAPH_OUT_RANGE,tr("Shape out of range"))); // 图形超出范围 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_RUN_LIMIT,tr("Sports limit"))); // 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_OUT_RANGE,tr("Head lifting position out of range"))); // 机头升降位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_YZR_NOT_SYNC,tr("Y-direction motor not synchronized"))); // Y向电机不同步 +} diff --git a/mctype/patternsingleboard/function/cuttingwalk.h b/mctype/patternsingleboard/function/cuttingwalk.h new file mode 100644 index 0000000..62b9fa2 --- /dev/null +++ b/mctype/patternsingleboard/function/cuttingwalk.h @@ -0,0 +1,42 @@ +#ifndef CUTTINGWALK_H +#define CUTTINGWALK_H + +#include "mctype/machinetypefun.h" + +#define OT_PEN_LIFT 0x0009 // 画笔升降 +/// +/// \brief 边走边裁 +/// +/// 备注:边走边裁的定定位点是定在面对屏幕的右上角(也就是x和y都是大值的位置,距离最大值边缘的点,然后再由这个点推导出起始点) +/// 如果后续修改需求,需要修改为距离xy最小值边缘的点,也就是左下角,需要修改这个功能 +class CuttingWalk : public MachineTypeFun +{ + Q_OBJECT +public: + CuttingWalk(); + ~CuttingWalk(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + //void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + void initFileSetList();//文件设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // CUTTINGWALK_H diff --git a/mctype/patternsingleboard/function/dlqscheboard.cpp b/mctype/patternsingleboard/function/dlqscheboard.cpp new file mode 100644 index 0000000..8b194cd --- /dev/null +++ b/mctype/patternsingleboard/function/dlqscheboard.cpp @@ -0,0 +1,338 @@ +#include "dlqscheboard.h" + +DLQScheBoard::DLQScheBoard() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); +// initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 +// initPatternSetList(); + + //参数分类功能 +// initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 +// initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void DLQScheBoard::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); + +} + +void DLQScheBoard::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +void DLQScheBoard::initPatternsParasList() +{ + +} + +void DLQScheBoard::initMcParasList() +{ + // 上层传输速度,单位mm/s 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Upper layer transmission speed"),//上层传输速度 + 0, 0, 1000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 中层传输速度,单位mm/s + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Intermediate transmission speed"),//中层传输速度 + 0, 0, 1000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 下层传输速度,单位mm/s + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lower layer transmission speed"),//下层传输速度 + 0, 0, 1000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 启停速度,单位mm/s + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start stop speed"),//启停速度 + 0, 0, 1000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 行走加速度,单位mm/s2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("Walking acceleration"),//行走加速度 + 0, 0, 1000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + +// u32 fbFindZeroSpd; // 翻板电机找零速度 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("Flip motor change speed"),//翻板电机找零速度 + 0, 0, 10000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + +// u32 fbRunningSpd; // 翻板电机运行速度 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Operating speed of flipping motor"),//翻板电机运行速度 + 0, 0, 10000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + +// u32 fbMotoDwPos; // 翻板电机下位坐标 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lower coordinate of flipping motor"),//翻板电机下位坐标 + 0, 0, 10000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + +// u32 fbMotoMidPos; // 翻板电机中位坐标 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Mid position coordinates of flipping motor"),//翻板电机中位坐标 + 0, 0, 10000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + +// u32 fbMotoUpPos; // 翻板电机上位坐标 隐藏不显示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Upper coordinate of flipping motor"),//翻板电机上位坐标 + 0, 0, 10000, 0, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + +} + +#define OT_THREE_1 0x0001 // 送料压紧气缸 升 降 +#define OT_THREE_2 0x0002 // 送料压紧气缸 伸 收 +#define OT_THREE_3 0x0003 // 上层出料电机 启动 停止 +#define OT_THREE_4 0x0004 // 中层出料电机 启动 停止 +#define OT_THREE_5 0x0005 // 下层出料电机 启动 停止 +#define OT_THREE_6 0x0006 // 出料平台电机 启动 停止 +#define OT_THREE_7 0x0007 // 翻板电机上位 气动(发UP_OPEN_ON) +#define OT_THREE_8 0x0008 // 翻板电机中位 气动(发UP_OPEN_ON) +#define OT_THREE_9 0x0009 // 翻板电机下位 气动(发UP_OPEN_ON) + +void DLQScheBoard::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Feed compression cylinder"),OT_THREE_1,// 送料压紧气缸 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,-1,OUTCONTROL_UP,OUTCONTROL_STOP, + strDescend,true,-1,OUTCONTROL_DOWN,OUTCONTROL_STOP)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0002,tr("Feed compression cylinder"),OT_THREE_2,// 送料压紧气缸 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0003,tr("Upper discharge motor"),OT_THREE_3,// 上层出料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStart,true,OUTCONTROL_OPEN,-1,-1, + strStop,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0004,tr("Middle level discharge motor"),OT_THREE_4,// 中层出料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStart,true,OUTCONTROL_OPEN,-1,-1, + strStop,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0005,tr("Lower level discharge motor"),OT_THREE_5,// 下层出料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStart,true,OUTCONTROL_OPEN,-1,-1, + strStop,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0006,tr("Discharge platform motor"),OT_THREE_6,// 出料平台电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStart,true,OUTCONTROL_OPEN,-1,-1, + strStop,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0007,tr("Upper level flipping motor"),OT_THREE_7,// 翻板电机上位 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strRun,true,OUTCONTROL_OPEN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0008,tr("Mid position of flipping motor"),OT_THREE_8,// 翻板电机中位 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strRun,true,OUTCONTROL_OPEN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0009,tr("Lower position of flipping motor"),OT_THREE_9,// 翻板电机下位 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strRun,true,OUTCONTROL_OPEN,-1,-1)); + + +} + +void DLQScheBoard::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Flip board low position"),"boardLowPos",FUN_BOARD_LOW_POSITION));// 翻板到低位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Flip board center position"),"boardCenterPos",FUN_BOARD_CENTER_POSITION));// 翻板到中位 + +} + + +#define DSS6_ADDR_02B6 0x02B6 // + // BIT1 : 物料就绪按钮 + // BIT2 : 翻板上位 + // BIT3 : 翻板中位 + // BIT4 : 翻板下位 + // BIT5 :手动进料按 + // BIT6 :手动翻版按钮 + // BIT7 :送料平台气缸装置回收按钮 + // BIT8 : 送料平台气缸装置伸出按钮 + +#define DSS6_ADDR_02B7 0x02B7 // + // BIT1 :双层绗缝机模式(只有中下层) + // BIT2 :上层有独立接口 + // BIT3 :翻板使用电机模式 + // BIT4 : 三层增加进料辅助平台 + // BIT5 : + // BIT6 : + // BIT7 : + // BIT8 : + +#define DSS6_ADDR_02B8 0x02B8 // +// BIT1 : 中层进料允许 +// BIT2 : 下层进料允许 +// BIT3 : 中层进料完成 +// BIT4 : 下层进料完成 +// BIT5 : 中层出料允许 +// BIT6 : 下层出料允许 +// BIT7 : 中进料翻板动作允许 +// BIT8 : 中进料翻板动作开 + +#define DSS6_ADDR_02B9 0x02B9 +// BIT1 下进料翻板动作允许 +// BIT2 : 下进料翻板动作开 + + +void DLQScheBoard::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 0, tr("Material ready button"))); // BIT1 : 物料就绪按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 1, tr("Flip board up"))); // BIT2 : 翻板上位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 2, tr("Flip board center position"))); // BIT3 : 翻板中位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 3, tr("Flip the lower part of the board"))); // BIT4 : 翻板下位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 4, tr("Manual feeding according to"))); // BIT5 :手动进料按 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 5, tr("Manual copy button"))); // BIT6 :手动翻版按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 6, tr("Recycling of cylinder device on the feeding platform"))); // BIT7 :送料平台气缸装置回收按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B6, 7, tr("The cylinder device of the feeding platform extends out"))); // BIT8 : 送料平台气缸装置伸出按钮 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B7, 0, tr("Double layer Quilting Machine Mode"))); // BIT1 :双层绗缝机模式(只有中下层) + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B7, 1, tr("There is an independent interface in the upper layer"))); // BIT2 :上层有独立接口 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B7, 2, tr("Flip board using motor mode"))); // BIT3 :翻板使用电机模式 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B7, 3, tr("Add a feeding auxiliary platform on the third floor"))); // BIT4 : 三层增加进料辅助平台 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 0, tr("Middle level feeding allowed ")));// BIT1 :中层进料允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 1, tr("Lower level feeding allowed ")));// BIT2 : 下层进料允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 2, tr("Mid level feeding completed ")));// BIT3 : 中层进料完成 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 3, tr("Lower level feeding completed ")));// BIT4 :下层进料完成 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 4, tr("Middle level discharge allowed ")));// BIT5 :中层出料允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 5, tr("Lower level discharge allowed")));// BIT6 :下层出料允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 6, tr("The mid feed flipping action is allowed ")));// BIT7 : 中进料翻板动作允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B8, 7, tr("Open the intermediate feed flipping action ")));// BIT8 : 中进料翻板动作开 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B9, 0, tr("The downward feed flipping action is allowed ")));// BIT1 下进料翻板动作允许 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B9, 1, tr("Open the feeding flipping action ")));// BIT2 : 下进料翻板动作开 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +void DLQScheBoard::initErrorCodeAndStateList() +{ +} diff --git a/mctype/patternsingleboard/function/dlqscheboard.h b/mctype/patternsingleboard/function/dlqscheboard.h new file mode 100644 index 0000000..da4504f --- /dev/null +++ b/mctype/patternsingleboard/function/dlqscheboard.h @@ -0,0 +1,37 @@ +#ifndef DLQSCHEBOARD_H +#define DLQSCHEBOARD_H + + +#include "mctype/machinetypefun.h" + +/// +/// \brief 双层绗缝机调度主板 +/// +class DLQScheBoard : public MachineTypeFun +{ + Q_OBJECT + +public: + DLQScheBoard(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + + +}; + +#endif // DLQSCHEBOARD_H diff --git a/mctype/patternsingleboard/function/doubleheadcombqui.cpp b/mctype/patternsingleboard/function/doubleheadcombqui.cpp new file mode 100644 index 0000000..263389a --- /dev/null +++ b/mctype/patternsingleboard/function/doubleheadcombqui.cpp @@ -0,0 +1,1524 @@ +#include "doubleheadcombqui.h" + +// 双头组合绗缝机 +DoubleHeadCombQui::DoubleHeadCombQui() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +DoubleHeadCombQui::~DoubleHeadCombQui() +{ + +} + +//初始化九宫格功能按键 +void DoubleHeadCombQui::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_SET_WORK_HEAD,"buttonWorkHeadSwitch")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); + +} + +void DoubleHeadCombQui::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(BeginPoint2); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Position2); + m_fileInfo.append(Production); +} + +//花样参数 +void DoubleHeadCombQui::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围1-最大,默认500mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 50000, 1, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围1-最大,默认500mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 50000, 1, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-去除偏移针步大小设置;单位:mm ,范围0-10,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_OFTNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Remove offset needle step size setting"),//去除偏移针步大小设置 + 0, 0, 1000, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(0) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#else + +#if(0) + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + +#endif + //花样参数--------------------------- +} + +//机器参数 +void DoubleHeadCombQui::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + //自动换梭装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, 0x0001, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + // //手/自动按钮装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 1, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic button device"),//手自动按钮装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strClosedOpen, + // 0, 0, 0x0002, operate)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, 0x0004, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0006, operate)); + + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, 0x0007, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, 0x0008, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, 0x0009, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), 99300, 99300, 0x0010, operate)); + + + // //进料编码器系数分子, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 8, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient molecule"),//进料编码器系数分子 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x0011, operate)); + + // //进料编码器系数分母, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 205, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient denominator"),//进料编码器系数分母 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x00C3, operate)); + + + + // //零切距离, 范围1--500000 单位0.01mm + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 9, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Zero tangent distance"),//零切距离 + // 0, 1, 500000, 0, 2, tr("mm"), tr(""), + // tr(""), + // 0, 0, 0x0012, operate)); + // //切料箱装置选择, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 1, 0, PARA_VALUE_TYPE_LIST, + // tr("Feeding device"),//进料装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //横切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Crosscutting device"),//横切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //夹布装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Cloth clamping device"),//夹布装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //张紧装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Tensioning device"),//张紧装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //边切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 5, 0, PARA_VALUE_TYPE_LIST, + // tr("Edge cutting device"),//边切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + //X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0014, operate)); + + // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0015, operate)); + + // 工作机头选择,位图选择,共支持5个机头; 0, 不允许工作; 1, 允许工作; bit0 第一个机头, bit1, 第二个机头...... + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 14, 1, 0, PARA_VALUE_TYPE_SW, + tr("Working machine head") + tr("1"),//工作机头1 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0015, operate)); + + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 14, 2, 0, PARA_VALUE_TYPE_SW, + tr("Working machine head") + tr("2"),//工作机头2 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0015, operate)); +} + +//工作参数 +void DoubleHeadCombQui::initWkParasList() +{ + int index = 0; + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 主轴回针转速, 范围 1--500,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, + 0, 0, index, operate));//连续:0;间歇式:1 + + // // 缝纫加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + // 1, 1, index, operate)); + + // // 缝纫机头旋转方式, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing machine head rotating manner"),// 缝纫机头旋转方式 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("Continuous rotation:0;Xy intermittent rotation:1"),//连续旋转:0;Xy间歇旋转:1 + // 0, 0, index, operate)); + + // // 缝纫机头加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing head deceleration mode"),// 缝纫机头加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // tr("No acceleration or deceleration:0;Intermittent acceleration and deceleration:1"), //无加速或减速:0;间歇加减速:1 + // 1, 1, index, operate));//无加速或减速:0;间歇加减速:1 + + // // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // // bit0, 松线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 3, 1, 0, PARA_VALUE_TYPE_SW, + // tr("Allow for needle starting and thread loosening"),// 起针松线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 3, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Needle and thread clamping allowed"),// 起针夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 剪线允许, 范围 0--3,默认 1 + // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, index, operate)); + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // // bit1, 拉线允许; + // // 剪线时拉线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Thread pulling allowed during thread trimming"),// 剪线时拉线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit2, 夹线允许; + // // 剪线时夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Thread clamping allowed during thread trimming"),// 剪线时夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit3, 提升压脚允许; + // // 剪线时提升压脚允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 4, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // bit4, 提升机头剪线; + // 剪线时提升机头剪线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // // bit5, 提升机头夹线;0:允许 1:不允许 + // // 剪线时提升机头夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 6, 0, PARA_VALUE_TYPE_SW, + // tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit6, 在压脚下勾线;0:允许 1:不允许 + // // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 7, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // bit7, 退针允许;0:允许 1:不允许 + // 剪线时退针允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit8, 扣线允许;0:允许 1:不允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 9, 0, PARA_VALUE_TYPE_LIST, + // tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + + // 断线检测针数, 范围 0--10,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index, operate)); + + // u32 BrokenRpairMode; // 断线补缝方式 , 范围 0--1, 1:反复加固模式 2回退模式 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 54, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Broken line patching method"), + 0, 0, 1, 0, 0, tr(""), tr(""), + //反复加固模式:0;回退模式:1 + tr("Repeated reinforcement mode:0;fallback mode:1"), + 0, 0, index, operate)); + + // u32 ReinforPins; // 加固针数 , 范围 1--10 , 单位 针 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 55, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of reinforcement needles"), + 0, 1, 10, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // u32 ReinforNumber; // 加固次数 , 范围 1--5 , 单位次 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 56, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"), + 0, 1, 5, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭芯提醒功能, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, index, operate)); + + // 底线长度, 范围 0--S32_MAX,默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭片数计数, 范围 0--1000,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, index, operate)); + + // 加油方式选择, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, index, operate)); + + // 加油针数间隔, 范围 S32_MIN--S32_MAX,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index, operate)); + + // // 加油时间间隔, 范围 1--S32_MAX,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 12, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Refueling time interval"),// 加油时间间隔 + // 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + // tr(""), 0, 0, index, operate)); + + // 针加油持续时长, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duration"), + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index, operate)); + + // // 完成后停车位置选择, 范围 0--4,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 14, 0, 0, PARA_VALUE_TYPE_LIST, + // tr("Parking position selection after completion"),// 完成后停车位置选择 + // 0, 0, 4, 0, 0, tr(""), tr(""), + // strParkingposition,//当前点:0;起始点:1;定位点:2;上料点:3;偏移点:4 + // 0, 0, index, operate)); + + // 偏移点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 偏移点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 偏移点坐标Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 穿线点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标 Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 产量预设, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线动框位移, 范围 0--1000,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blowing air is allowed during sewing"),// 缝纫时吹气允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫间越框机头升降, 范围 0--max,默认 0 + // bit0, 缝纫间越框机头升降; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 移框时动作选择, 范围 0--1,默认 0 + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // // 移框夹线允许, 范围 0--1,默认 0 + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Moving basket Clamp line"),// 移框夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框自动压框允许, 范围 0--1,默认 0 + // // bit2, 开框允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Frame moving and automatic frame pressing allowed"),// 移框自动压框允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框扣线允许, 范围 0--1,默认 0 + // // bit4. 叩线允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 5, 0, PARA_VALUE_TYPE_SW, + // tr("Allowed to move frame and thread"),// 移框扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 软件限位XY移动允许, 范围 0--1,默认 0 + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, index, operate)); + + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 降速最小偏差角度, 范围 0--180,默认 180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 开机自动找零, 范围 0--1,默认 1 + //BIT0:1:开机自动找零, 0:开机不自动找零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode,0, 0, index, operate));//0:自动降速,1参数降速,2不降速 + + // // 机器动作配置, 范围 0--1 + // // bit0 自动拉料允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 1, 0, PARA_VALUE_TYPE_SW, + // tr("Automatic drawing is allowed"),// 自动拉料允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时对边允许, 范围 0--1 + // // bit1 进料时对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 2, 0, PARA_VALUE_TYPE_SW, + // tr("The opposite side is allowed when feeding"),// 进料时对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时展布允许, 范围 0--1,默认 1 + // // bit2 进料时展布允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Allowing distribution during feeding"),// 进料时展布允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切允许, 范围 0--1,默认 1 + // // bit3 进料时中切允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 4, 0, PARA_VALUE_TYPE_SW, + // tr("Medium cutting is allowed during feeding"),// 进料时中切允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切对边允许, 范围 0--1,默认 1 + // // bit4 进料时中切对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 5, 0, PARA_VALUE_TYPE_SW, + // tr("During feeding, it is allowed to cut across the edge"),// 进料时中切对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 机头升降时松线允许, 范围 0--1,默认 1 + // bit5 机头升降时松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 安全输入红外允许, 范围 0--1,默认 0 + // bit0, 红外; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 安全输入气压允许, 范围 0--1,默认 1 + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入上电信号允许, 范围 0--1,默认 0 + // // bit2, 上电信号; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 安全输入安全门允许, 范围 0--1,默认 0 + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入手自动允许, 范围 0--1,默认 0 + // // bit5 手自动按钮 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic safe input"),// 安全输入手自动允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 循环工作允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 0, 0, PARA_VALUE_TYPE_SW, + tr("Loop work allowed"),// 循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 梭加油持续时长, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, root)); + + + // 缝纫吹气时间,范围0-10,单位 s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing air blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 针梭勾线角度, 范围 0--36000,单位0.01度,默认 20200; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, index, operate)); + + //u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, root)); + + //u32 xymvlSpd; // xy空走运行速度, 范围 100--2000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 100, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, index, operate)); + //u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + + // x2零位坐标设置, 范围 0--最大,单位mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 59, 0, 0, PARA_VALUE_TYPE_INT, + tr("X2 Zero Position Coordinate Setup"), + 0, 0, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 机头最小间距, 范围 0--最大,单位mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 62, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum nose clearance"), + 0, 0, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); +} + +//电机和控制动作 +void DoubleHeadCombQui::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 0; + // X向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX)); + // X2向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X2 to move motor"),MT_LX2)); + // Y向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY)); + // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor"),MT_LM)); + // 针电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Needle motor"),MT_LN)); + // 梭电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor"),MT_LH)); + // 升降电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor"),MT_LU)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Lower scissors to cut thread"),OT_DCUT_THREAD,// 下剪刀剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0008,tr("Buckle the bottom line"),OT_PUSH_BTRD,// 扣底线 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("oil"),OT_OIL,// 加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("headlamp"),OT_LIGHT,// 照明灯 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sewing machine head lifting"),OT_SEW_LIFT,// 缝纫机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_OPEN,-1,-1, + strDescend,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sandwich line"),OT_CLIP_UTRD,// 夹面线 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changing device grabbing"),OT_CHBOB_GRAB_OPEN,// 换梭装置抓取 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changer swing"),OT_CHBOB_SWAY_PUSH,// 换梭装置摆动 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changer rotation"),OT_CHBOB_SPIN,// 换梭装置旋转 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sewing Blow"),OT_SEW_BLOW,// 缝纫吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); +} + +//快捷功能 +void DoubleHeadCombQui::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackThread"),"buttonSetAnchorPoint",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetOffsetPoint"),"buttonSetAnchorPoint",FUN_SETOFFSETPOINT));// 定偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backOffsetPoint"),"buttonBackOffsetPoint",FUN_BACKOFFSETPOINT));// 回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NeedZeroPos"),"buttonSetStartPoint",FUN_NEDDLEZEROPOS));//对针零位 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ShutZeroPos"),"buttonSetAnchorPoint",FUN_SHUTTLEZEROPOS));//对梭零位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("workHeadSet"),"buttonWorkHeadSet",FUN_WORK_HEAD_SET));// 工作机头设置 +} + +//辅助功能 +void DoubleHeadCombQui::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +//花样设置 +void DoubleHeadCombQui::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +//参数分类(参数分组功能) +void DoubleHeadCombQui::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +//初始化传感器列表 +void DoubleHeadCombQui::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0020, 2, "X2 " + strZeroPosition));//X2零位 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0022, 0, tr("X negative limit")));//X负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 1, tr("Y negative limit")));//Y负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 2, tr("X2 negative limit")));//X2负限位 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 2, "X2 " + strPositiveLimit));//X2正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ tr("upper limit")));//缝纫机头1高限位 + m_tempSensorList.append(makeASensorItem(0x0040, 1, strSewingMachineHead + " 2" +" "+ tr("upper limit")));//缝纫机头2高限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, tr("Lower limit") + strSewingMachineHead + " 1"));//缝纫机头1低位 + m_tempSensorList.append(makeASensorItem(0x0042, 1, tr("Lower limit") + strSewingMachineHead + " 2"));//缝纫机头2低位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0080, 1, tr("Sewing spindle needle") + " 2" + tr("parking space")));//缝纫主轴2针-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 1, tr("Sewing shuttle") + " 2" + tr("parking space")));//缝纫旋梭2-停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + m_tempSensorList.append(makeASensorItem(0x0170, 1, strSewingMachineHead + " 2" + tr("surface thread breakage inspection")));//缝纫机头2-面线断检 + m_tempSensorList.append(makeASensorItem(0x02C5, 0, tr("Middle limit position of head")));//机头中间限位 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERRQUI_CHANGE_BOBBIN 0x000100F0 // 更换梭芯 + +//初始化错误代码和状态列表 +void DoubleHeadCombQui::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_BOBBIN,tr("replace the shuttle core")));// 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("tensioning device")));// 张紧装置 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NONE,tr("freedom from error")));// 没有错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_POWER,tr("Not powered on")));// 没有上电 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_AIR,tr("Insufficient air pressure")));// 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_SAFE,tr("Safe Area Intervention")));// 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FILL_DATA,tr("Filling data error")));// 填充数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_ALLOWED,tr("Working status not allowed")));// 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CTRL_ERR,tr("control error")));// 控制错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_ERR,tr("Motion control chip version error")));// 运动控制芯片版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BUTTON_NOUP,tr("Waiting for button to lift timeout")));// 等待按钮抬起超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_RESET,tr("FPGA reset error")));// FPGA复位错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_READY,tr("Peripheral not ready")));// 外设未就绪 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_SEND_ERR,tr("Transmission data error")));// 传输数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDTION_ERR,tr("Program version error")));// 程序版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_WORK_DONE,tr("Production completed")));// 完成产量 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_POSITIVE,strForwardLimit));// 正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_NEGATIVE,strReverseLimit));// 反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_ALM,tr("Motion alarm")));// 运动报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_LIMIT,tr("Motion limit")));// 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_EMS,tr("Exercise emergency stop")));// 运动急停 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MV_PARA,tr("Motion parameter error")));// 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MC_PARA,tr("Machine parameter error")));// 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_IN_PARA,tr("Input parameter error")));// 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NORMAL,tr("The file is correct")));// 文件正确 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_WAIT,tr("Waiting for files")));// 等待文件 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_RIGHT,tr("Zero successfully")));// 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_ERROR,tr("Zero error")));// 归零错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_COOR_SYSTM,tr("Coordinate system error")));// 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DATA_ERROR,tr("data error"))); // 数据错误 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_SYNC,tr("Needle shuttle out of sync"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RO_NOT_SYNC,tr("Rotation out of sync"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NOT_POS,tr("The scissors are not returning to their original position"))); // 剪刀不在回位(注:该报错码是缝纫剪刀) + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_LOW,tr("Machine head not in low position"))); // 机头不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Infrared curtain intervention"))); // 红外介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("Bottom line disconnection"))); // 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_ERR,tr("Shuttle Change Device Alarm"))); // 换梭装置报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_SHUTDISK,tr("Replace Shuttle Disk"))); // 更换梭盘 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FEED_ROLLER,tr("Abnormal feeding pressure roller"))); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_ROLLER,tr("Abnormal discharge pressure roller"))); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_MATERIAL,tr("Abnormal discharge and pressing"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CLOTH_DEVICE,tr("Abnormal cloth clamping device"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_MOTOR,tr("Cross cutting motor abnormality"))); // 横切电机 异常 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area"))); // 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_POS,tr("Template not in place"))); // 模版不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + QString str = tr("The scissors are not returning to their original position");//剪刀不在回位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, str + QString::number(1))); + +} + diff --git a/mctype/patternsingleboard/function/doubleheadcombqui.h b/mctype/patternsingleboard/function/doubleheadcombqui.h new file mode 100644 index 0000000..8714a3d --- /dev/null +++ b/mctype/patternsingleboard/function/doubleheadcombqui.h @@ -0,0 +1,35 @@ +#ifndef DOUBLEHEADCOMBQUI +#define DOUBLEHEADCOMBQUI + +#include "mctype/machinetypefun.h" + + +//双头组合绗缝机 +class DoubleHeadCombQui : public MachineTypeFun +{ + Q_OBJECT +public: + DoubleHeadCombQui(); + ~DoubleHeadCombQui(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; +#endif // DOUBLEHEADCOMBQUI diff --git a/mctype/patternsingleboard/function/doublelayeredmac.cpp b/mctype/patternsingleboard/function/doublelayeredmac.cpp new file mode 100644 index 0000000..2c54a6d --- /dev/null +++ b/mctype/patternsingleboard/function/doublelayeredmac.cpp @@ -0,0 +1,1903 @@ +#include "doublelayeredmac.h" + +DoubleLayeredMac::DoubleLayeredMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + + +//初始化九宫格功能按键 +void DoubleLayeredMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); + +} + +void DoubleLayeredMac::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +//花样参数 +void DoubleLayeredMac::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-25000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, index++, operate)); + } + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + //花样参数--------------------------- +} + +//机器参数 +void DoubleLayeredMac::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + + //自动换梭装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, 0x0001, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //光幕装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Light curtain device"),//光幕装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, 0x0004, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0006, operate)); + + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, 0x0007, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, 0x0008, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, 0x0009, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0010, operate)); + + + //进料编码器系数分子, 范围 1--100000,单位 无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient molecule"),//进料编码器系数分子 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0011, root)); + + //零切距离, 范围1--500000 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero tangent distance"),//零切距离 + 0, 1, 500000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0012, root)); + //切料箱装置选择, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Feeding device"),//进料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //横切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Crosscutting device"),//横切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //夹布装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Cloth clamping device"),//夹布装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //张紧装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Tensioning device"),//张紧装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //边切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Edge cutting device"),//边切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //左上料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 6, 0, PARA_VALUE_TYPE_SW, + tr("Left feeding device"),//左上料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //右上料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 7, 0, PARA_VALUE_TYPE_SW, + tr("Right feeding device"),//右上料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //退料电机装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 8, 0, PARA_VALUE_TYPE_SW, + tr("Material return motor device"),//退料电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //展布电机装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 9, 0, PARA_VALUE_TYPE_SW, + tr("Distribution motor device"),//展布电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //中切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 10, 0, PARA_VALUE_TYPE_SW, + tr("Mid cutting device"),//中切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //中切对边装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 11, 0, PARA_VALUE_TYPE_SW, + tr("Mid cut edge device"),//中切对边装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //出料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 12, 0, PARA_VALUE_TYPE_SW, + tr("Discharge device"),//出料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //卷料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 13, 0, PARA_VALUE_TYPE_SW, + tr("Roll material device"),//卷料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + + //X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0014, root)); + + // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0015, root)); + + //进料编码器系数分母, 范围 1--100000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient denominator"),//进料编码器系数分母 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x00C3, root)); + +} + +//工作参数 +void DoubleLayeredMac::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0100, operate)); + + // 主轴回针转速, 范围 1--500,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0101, operate)); + + // 缝纫动框方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, 0, 0, 0x0102, root));//连续:0;间歇式:1 + + // 缝纫加减速方式, 范围 0--1,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + 1, 1, 0x0102, root)); + + // 缝纫机头旋转方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing machine head rotating manner"),// 缝纫机头旋转方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Continuous rotation:0;Xy intermittent rotation:1"),//连续旋转:0;Xy间歇旋转:1 + 0, 0, 0x0102, root)); + + // 缝纫机头加减速方式, 范围 0--1,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing head deceleration mode"),// 缝纫机头加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr("No acceleration or deceleration:0;Intermittent acceleration and deceleration:1"), //无加速或减速:0;间歇加减速:1 + 1, 1, 0x0102, root));//无加速或减速:0;间歇加减速:1 + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0102, operate)); + // bit1, 夹线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 2, 0, PARA_VALUE_TYPE_SW, + tr("Needle and thread clamping allowed"),// 起针夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0102, operate)); + + // 剪线允许, 范围 0--3,默认 1 + // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, 0x0104, operate)); + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // bit1, 拉线允许; + // 剪线时拉线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 2, 0, PARA_VALUE_TYPE_SW, + tr("Thread pulling allowed during thread trimming"),// 剪线时拉线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit2, 夹线允许; + // 剪线时夹线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 3, 0, PARA_VALUE_TYPE_SW, + tr("Thread clamping allowed during thread trimming"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // bit3, 提升压脚允许; + // 剪线时提升压脚允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 4, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit4, 提升机头剪线; + // 剪线时提升机头剪线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit5, 提升机头夹线;0:允许 1:不允许 + // 剪线时提升机头夹线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit6, 在压脚下勾线;0:允许 1:不允许 + // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 7, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + + // bit7, 退针允许;0:允许 1:不允许 + // 剪线时退针允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit8, 扣线允许;0:允许 1:不允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 9, 0, PARA_VALUE_TYPE_LIST, + tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + + + // 断线检测针数, 范围 0--10,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, 0x0106, operate)); + + // 换梭芯提醒功能, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, 0x0107, operate)); + + // 底线长度, 范围 0--S32_MAX, 单位 0.01mm 默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0108, operate)); + + // 换梭片数计数, 范围 0--1000,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, 0x0109, operate)); + + // 加油方式选择, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, 0x010A, operate)); + + // 加油针数间隔, 范围 S32_MIN--S32_MAX,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, 0x010B, operate)); + + // 加油持续时长, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling duration"),// 加油持续时长 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, 0x010D, operate)); + + // 完成后停车位置选择, 范围 0--4,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 14, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Parking position selection after completion"),// 完成后停车位置选择 + 0, 0, 4, 0, 0, tr(""), tr(""), + strParkingposition,//当前点:0;起始点:1;定位点:2;上料点:3;偏移点:4 + 0, 0, 0x010E, operate)); + + // 偏移点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x010F, operate)); + + // 偏移点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0110, operate)); + + // 偏移点坐标Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0111, operate)); + + // 穿线点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x0112, operate)); + + // 穿线点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0113, operate)); + + // 穿线点坐标 Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0114, operate)); + + // 产量预设, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0115, operate)); + + // 剪线动框位移, 范围 0--1000,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0116, operate)); + + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0, 0, 不允许; 1, 允许 + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 缝纫间越框机头升降, 范围 0--max,默认 0 + // bit0, 缝纫间越框机头升降; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框时动作选择, 范围 0--1,默认 0 + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框夹线允许, 范围 0--1,默认 0 + // bit1, 夹线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 2, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Clamp line"),// 移框夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框自动压框允许, 范围 0--1,默认 0 + // bit2, 开框允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 3, 0, PARA_VALUE_TYPE_SW, + tr("Frame moving and automatic frame pressing allowed"),// 移框自动压框允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, root)); + + // 移框扣线允许, 范围 0--1,默认 0 + // bit4. 叩线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 5, 0, PARA_VALUE_TYPE_SW, + tr("Allowed to move frame and thread"),// 移框扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, root)); + + // 软件限位XY移动允许, 范围 0--1,默认 0 + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x011C, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, 0x0122, operate)); + + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0123, operate)); + + // 降速最小偏差角度, 范围 0--180,默认 180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0124, operate)); + + // 开机自动找零, 范围 0--1,默认 1 + //BIT0:1:开机自动找零, 0:开机不自动找零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0125, root)); + + + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode, 0, 0, 0x0126, root));//0:自动降速,1参数降速,2不降速 + + // 机器动作配置, 范围 0--1 + // bit0 自动拉料允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 1, 0, PARA_VALUE_TYPE_SW, + tr("Automatic drawing is allowed"),// 自动拉料允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时对边允许, 范围 0--1 + // bit1 进料时对边允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 2, 0, PARA_VALUE_TYPE_SW, + tr("The opposite side is allowed when feeding"),// 进料时对边允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时展布允许, 范围 0--1,默认 1 + // bit2 进料时展布允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allowing distribution during feeding"),// 进料时展布允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时中切允许, 范围 0--1,默认 1 + // bit3 进料时中切允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 4, 0, PARA_VALUE_TYPE_SW, + tr("Medium cutting is allowed during feeding"),// 进料时中切允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时中切对边允许, 范围 0--1,默认 1 + // bit4 进料时中切对边允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 5, 0, PARA_VALUE_TYPE_SW, + tr("During feeding, it is allowed to cut across the edge"),// 进料时中切对边允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 机头升降时松线允许, 范围 0--1,默认 1 + // bit5 机头升降时松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, operate)); + + // 安全输入光幕允许, 范围 0--1,默认 0 + // bit0, 光幕; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input light curtain allows"),// 安全输入光幕允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0127, operate)); + + // 安全输入气压允许, 范围 0--1,默认 1 + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0127, operate)); + + // 安全输入上电信号允许, 范围 0--1,默认 0 + // bit2, 上电信号; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0127, root)); + + // 安全输入安全门允许, 范围 0--1,默认 0 + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0128, root)); + + // 安全输入手自动允许, 范围 0--1,默认 0 + // bit5 手自动按钮 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 6, 0, PARA_VALUE_TYPE_LIST, + tr("Manual and automatic safe input"),// 安全输入手自动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0127, root)); + + // 循环工作允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 0, 0, PARA_VALUE_TYPE_SW, + tr("Loop work allowed"),// 循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0129, root)); + + // 梭加油持续时长, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, 0x0129, root)); + + + // 缝纫吹气时间,范围0-50,单位 s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing air blowing time"),// 缝纫吹气时间 + 0, 0, 50, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 针梭勾线角度, 范围 0--36000,单位0.01度,默认 20200; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 拉料长度, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"),//拉料长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + // 裁切长度, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting length"),//裁切长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 拉料张紧距离, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 45, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling and tensioning distance"),//拉料张紧距离 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit0 吹气允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blow air during sewing"),// 缝纫时吹气 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit1 摆针允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 2, 0, PARA_VALUE_TYPE_SW, + tr("Stitch during sewing"),// 缝纫时摆针 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit2 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 3, 0, PARA_VALUE_TYPE_SW, + tr("Automatic rewinding point during sewing"),// 缝纫时自动回穿线点 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit3 机头旋转允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 4, 0, PARA_VALUE_TYPE_SW, + tr("The machine head rotates during sewing"),// 缝纫时机头旋转 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // bit4 送边条允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 5, 0, PARA_VALUE_TYPE_SW, + tr("Send edge strips during sewing"),// 缝纫时送边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // bit5 针杆离合允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 6, 0, PARA_VALUE_TYPE_SW, + tr("Needle bar clutch during sewing"),// 缝纫时针杆离合 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit6 大压脚动作允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 7, 0, PARA_VALUE_TYPE_SW, + tr("Heavy foot pressure action during sewing"),// 缝纫时大压脚动作 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit7 缝纫前拍照允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 8, 0, PARA_VALUE_TYPE_SW, + tr("Taking photos before sewing"),// 缝纫前拍照允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit8 缝纫过程中进料允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 9, 0, PARA_VALUE_TYPE_SW, + tr("Feed during sewing"),// 缝纫时进料 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit9 缝纫过程中缝织带允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 10, 0, PARA_VALUE_TYPE_SW, + tr("Sew tape during sewing"),// 缝纫时缝织带 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit10 缝纫过程中边缝允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 11, 0, PARA_VALUE_TYPE_SW, + tr("Side Seam during sewing"),// 缝纫时边缝 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit11 按数据送边条 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 12, 0, PARA_VALUE_TYPE_SW, + tr("Send border strips according to data"),// 按数据送边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit12 移框时出边条 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 13, 0, PARA_VALUE_TYPE_SW, + tr("Exceeding the border when moving the frame"),// 移框时超出边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit13 缝纫机头作画笔允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 14, 0, PARA_VALUE_TYPE_SW, + tr("Sewing machine head as a paintbrush"),// 缝纫机头作画笔允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // 拉料电机拉料位置, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 47, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling position of the material motor"),//拉料电机拉料位置 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 夹子开合保护距离(0~100.00mm, 范围0~100.00mm) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 48, 0, 0, PARA_VALUE_TYPE_INT, + tr("Clip opening and closing protection distance"),//夹子开合保护距离 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + //机械手拉料速度, 范围 1--1000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 49, 0, 0, PARA_VALUE_TYPE_INT, + tr("Mechanical arm material pulling speed"),//机械手拉料速度 + 300, 1, 1000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 机械手返程速度, 范围 1--1000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 50, 0, 0, PARA_VALUE_TYPE_INT, + tr("Return speed of robotic arm"),//机械手返程速度 + 300, 1, 1000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + //u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + + //u32 xymvlSpd; // xy空走运行速度, 范围 100--2000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 100, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + //u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + +} + +#define OT_DRAW_LIFT 0x0008 // 画笔升降 上升 下降 +#define OT_DRAW_HAT 0x0009 // 画笔笔帽 打开 关闭 + + +#define OT_CRAMP_OPEN 0x0011 // 夹布 开合 +#define OT_TENS_OPEN 0x0012 // 张紧 开合 +#define OT_CRAMP_FRONT_DOWN 0x001B // 前夹布 升降 +#define OT_CRAMP_FRONT_OPEN 0x001C // 前夹布 开合 +#define OT_CRAMP_UP_DOWN 0x001D // 上夹布 升降 +#define OT_CRAMPD_UP_DOWN 0x001E // 下夹布 升降 +#define OT_ROLL_IN_DOWN 0x0013 // 进料压辊 升降 +#define OT_ROLL_OUT_DOWN 0x0014 // 出料压辊 升降 +#define OT_CHBOB_GRAB_OPEN 0x0070 // 换梭装置抓取 开合 +#define OT_CHBOB_SWAY_PUSH 0x0071 // 换梭装置摆动 伸缩 +#define OT_CHBOB_SPIN 0x0073 // 换梭装置旋转 伸缩 + + + +//电机和控制动作 +void DoubleLayeredMac::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 0; + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("X to move motor"),MT_LX,// X向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Y to move motor"),MT_LY,// Y向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor"),MT_LM,// 主轴电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Needle motor"),MT_LN,// 针电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle motor"),MT_LH,// 梭电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lifting motor"),MT_LU,// 升降电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lifting motor"),MT_LU,// 升降电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Conveyer belt"),MT_LB,// 传送带 找零 正反转 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Pulling motor"),MT_LPL,// 拉料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower scissors to cut thread"),OT_DCUT_THREAD,// 下剪刀剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("oil"),OT_OIL,// 加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Buckle the bottom line"),OT_PUSH_BTRD,// 扣底线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sandwich line"),OT_CLIP_UTRD,// 夹面线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sewing machine head lifting"),OT_SEW_LIFT,// 缝纫机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_OPEN,-1,-1, + strDescend,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("textile"),OT_CRAMP_OPEN,// 夹布 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("tensioning"),OT_TENS_OPEN,// 张紧 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Front clip cloth"),OT_CRAMP_FRONT_OPEN,// 前夹布 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Front clip cloth"),OT_CRAMP_FRONT_DOWN,// 前夹布 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Upper clip cloth"),OT_CRAMP_UP_DOWN,// 上夹布 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower clip fabric"),OT_CRAMPD_UP_DOWN,// 下夹布 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Feed pressure roller"),OT_ROLL_IN_DOWN,// 进料压辊 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Discharge pressure roller"),OT_ROLL_OUT_DOWN,// 出料压辊 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device grabbing"),OT_CHBOB_GRAB_OPEN,// 换梭装置抓取 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Swing of shuttle changing device"),OT_CHBOB_SWAY_PUSH,// 换梭装置摆动 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device rotation"),OT_CHBOB_SPIN,// 换梭装置旋转 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + +} + +//快捷功能 +void DoubleLayeredMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackThread"),"buttonSetAnchorPoint",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("installFirst bobbin"),"buttonBottomDetect",FUN_INSTALL_FIRST_BOBBIN));//安装第一个梭壳 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom plateToHead"),"buttonCoilParas",FUN_SHUT_FROM_PLATE_TO_HEAD));//将旋梭从梭盘拿到机头 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom headToPlate"),"buttonCoilParas",FUN_SHUT_FROM_HEAD_TO_PLATE));//将旋梭从机头拿到梭盘 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto takePlate"),"buttonHeadEmb",FUN_SHUT_INTO_TAKE_PLATE));//进入更换梭盘状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto indxSta"),"buttonHardwareConfig",FUN_SHUT_INTO_INDX_STA));//进入缝纫状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackOffset"),"buttonQuantityMoveFrame",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonSetAnchorPoint",FUN_OUTPUTRESET));//产量清零 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NeedZeroPos"),"buttonSetStartPoint",FUN_NEDDLEZEROPOS));//对针零位 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ShutZeroPos"),"buttonSetAnchorPoint",FUN_SHUTTLEZEROPOS));//对梭零位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING));//手动剪线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTUPDOWN));//机头升降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set Start Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 +} + +//辅助功能 +void DoubleLayeredMac::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + // m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +//花样设置 +void DoubleLayeredMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +//参数分类(参数分组功能) +void DoubleLayeredMac::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +#define DSS1_B_START_BT 0x0000 // 启动按钮(1~8) +#define DSS6_ADDR_02B0 0x02B0 // 自动换梭信号 +// BIT1 : 梭在位检测 +// BIT2 : 扣线伸出位 +// BIT3 : 换梭旋转伸出位 +// BIT4 : 换梭旋转收回位 +// BIT5 : 换梭推动伸出位 +// BIT6 : 换梭推动收回位 +// BIT7 : 换梭摆动伸出位 +// BIT8 : 换梭摆动收回位 + +#define DSS6_ADDR_02B1 0x02B1 // 自动换梭信号 +// BIT1 :防扎带-检测 +// BIT2 :一键横切按钮 +// BIT3 : 高低速切换 按钮 +// BIT4 :进料微调按钮 +// BIT5 :退料微调按钮 +// BIT6 :手动加油按钮 +// BIT7 :画笔高位 +// BIT8 :画笔低位 + + + +#define DSS6_ADDR_02B3 0x02B3 // +// BIT1 : 物料到位左 +// BIT2 : 物料到位右 +// BIT3 : 前夹升 +// BIT4 : 前夹降 +// BIT5 : 前夹开 +// BIT6 : 前夹合 +// BIT7 : 翻板等待模式 +// BIT8 : 翻板到位信号 + +#define DSS6_ADDR_02B4 0x02B4 // +// BIT1 :夹布开 +// BIT2 :夹布关 +// BIT3 :张紧 紧 +// BIT4 :张紧 放松 +// BIT5 :出料压辊升 +// BIT6 :出料压辊降 +// BIT7 :出料完成 +// BIT8 :机头在维修区域 + +#define DSS6_ADDR_02B5 0x02B5 // +// BIT1 :机械手上夹升 +// BIT2 :机械手上夹降 +// BIT3 :机械手下夹升 +// BIT4 :机械手下夹降 +// BIT5 :机械手拉料零位 +// BIT6 :机械手拉料降速 +// BIT7 :机械手在安全区域检测 +// BIT8 :平台储料检测 + + +//初始化传感器列表 +void DoubleLayeredMac::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 0, tr("X deceleration")));//X降速 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0082, 0, tr("Sewing needle hook thread")));//缝纫针勾线位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x008A, 0, tr("Sewing shuttle hook thread")));//缝纫梭勾线位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 0, tr("Shuttle position detection")));//梭在位检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 1, tr("Buckle extension")));//扣线伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 2, tr("Swapping shuttle, rotating and extending")));//换梭旋转伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 3, tr("Swap shuttle, rotate and retract")));//换梭旋转收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 4, tr("Replace the shuttle and push it out")));//换梭推动伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 5, tr("Replace the shuttle and push for retrieval")));//换梭推动收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 6, tr("Swapping shuttle swings and extends")));//换梭摆动伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 7, tr("Swapping shuttle, swinging and retracting")));//换梭摆动收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 0, tr("Anti zip ties - detection")));//防扎带-检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 1, tr("One click cross cutting button")));//一键横切按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 2, tr("High/Low Speed Switching Button")));//高低速切换按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 3, tr("Feed fine-tuning button")));//进料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 4, tr("Return material fine adjustment button")));//退料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 5, tr("Manual refueling button")));//手动加油按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 6, tr("Brush high position")));//画笔高位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 7, tr("Brush low position")));//画笔低位 + QString strLightCurtain = tr("light curtain");//光幕 + for(int i=1; i<8; i++) + { + m_tempSensorList.append(makeASensorItem(0x02B2, 0, strLightCurtain + QString::number(i))); + } + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 0, tr("Materials are in place on the left"))); // BIT1 : 物料到位左 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 1, tr("The materials are in place on the right"))); // BIT2 : 物料到位右 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 2, tr("Front clip lift"))); // BIT3 : 前夹升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 3, tr("Front clip lowering"))); // BIT4 : 前夹降 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 4, tr("Front clip open"))); // BIT5 : 前夹开 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 5, tr("Front clamp"))); // BIT6 : 前夹合 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 6, tr("Flip board waiting mode"))); // BIT7 : 翻板等待模式 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B3, 7, tr("Flip board in place signal"))); // BIT8 : 翻板到位信号 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 0, tr("Clip the cloth open"))); // BIT1 :夹布开 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 1, tr("Jiabu Pass"))); // BIT2 :夹布关 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 2, tr("taut"))); // BIT3 :张紧 紧 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 3, tr("relax"))); // BIT4 :张紧 放松 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 4, tr("Discharge roller lift"))); // BIT5 :出料压辊升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 5, tr("The discharge pressure roller is lowered"))); // BIT6 :出料压辊降 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 6, tr("Discharge completed"))); // BIT7 :出料完成 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B4, 7, tr("The machine head is in the maintenance area"))); // BIT8 :机头在维修区域 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 0, tr("Mechanical arm clamp lift"))); // BIT1 :机械手上夹升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 1, tr("Mechanical arm clamp down"))); // BIT2 :机械手上夹降 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 2, tr("Mechanical gripper lift"))); // BIT3 :机械手下夹升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 3, tr("Mechanical gripper lowering"))); // BIT4 :机械手下夹降 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 4, tr("Mechanical arm pulling material zero position"))); // BIT5 :机械手拉料零位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 5, tr("Mechanical arm material pulling speed reduction"))); // BIT6 :机械手拉料降速 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 6, tr("Robot arm testing in safe area"))); // BIT7 :机械手在安全区域检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B5, 7, tr("Platform storage detection"))); // BIT8 :平台储料检测 + + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + + +#define ERR_PEN_TIMEOUT 0x00010042 // 画笔升降超时 +#define ERR_PENHAT_TIMEOUT 0x00010043 // 画笔笔帽超时 + + +#define ERR_FEED_ROLLER 0x0200 // 进料压辊 异常 +#define ERR_DIS_ROLLER 0x0201 // 出料压辊 异常 +#define ERR_DIS_MATERIAL 0x0202 // 出料压料 异常 +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 + +#define ERR_FCLAMP_LIFT 0x0207 // 前夹升降气缸 异常 +#define ERR_FCLAMP_OPCL 0x0208 // 前夹开合气缸 异常 +#define ERR_PULL_CLAMP 0x0209 // 机械手上夹气缸 异常 +#define ERR_PULL_CLIP 0x020A // 机械手下夹气缸 异常 +#define ERR_YZR_NOT_SYNC 0x020B // 右框电机不同步 +#define ERR_CHIP_ERROR 0x020C // 夹线装置位置 异常 +#define ERR_FIXTURE1_ERROR 0x020D // 工装1传感器错误 +#define ERR_FIXTURE2_ERROR 0x020E // 工装2传感器错误 +#define ERR_CLASH_ERROR 0x020F // 工装防撞未就绪 + +#define ERR_IN_NO_MAT 0x009B // 进料无物料 +#define ERR_IN_MAT_ERR 0x009C // 进料物料检测异常 +#define ERR_OUT_MAT_ERR 0x009D // 出料物料检测异常 + +#define ERR_NOTIN_SAFE_AREA 0x009E // 机头不在安全区域 +#define ERR_FEED_ROLLER 0x0200 // 进料压辊 异常 +#define ERR_DIS_ROLLER 0x0201 // 出料压辊 异常 +#define ERR_DIS_MATERIAL 0x0202 // 出料压料 异常 +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 +#define ERR_FCLAMP_LIFT 0x0207 // 前夹升降气缸 异常 +#define ERR_FCLAMP_OPCL 0x0208 // 前夹开合气缸 异常 +#define ERR_PULL_CLAMP 0x0209 // 机械手上夹气缸 异常 +#define ERR_PULL_CLIP 0x020A // 机械手下夹气缸 异常 +#define ERR_YZR_NOT_SYNC 0x020B // 右框电机不同步 +#define ERR_CHIP_ERROR 0x020C // 夹线装置位置 异常 +#define ERR_FIXTURE1_ERROR 0x020D // 工装1传感器错误 +#define ERR_FIXTURE2_ERROR 0x020E // 工装2传感器错误 +#define ERR_CLASH_ERROR 0x020F // 工装防撞未就绪 + +#define ERR_BEDSEET_ERRF 0x0001022F // 物料输送超时 + +#define ERR_CHB_SWAY 0x0219 // 换梭摆动装置 异常 +#define ERR_CHB_PUSH 0x021A // 换梭推动装置 异常 +#define ERR_CHB_ROTATE 0x021B // 换梭旋转装置 异常 +#define ERR_CHB_SHUT 0x021C // 梭壳检测 异常 + + +//初始化错误代码和状态列表 +void DoubleLayeredMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + QString strError = tr("error");// 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_SWAY,tr("Shuttle changing swinging device") + " " + strError)); // 换梭摆动装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_PUSH,tr("Shuttle changing pushing device") + " " + strError)); // 换梭推动装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_ROTATE,tr("Shuttle changing rotating device") + " " + strError)); // 换梭旋转装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_SHUT,tr("Shuttle shell inspection") + " " + strError)); // 梭壳检测 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_ROLLER,tr("Abnormal feeding pressure roller") + " " + strError)); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_ROLLER,tr("Abnormal discharge pressure roller") + " " + strError)); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_MATERIAL,tr("Abnormal discharge and pressing") + " " + strError)); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("Tensioning device abnormal") + " " + strError)); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLOTH_DEVICE,tr("Abnormal cloth clamping device") + " " + strError)); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EDGE_MOTOR,tr("Edge cutting motor blocked") + " " + strError)); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CROSS_MOTOR,tr("Cross cutting motor abnormality") + " " + strError)); // 横切电机 异常 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PEN_TIMEOUT, tr("Brush lifting timeout"))); // 画笔升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, tr("Pen cap timeout"))); // 画笔笔帽超时 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_ROLLER,tr("Abnormal feeding pressure roller"))); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_ROLLER,tr("Abnormal discharge pressure roller"))); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_MATERIAL,tr("Abnormal discharge and pressing"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLOTH_DEVICE,tr("Abnormal cloth clamping device"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CROSS_MOTOR,tr("Cross cutting motor abnormality"))); // 横切电机 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FCLAMP_LIFT,tr("Abnormal front clamp lifting cylinder"))); // 前夹升降气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FCLAMP_OPCL,tr("Abnormal front clamp opening and closing cylinder"))); // 前夹开合气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULL_CLAMP,tr("Abnormal clamping cylinder on the robotic arm"))); // 机械手上夹气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULL_CLIP,tr("Abnormal clamping of the pneumatic cylinder under the robotic arm"))); // 机械手下夹气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_YZR_NOT_SYNC,tr("Right frame motor is not synchronized"))); // 右框电机不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHIP_ERROR,tr("Abnormal position of clamping device"))); // 夹线装置位置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FIXTURE1_ERROR,tr("Tool 1 sensor error"))); // 工装1传感器错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FIXTURE2_ERROR,tr("Tool 2 sensor error"))); // 工装2传感器错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLASH_ERROR,tr("The tooling anti-collision is not ready"))); // 工装防撞未就绪 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_NO_MAT,tr("There is no material in the feed"))); // 进料无物料 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_MAT_ERR,tr("Abnormal incoming material detection"))); // 进料物料检测异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_MAT_ERR,tr("Abnormal material detection during discharge"))); // 出料物料检测异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRF,tr("Material delivery timeout"))); // 物料输送超时 +} + + diff --git a/mctype/patternsingleboard/function/doublelayeredmac.h b/mctype/patternsingleboard/function/doublelayeredmac.h new file mode 100644 index 0000000..f9abcef --- /dev/null +++ b/mctype/patternsingleboard/function/doublelayeredmac.h @@ -0,0 +1,41 @@ +#ifndef DoubleLayeredMac_H +#define DoubleLayeredMac_H + +#include "mctype/machinetypefun.h" + +/// +/// \brief The DoubleLayeredMac class +/// 双层绗缝机 +/// +class DoubleLayeredMac : public MachineTypeFun +{ + Q_OBJECT +public: + DoubleLayeredMac(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +signals: + +public slots: +}; + +#endif // DoubleLayeredMac_H diff --git a/mctype/patternsingleboard/function/doublesidedbedsheets.cpp b/mctype/patternsingleboard/function/doublesidedbedsheets.cpp new file mode 100644 index 0000000..63b1240 --- /dev/null +++ b/mctype/patternsingleboard/function/doublesidedbedsheets.cpp @@ -0,0 +1,582 @@ +#include "doublesidedbedsheets.h" + +DoubleSidedBedSheets::DoubleSidedBedSheets() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void DoubleSidedBedSheets::initFileInfoLabel() +{ + m_fileInfo.append(Production); +} + +void DoubleSidedBedSheets::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, index++, operate)); + } + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +} + +void DoubleSidedBedSheets::initMcParasList() +{ + + // 边缝主轴转速 范围 10 --3000 单位r/min, 默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Edge seam spindle speed"), // 边缝主轴转速 + 300, 10, 3000, 300, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + + +//u32 edgestepNum; // 边缝针步设定 范围 20--100 单位0.1mm 默认 40 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Edge sewing needle step setting"), // 边缝针步设定 + 40, 20, 100, 40, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 edgeBreakTime; // 边缝断检时间 范围 0~20 单位:针 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("Edge seam inspection time"), // 边缝断检时间 + 0, 0, 20, 0, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 edgeRollerComp; // 边缝罗拉补偿 范围 50~150 单位% 默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Edge seam roller compensation"), // 边缝罗拉补偿 + 100, 50, 150, 100, 0, tr("%"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 PullOutPos; // 拉料位置 范围 0--50000, 单位0.1mm, 默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("Material pulling position"), // 拉料位置 + 10, 0, 50000, 10, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 PullLength; // 拉料长度 范围 0--50000, 单位0.1mm, 默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"), // 拉料长度 + 10, 0, 50000, 10, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 PullOutSpeed; // 拉料伸出速度 范围100 -- 3000 单位mm/s, 默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pull material extension speed"), // 拉料伸出速度 + 300, 100, 3000, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 PullBackSpeed; // 拉料返回速度 范围100 -- 3000 单位mm/s, 默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pull material return speed"), // 拉料返回速度 + 300, 100, 3000, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 CrossOutPos; // 横切伸出位置 范围 0--50000, 单位0.1mm, 默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Transverse extension position"), // 横切伸出位置 + 10, 0, 50000, 10, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 CrossBackPos; // 横切返回位置 范围 0--50000, 单位0.1mm, 默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Horizontal Return Position"), // 横切返回位置 + 10, 0, 50000, 10, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 CrossOutSpeed; // 横切伸出速度 范围100 -- 3000 单位mm/s, 默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 0, 0, PARA_VALUE_TYPE_INT, + tr("Transverse extension speed"), // 横切伸出速度 + 300, 100, 3000, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 CrossBackSpeed; // 横切返回速度 范围100 -- 3000 单位mm/s, 默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cross cutting return speed"), // 横切返回速度 + 300, 100, 3000, 300, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 BobbinLength; // 换梭底线长度 范围 0 -- 100000.00 单位0.01m,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Change the length of the shuttle bottom line"), // 换梭底线长度 + 0, 0, 10000000, 0, 2, tr("m"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + + //u32 Ultenable; // 超声波膜具使能 范围 0 -- 1 0:关闭 1:打开 默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_SW, + tr("Ultrasonic film tool enablement"), // 超声波膜具使能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + + //u32 Cutenable; // 切刀膜具使能 范围 0 -- 1 0:关闭 1:打开 默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 14, 0, 0, PARA_VALUE_TYPE_SW, + tr("Blade film tool enable"), // 切刀膜具使能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + + //u32 PullEnable; // 拉料部分启用 范围 0 -- 1 0:关闭 1:打开 默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 15, 0, 0, PARA_VALUE_TYPE_SW, + tr("The material pulling part is activated"), // 拉料部分启用 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 expectedOutput; // 产量预设, 0, 关闭功能;其余,按照预设产量提示 单位 床 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"), // 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0008, operate)); +// u32 Palletizing; // 码垛预设, 0, 关闭功能;其余,按照预设产量提示 单位 床 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Stacking preset"), // 码垛预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 SendRollerComp; // 送料电机补偿 范围 50~150 单位% 默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Compensation for feeding motor"), // 送料电机补偿 + 100, 50, 150, 100, 0, "%", tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +// u32 Sendinterval; // 电机送料间隔 范围 10 --100000 单位0.1mm 默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Motor feeding interval"), // 电机送料间隔 + 3000, 10, 100000, 3000, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0008, operate)); + +} + +void DoubleSidedBedSheets::initWkParasList() +{ + +} + +#define MT_1 0x0201 // 左机头主轴电机 正转/反转/归零 +#define MT_2 0x0202 // 右机头主轴电机 正转/反转/归零 +#define MT_3 0x0203 // 裁切移动电机 正转/反转/归零 +#define MT_4 0x0204 // 拉料电机 正转/反转/归零 +#define MT_5 0x0205 // 罗拉电机 正转/反转 +#define MT_6 0x0206 // 上料电机 正转/反转 +#define MT_7 0x0207 // 出料电机 正转/反转 +#define MT_8 0x0208 // 送料架电机 正转/反转 + +#define OT_CT_2 0X0002 // 裁切切刀气缸 上升 下降 +#define OT_CT_3 0X0003 // 裁切超声波气缸 上升 下降 +#define OT_CT_4 0X0004 // 裁切顶出气缸 伸出 收回 +#define OT_CT_5 0X0005 // 裁切前夹料气缸 上升 下降 +#define OT_CT_6 0X0006 // 裁切后上夹料气缸 上升 下降 +#define OT_CT_7 0X0007 // 裁切后下夹料气缸 上升 下降 +#define OT_CT_8 0X0008 // 裁切夹爪气缸 打开 关闭 +#define OT_CT_9 0X0009 // 裁切超声波 打开 关闭 +#define OT_CT_A 0X000A // 左/右剪刀电机 打开 关闭 +#define OT_CT_B 0X000B // 裁切飞刀电机 打开 关闭 + + +void DoubleSidedBedSheets::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 1; + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Left head spindle motor"),MT_1));// 左机头主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Right machine head spindle motor"),MT_2));// 右机头主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Cutting mobile motor"),MT_3));// 裁切移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pulling motor"),MT_4));// 拉料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Lola motor"),MT_5));// 罗拉电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Loading motor"),MT_6));// 上料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Discharge motor"),MT_7));// 出料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Feeding rack motor"),MT_8));// 送料架电机 + + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Cutting blade cylinder"), OT_CT_2)); //裁切切刀气缸 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Cutting ultrasonic cylinder"), OT_CT_3)); // 裁切超声波气缸 上升 下降 + m_allOutCtrlList.append(creatStrRecItem(0,showPriority++,tr("Cutting and ejecting cylinder"), OT_CT_4)); // 裁切顶出气缸 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Pre cutting clamping cylinder"), OT_CT_5)); // 裁切前夹料气缸 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("After cutting, the upper clamping cylinder"), OT_CT_6)); // 裁切后上夹料气缸 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("After cutting, lower the clamping cylinder"), OT_CT_7)); // 裁切后下夹料气缸 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Cutting Claw Cylinder"), OT_CT_8)); // 裁切夹爪气缸 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Cutting ultrasonic waves"), OT_CT_9)); // 裁切超声波 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Left and right scissor motors"), OT_CT_A)); // 左右剪刀电机 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Cutting Flying Knife Motor"), OT_CT_B)); // 裁切飞刀电机 + +} + + +void DoubleSidedBedSheets::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Reset All"),"buttonAllToZero",FUN_RESET_ALL));//全部复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Material Pulling"),"buttonPulling",FUN_ONE_PULLING));//一键拉料 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Cross Cut"),"chiselPoint",FUN_ONE_CROSS_CUT));//一键横切 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Bottom line clearing count"),"buttonFrameZero",FUN_BOTTOM_CLEARING_COUNT));// 底线清空计数 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 +} +#define DSS6_ADDR_02C0 0x02C0 +// BIT1 : 上料物料检测 +// BIT2 :左机头主轴零位 +// BIT3 :右机头主轴零位 +// BIT4 : 左机头断线检测 +// BIT5 : 右机头断线检测 +// BIT6 : 储料下限位 +// BIT7 : 储料中位 +// BIT8 : 裁切正限位 +#define DSS6_ADDR_02C1 0x02C1 +// BIT1 : 裁切负限位 +// BIT2 :裁切零限位 +// BIT3 :拉料正限位 +// BIT4 : 拉料负限位 +// BIT5 : 拉料零限位 +// BIT6 : 出料检测 +// BIT7 : 启动信号 +// BIT8 : 暂停信号 +#define DSS6_ADDR_02C2 0x02C2 +// BIT1 :裁切夹爪开位 +// BIT2 :裁切超声波气缸上位 +// BIT3 :裁切前夹料气缸上位 +// BIT4 :裁切后夹料上气缸上位 +// BIT5 :气压保护 +// BIT6 :裁切后夹料下气缸下位 +// BIT7 :裁切顶出气缸收回位 +// BIT8 : 裁切切刀气缸上位 + +#define DSS6_ADDR_02C3 0x02C3 +// BIT1 : 摆动轴上限位 +// BIT2 : 摆动轴下限位 +// BIT3 : 左机头物料检测1 +// BIT4 : 左机头物料检测2 +// BIT5 : 右机头物料检测1 +// BIT6 : 右机头物料检测2 +// BIT7 : +// BIT8 : + +void DoubleSidedBedSheets::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 0, tr("Material loading inspection")));//上料物料检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 1, tr("Left head spindle zero position")));//左机头主轴零位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 2, tr("Right machine head spindle zero position")));//右机头主轴零位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 3, tr("Left head wire breakage detection")));//左机头断线检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 4, tr("Right machine head disconnection detection")));//右机头断线检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 5, tr("Lower limit of material storage")));//储料下限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 6, tr("Storage center position")));//储料中位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C0, 7, tr("Cutting positive limit")));//裁切正限位 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 0, tr("Cutting negative limit")));// BIT1 : 裁切负限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 1, tr("Cutting zero limit")));// BIT2:裁切零限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 2, tr("Pull material positive limit")));// BIT3:拉料正限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 3, tr("Pull material negative limit")));// BIT4 : 拉料负限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 4, tr("Zero limit for material pulling")));// BIT5 : 拉料零限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 5, tr("Discharge inspection")));// BIT6 : 出料检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 6, tr("Start signal")));// BIT7 : 启动信号 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C1, 7, tr("Pause signal")));// BIT8 : 暂停信号 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 0, tr("Cutting gripper open position ")));// BIT1 :裁切夹爪开位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 1, tr("Cutting ultrasonic cylinder upper position ")));// BIT2:裁切超声波气缸上位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 2, tr("Upper position of clamping cylinder before cutting ")));// BIT3:裁切前夹料气缸上位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 3, tr("After cutting, clamp the material onto the upper cylinder ")));// BIT4 :裁切后夹料上气缸上位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 4, tr("Air pressure protection ")));// BIT5 :气压保护 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 5, tr("After cutting, clamp the material and lower the cylinder ")));// BIT6 :裁切后夹料下气缸下位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 6, tr("Cutting and ejecting cylinder retraction position ")));// BIT7 :裁切顶出气缸收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C2, 7, tr("Cutting blade cylinder upper position ")));// BIT8 :裁切切刀气缸上位 + + //#define DSS6_ADDR_02C3 0x02C3 + // BIT1 : 摆动轴上限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 0, tr("Upper limit of swing axis")));// BIT8 :摆动轴上限位 + // BIT2 : 摆动轴下限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 1, tr("Lower limit of swing axis")));// BIT8 :摆动轴下限位 + // BIT3 : 左机头物料检测1 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 2, tr("Left head material detection")+ " 1"));// BIT8 :左机头物料检测1 + // BIT4 : 左机头物料检测2 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 3, tr("Left head material detection")+ " 2"));// BIT8 :左机头物料检测2 + // BIT5 : 右机头物料检测1 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 4, tr("Right machine head material detection")+ " 1"));// BIT8 :右机头物料检测1 + // BIT6 : 右机头物料检测2 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C3, 5, tr("Right machine head material detection")+ " 2"));// BIT8 :右机头物料检测2 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERR_BEDSEET_ERR13 0x00010233 // 上料架缺料 + +void DoubleSidedBedSheets::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERR13,tr("Feeding rack material shortage")));// 上料架缺料 +} diff --git a/mctype/patternsingleboard/function/doublesidedbedsheets.h b/mctype/patternsingleboard/function/doublesidedbedsheets.h new file mode 100644 index 0000000..06778db --- /dev/null +++ b/mctype/patternsingleboard/function/doublesidedbedsheets.h @@ -0,0 +1,29 @@ +#ifndef DOUBLESIDEDBEDSHEETS_H +#define DOUBLESIDEDBEDSHEETS_H + +#include "mctype/machinetypefun.h" + +//床单机双边缝 +class DoubleSidedBedSheets : public MachineTypeFun +{ + Q_OBJECT +public: + DoubleSidedBedSheets(); + +private: + void initFileInfoLabel() override; + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // DOUBLESIDEDBEDSHEETS_H diff --git a/mctype/patternsingleboard/function/fiveheadprecisionsewing.cpp b/mctype/patternsingleboard/function/fiveheadprecisionsewing.cpp new file mode 100644 index 0000000..6346b58 --- /dev/null +++ b/mctype/patternsingleboard/function/fiveheadprecisionsewing.cpp @@ -0,0 +1,1081 @@ +#include "fiveheadprecisionsewing.h" + +//-------------------------------------------------------------------------------- +// 通讯命令定义 + +//-------------------------------------------------- +// 归零和手动移动和电机使能的 控制参数 定义 + +// A板 +#define MT_HX 0x0003 // 机头移动电机 (归零) + +#define MT_LM1 0x0010 // 主轴1电机 (归零,正转,反转) +#define MT_LN1 0x0011 // 针1电机 (归零,正转,反转) +#define MT_LH1 0x0012 // 梭1电机 (归零,正转,反转) + +#define MT_LM21 0x0020 // 主轴2电机 (归零,正转,反转) +#define MT_LN2 0x0021 // 针2电机 (归零,正转,反转) +#define MT_LH2 0x0022 // 梭2电机 (归零,正转,反转) + +#define MT_LM3 0x0030 // 主轴3电机 (归零,正转,反转) +#define MT_LN3 0x0031 // 针3电机 (归零,正转,反转) +#define MT_LH3 0x0032 // 梭3电机 (归零,正转,反转) + +#define MT_LM4 0x0040 // 主轴4电机 (归零,正转,反转) +#define MT_LN4 0x0041 // 针4电机 (归零,正转,反转) +#define MT_LH4 0x0042 // 梭4电机 (归零,正转,反转) + +#define MT_LM5 0x0050 // 主轴5电机 (归零,正转,反转) +#define MT_LN5 0x0051 // 针5电机 (归零,正转,反转) +#define MT_LH5 0x0052 // 梭5电机 (归零,正转,反转) + +//-------------------------------------------------- + +// 输出控制的 控制参数1 定义 + +#define OT_LOOSE_THREAD1 0x0001 // 机头1 松紧线 (放松,夹紧) +#define OT_LOOSE_THREAD2 0x0002 // 机头2 松紧线 +#define OT_LOOSE_THREAD3 0x0003 // 机头3 松紧线 +#define OT_LOOSE_THREAD4 0x0004 // 机头4 松紧线 +#define OT_LOOSE_THREAD5 0x0005 // 机头5 松紧线 + +#define OT_BLOW1 0x0021 // 机头1 吹气 (打开,关闭) +#define OT_BLOW2 0x0022 // 机头2 吹气 +#define OT_BLOW3 0x0023 // 机头3 吹气 +#define OT_BLOW4 0x0024 // 机头4 吹气 +#define OT_BLOW5 0x0025 // 机头5 吹气 + +#define OT_DCUT_THREAD1 0x0031 // 机头1 剪线 (打开,关闭) +#define OT_DCUT_THREAD2 0x0032 // 机头2 剪线 +#define OT_DCUT_THREAD3 0x0033 // 机头3 剪线 +#define OT_DCUT_THREAD4 0x0034 // 机头4 剪线 +#define OT_DCUT_THREAD5 0x0035 // 机头5 剪线 + +#define OT_ADD_NOIL1 0x0041 // 机头1 针加油 (打开,关闭) +#define OT_ADD_NOIL2 0x0042 // 机头2 针加油 +#define OT_ADD_NOIL3 0x0043 // 机头3 针加油 +#define OT_ADD_NOIL4 0x0044 // 机头4 针加油 +#define OT_ADD_NOIL5 0x0045 // 机头5 针加油 + +#define OT_ADD_HOIL1 0x0051 // 机头1 梭加油 (打开,关闭) +#define OT_ADD_HOIL2 0x0052 // 机头2 梭加油 +#define OT_ADD_HOIL3 0x0053 // 机头3 梭加油 +#define OT_ADD_HOIL4 0x0054 // 机头4 梭加油 +#define OT_ADD_HOIL5 0x0055 // 机头5 梭加油 + +#define OT_LIFT_UP1 0x0061 // 机头1 升降 (上升,下降) +#define OT_LIFT_UP2 0x0062 // 机头2 升降 +#define OT_LIFT_UP3 0x0063 // 机头3 升降 +#define OT_LIFT_UP4 0x0064 // 机头4 升降 +#define OT_LIFT_UP5 0x0065 // 机头5 升降 + +#define OT_LOCK_FRM_CTRL 0x0070 // 锁框气缸 (打开,关闭) +#define OT_FLAP_UP 0x0071 // 翻板控制 (上升,下降) +#define OT_SCAN_CODE 0x0073 // 条码测试 (打开) + +#define OT_CLIP1 0x0081 // 机头1 夹线 (打开,关闭) +#define OT_CLIP2 0x0082 // 机头2 夹线 +#define OT_CLIP3 0x0083 // 机头3 夹线 +#define OT_CLIP4 0x0084 // 机头4 夹线 +#define OT_CLIP5 0x0085 // 机头5 夹线 + +#define ERR_HEAD_NOT_HIGH 0x0055 // 机头不在高位 +#define ERR_X_LIT_POSI 0x0023 // X正向限位 +#define ERR_X_LIT_NEGA 0x0024 // X反向限位 +#define ERR_Y_LIT_POSI 0x0025 // Y正向限位 +#define ERR_Y_LIT_NEGA 0x0026 // Y反向限位 +#define ERR_COOR_SYSTM 0x0021 // 坐标系统错误 +#define ERR_OUT_RANGE 0x0022 // 目标位置越界 +#define ERR_NOT_SAFE 0x0003 // 安全区域介入 +#define ERR_AIR_POWER 0x002E // 气压不足 +#define ERR_GUARDRAIL_OPEN 0x0039 // 安全门未关闭 +#define ERR_UPER_TBREAK 0x0058 // 面线断线 +#define ERR_CHANGE_BOBBIN 0x00F0 // 更换梭芯 +#define ERR_MS_NOT_ZERO 0x0050 // 主轴不在零位 +#define ERR_HK_NOT_ZERO 0x0051 // 旋梭不在零位 +#define ERR_NO_DATA 0x0040 // 无数据 +#define ERR_MC_PARA 0x0016 // 机器参数错误 +#define ERR_MV_PARA 0x0015 // 运动参数错误 +#define ERR_HEAD_NOT_SAFE 0x0060 // 机头不在安全区域 +#define ERR_NOT_ALLOWED 0x0007 // 不允许工作状态 +#define ERR_LIFT_TIMEOUT 0x005F // 机头升降超时 +#define ERR_NOT_AT_POS 0x005E // 模版不到位 +#define ERR_EXPIRATION 0x0004 // 使用时限已到 +#define ERR_IN_PARA 0x0017 // 输入参数错误 + +#define ERR_HD1_CUTTER_NOT_POS 0x0071 // 机头1剪刀不在回位 +#define ERR_HD2_CUTTER_NOT_POS 0x0072 // 机头2剪刀不在回位 +#define ERR_HD3_CUTTER_NOT_POS 0x0073 // 机头3剪刀不在回位 +#define ERR_HD4_CUTTER_NOT_POS 0x0074 // 机头4剪刀不在回位 +#define ERR_HD5_CUTTER_NOT_POS 0x0075 // 机头5剪刀不在回位 + +FiveHeadPrecisionSewing::FiveHeadPrecisionSewing() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +FiveHeadPrecisionSewing::~FiveHeadPrecisionSewing() +{ + +} + +void FiveHeadPrecisionSewing::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTING,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_FORWARDORBACK,"buttonForwardOrBack")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void FiveHeadPrecisionSewing::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +//花样参数 +void FiveHeadPrecisionSewing::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + + //花样参数-花样设置参数-起始点x;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_STARTX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start") + ("X"),//起始点X + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0003, operate)); + + //花样参数-花样设置参数-起始点y;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_STARTY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start") + ("Y"),//起始点Y + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0004, operate)); + + +#if 0 + + //花样参数-花样设置参数-定位点x;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_ANCHORX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Anchor") + ("X"),//定位点X + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0001, operate)); + + //花样参数-花样设置参数-定位点y;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_ANCHORY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Anchor") + ("Y"),//定位点Y + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0002, operate)); + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, 0, 10000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0010, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, 0, 10000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0011, operate)); + +#endif + +} + +//机器参数 +void FiveHeadPrecisionSewing::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + //x可移动区域正边界(X+), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//x可移动区域正边界(X+) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0028, operate)); + + // y可移动区域正边界(Y+), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//y可移动区域正边界(Y+) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0029, operate)); + + // x可缝纫区域负边界(X-), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界(X-) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0030, operate)); + + // x可缝纫区域正边界(X+), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area positive boundary"),//x可缝纫区域正边界(X+) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0031, operate)); + + // y可缝纫区域负边界(Y-), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界(Y-) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0032, operate)); + + + // y可缝纫区域正边界(Y+), 范围 -10000.00--10000.00,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area positive boundary"),// y可缝纫区域正边界(Y+) + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0033, operate)); + + // 机头2零位坐标,范围 0--4000.0,单位0.1mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero position coordinate") + (" 2"),// 机头2零位坐标 + 0, 0, 40000, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0023, operate)); + + // 机头3零位坐标,范围 0--4000.0,单位0.1mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero position coordinate") + (" 3"),// 机头3零位坐标 + 0, 0, 40000, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0024, operate)); + + // 机头4零位坐标,范围 0--4000.0,单位0.1mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero position coordinate") + (" 4"),// 机头4零位坐标 + 0, 0, 40000, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0025, operate)); + + // 机头5零位坐标,范围 0--4000.0,单位0.1mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero position coordinate") + (" 5"),// 机头5零位坐标 + 0, 0, 40000, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0026, operate)); + +} + +//工作参数 +void FiveHeadPrecisionSewing::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + // 主轴缝纫工作转速, 范围 1--500,单位r/min,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("sewing work speed"),// 主轴缝纫工作转速 + 300, 1, 500, 300, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),// 主轴剪线转速 + 120, 1, 500, 120, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing motion frame method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Xy continuous moving box:0;Xy intermittent moving frame:1"), 0, 0, 0x0007, operate));// bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0008, operate)); + + // 剪线允许; 0, 不剪线; 1, 剪线 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_SW, + tr("Thread cutting allowed"),// 剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0003, operate));// 0, 不剪线; 1, 剪线 + + // 剪线时动作允许, 位图选择, + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for loose thread during thread cutting"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // bit2, 夹线允许; 0, 不允许; 1, 允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allowing for wire clamping during wire cutting"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // bit7, 退针允许;0:允许 1:不允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Allow needle withdrawal during thread cutting"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数, 默认3 断线检测0~10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("No. of stitch detect if thread broken"),// 断线检测针数 + 3, 0, 10, 3, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0002, operate)); + + // 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Bobbin change reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), + //0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + tr("Not enabled:0;Delay reminder by length:1;Count by number of slices:2;Immediately reminder by length:3"), 0, 0, 0x0012, operate)); + + // 底线长度, 单位 0.01mm,默认 10000000 底线长度1~100000.00 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin thread length"),// 底线长度 + 10000000, 1, 10000000, 10000000, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0013, operate)); + + // 换梭片数计数, 单位 次,默认 0 片数1~1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Count of shuttle change pieces"),// 换梭片数计数 + 0, 1, 1000, 0, 0, tr("Times"), tr(""), + tr(""), + 0, 0, 0x0014, operate)); + + // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 1, 3, 0, 0, tr(""), tr(""), + // 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油, + tr("not refueling:0;According to worktime:1;According to the stitches number:2;Continuously refueling:3"),0, 0, 0x0016, operate)); + + // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 加油间隔0~10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Interval between refueling stitches"),// 加油针数间隔 + 10000, 0, 10000, 10000, 0, tr(""), tr(""), + tr(""),0, 0, 0x0017, operate)); + + // 加油持续时长, 单位秒, 加油时长0~60秒 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling duration"),// 加油持续时长 + 0, 0, 60, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, 0x0018, operate)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 15, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting and parting angle"),// 剪线分线角度 + 20000, 0, 36000, 20000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0018, operate)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 6000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0018, operate)); + // 面线夹线针数,0--5,单位 针,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of stitches for surface thread clamping"),// 面线夹线针数 + 0, 0, 5, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0019, operate)); + + /////////////////////////////////////////////////////////////////////////////////////// + + // 产量预设 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0004, operate)); + + // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Automatically thread back points during sewing"),// 缝纫时自动回穿线点 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + + // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for loose lines when moving boxes"),//移框时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x011, operate)); + + // 软件限位; 位图选择, 0, 不允许; 1, 允许; + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_SW, + tr("Software limit: xy movement"),// 软件限位:xy移动 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0027, operate)); + + // 缝纫降速: 0 不降速 1 降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_SW, + tr("Automatic sewing speed regulation"),// 缝纫降速 + 0, 0, 2, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0006, operate));// 1降速,2不降速 + + // 循环工作功能,0, 不允许; 1, 允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 1, 0, PARA_VALUE_TYPE_SW, + tr("Circular working function"),// 循环工作功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0005, operate)); + + // 梭加油持续时长, 单位秒, (针梭独立加油时有效) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Duration of shuttle refueling"),// 梭加油持续时长 + 0, 0, 60, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, 0x0019, operate)); + + // 缝纫吹气时间,范围0-10,单位s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing and blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, 0x0015, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of sewing frame"),// 缝纫动框起始角度 + 28000, 0, 36000, 28000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0021, operate)); + + // 缝纫勾线角度, 0--36000, 单位 0.01度,默认 20200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing hook angle"),// 缝纫勾线角度 + 20200, 0, 36000, 20200, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0021, operate)); + + // 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Continuous angle of sewing frame"),// 缝纫动框持续角度 + 15000, 0, 36000, 15000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0021, operate)); + + // // 穿线点坐标X 0--400000 单位0.01mm 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Coordinate of threading point")+ " " + ("X"),// 穿线点坐标X + 0, 0, 400000, 0, 2, tr("mm"), tr(""), //毫米 + tr(""),0, 0, 0x0021, operate)); + + // 穿线点坐标Y 0--400000 单位0.01mm 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Coordinate of threading point")+" "+("") + ("Y"),// 穿线点坐标Y + 0, 0, 400000, 0, 2, tr("mm"), tr(""), //毫米 + tr(""),0, 0, 0x0021, operate)); + + // 主轴启动停止转速, 范围 1--500,单位r/min,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"),// 主轴启动停止转速 + 500, 1, 500, 500, 0, tr("r/min"), tr(""), + tr(""),0, 0, 0x0021, operate)); + + // 主轴运转加速度, 范围 1--500,单位r/ss,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle running acceleration"),// 主轴运转加速度 + 500, 1, 500, 500, 0, tr("r/ss"), tr(""), + tr(""),0, 0, 0x0021, operate)); + + // 主轴刹车加速度, 范围 1--500,单位r/ss,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle brake acceleration "),// 主轴刹车加速度 + 500, 1, 500, 500, 0, tr("r/ss"), tr(""), + tr(""),0, 0, 0x0021, operate)); + +} + +//电机和控制动作 +void FiveHeadPrecisionSewing::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 1; + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Zero All"),MT_HX,// 全部归零 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,ALLTO_ZERO,-1,-1)); + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Move motor")+ "X",MT_LX));// X向移动电机(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Move motor")+ "Y",MT_LY));// Y向移动电机(归零,正转,反转) + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Head moving motor"),MT_HX,// 机头移动电机(归零) + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All spindle zero positions"),MT_ALLZ)); // 所有主轴 零位 (归零) + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All Spindle Hook Lines positions"),MT_ALLG)); // 所有主轴 勾线 (归零) + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All spindle jogs positions"),MT_ALLM)); // 所有主轴 点动 (归零) + + //同样的按钮组封装为一个方法 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "1",MT_LM1));// 主轴1电机 (归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pin motor") + "1",MT_LN1));// 针1电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor") + "1",MT_LH1));// 梭1电机 + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "2",MT_LM21));// 主轴2电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pin motor") + "2",MT_LN2));// 针2电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor") + "2",MT_LH2));// 梭2电机 + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "3",MT_LM3));// 主轴3电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pin motor") + "3",MT_LN3));// 针3电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor") + "3",MT_LH3));// 梭3电机 + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "4",MT_LM4));// 主轴4电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pin motor") + "4",MT_LN4));// 针4电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "4",MT_LH4));// 梭4电机 + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "5",MT_LM5));// 主轴5电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Pin motor") + "5",MT_LN5));// 针5电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor") + "5",MT_LH5));// 梭5电机 + + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread Head") + "1",OT_LOOSE_THREAD1));//机头1 松紧线 (放松,夹紧) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread Head") + "2",OT_LOOSE_THREAD2));//机头2 松紧线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread Head") + "3",OT_LOOSE_THREAD3));//机头3 松紧线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread Head") + "4",OT_LOOSE_THREAD4));//机头4 松紧线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread Head") + "5",OT_LOOSE_THREAD5));//机头5 松紧线 + + m_allOutCtrlList.append(creatEnableItem(0,showPriority++,tr("ThreadCuttingAction Head") + "1", ThreadCuttingAction1,strTrim)); // 机头1 剪线动作 + m_allOutCtrlList.append(creatEnableItem(0,showPriority++,tr("ThreadCuttingAction Head") + "2", ThreadCuttingAction2,strTrim)); // 机头2 剪线动作 + m_allOutCtrlList.append(creatEnableItem(0,showPriority++,tr("ThreadCuttingAction Head") + "3", ThreadCuttingAction3,strTrim)); // 机头3 剪线动作 + m_allOutCtrlList.append(creatEnableItem(0,showPriority++,tr("ThreadCuttingAction Head") + "4", ThreadCuttingAction4,strTrim)); // 机头4 剪线动作 + m_allOutCtrlList.append(creatEnableItem(0,showPriority++,tr("ThreadCuttingAction Head") + "5", ThreadCuttingAction5,strTrim)); // 机头5 剪线动作 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Blow") + "1", OT_BLOW1)); // 机头1 吹气 (打开,关闭) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Blow") + "2", OT_BLOW2)); // 机头2 吹气 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Blow") + "3", OT_BLOW3)); // 机头3 吹气 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Blow") + "4", OT_BLOW4)); // 机头4 吹气 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Blow") + "5", OT_BLOW5)); // 机头5 吹气 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Trim") + "1", OT_DCUT_THREAD1)); //机头1 剪线 (打开,关闭) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Trim") + "2", OT_DCUT_THREAD2)); //机头2 剪线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Trim") + "3", OT_DCUT_THREAD3)); //机头3 剪线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Trim") + "4", OT_DCUT_THREAD4)); //机头4 剪线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Trim") + "5", OT_DCUT_THREAD5)); //机头5 剪线 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Needle refueling") + "1", OT_ADD_NOIL1)); //机头1 针加油 (打开,关闭) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Needle refueling") + "2", OT_ADD_NOIL2)); //机头2 针加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Needle refueling") + "3", OT_ADD_NOIL3)); //机头3 针加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Needle refueling") + "4", OT_ADD_NOIL4)); //机头4 针加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Needle refueling") + "5", OT_ADD_NOIL5)); //机头5 针加油 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Shuttle refueling") + "1", OT_ADD_HOIL1)); // 机头1 梭加油 (打开,关闭) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Shuttle refueling") + "2", OT_ADD_HOIL2)); // 机头2 梭加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Shuttle refueling") + "3", OT_ADD_HOIL3)); // 机头3 梭加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Shuttle refueling") + "4", OT_ADD_HOIL4)); // 机头4 梭加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Shuttle refueling") + "5", OT_ADD_HOIL5)); // 机头5 梭加油 + + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Lifting") + "1", OT_LIFT_UP1)); // 机头1 升降 (上升,下降) + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Lifting") + "2", OT_LIFT_UP2)); // 机头2 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Lifting") + "3", OT_LIFT_UP3)); // 机头3 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Lifting") + "4", OT_LIFT_UP4)); // 机头4 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Lifting") + "5", OT_LIFT_UP5)); // 机头5 升降 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Lock frame cylinder"), OT_LOCK_FRM_CTRL)); // 锁框气缸 (打开,关闭) + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Flap control"), OT_FLAP_UP)); // 翻板控制 (上升,下降) + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Barcode testing"),OT_SCAN_CODE, // 条码测试 (打开) + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1)); + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Clamp wire") + "1", OT_CLIP1)); // 机头1 夹线 (打开,关闭) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Clamp wire") + "2", OT_CLIP2)); // 机头2 夹线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Clamp wire") + "3", OT_CLIP3)); // 机头3 夹线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Clamp wire") + "4", OT_CLIP4)); // 机头4 夹线 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Clamp wire") + "5", OT_CLIP5)); // 机头5 夹线 +} + + +//快捷功能 +void FiveHeadPrecisionSewing::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1;; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("All Zero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllSple Zero"),"buttonAllToZero",FUN_MT_ALLZ));//所有主轴零位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllSple Hook"),"buttonFlatEmbHook",FUN_MT_ALLG));//所有主轴勾线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllSple Jogs"),"buttonSpindleRotate",FUN_MT_ALLM));//所有主轴点动 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup Canl"),"MakeupCancel",FUN_MAKEUP_NOHEAD));// 取消补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup") + "1","Makeup1",FUN_MAKEUP_HEAD1));// 机头1补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup") + "2","Makeup2",FUN_MAKEUP_HEAD2));// 机头2补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup") + "3","Makeup3",FUN_MAKEUP_HEAD3));// 机头3补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup") + "4","Makeup4",FUN_MAKEUP_HEAD4));// 机头4补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Makeup") + "5","Makeup5",FUN_MAKEUP_HEAD5));// 机头5补缝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThCutAct") + "1","ThCutAct1",ASSIST_ThCutAct1));//机头1 剪线动作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThCutAct") + "2","ThCutAct2",ASSIST_ThCutAct2));//机头2 剪线动作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThCutAct") + "3","ThCutAct3",ASSIST_ThCutAct3));//机头3 剪线动作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThCutAct") + "4","ThCutAct4",ASSIST_ThCutAct4));//机头4 剪线动作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThCutAct") + "5","ThCutAct5",ASSIST_ThCutAct5));//机头5 剪线动作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetStart Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetAnchorPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulate"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));//模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Head Lifting"),"buttonHeadLifting",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back FeedtPoint"),"buttonEmbParas",FUN_GOTO_FEEDT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back StartPoint"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起针点 + +} + +//辅助功能 +void FiveHeadPrecisionSewing::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("Setting"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorize"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +// m_allAssistList.append(makeAAssistItem(0,0x001A,tr("ScanTest"),"ScanTest",ASSIST_ScanTest));//扫码测试 +} + +//花样设置 +void FiveHeadPrecisionSewing::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + + +//参数分类(参数分组功能) +void FiveHeadPrecisionSewing::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonSpeedParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonActionParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + + +//初始化传感器列表 +void FiveHeadPrecisionSewing::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0002, 0, tr("Jog button 1")));//点动按钮1 + m_tempSensorList.append(makeASensorItem(0x0003, 0, tr("Open frame button 1")));//开框按钮1 + m_tempSensorList.append(makeASensorItem(0x0004, 0, tr("Manual operation button 1")));//手动按钮1 + m_tempSensorList.append(makeASensorItem(0x0005, 0, tr("Be ready button 1")));//就绪按钮1 + m_tempSensorList.append(makeASensorItem(0x0006, 0, tr("Key button 1")));//钥匙按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0009, 0, tr("Template in position 1")));//模板到位1 + m_tempSensorList.append(makeASensorItem(0x0009, 1, tr("Template in position 2")));//模板到位2 + m_tempSensorList.append(makeASensorItem(0x000A, 0, tr("MOTOR_ALM") + "1"));//电机报警1 + m_tempSensorList.append(makeASensorItem(0x000B, 0, tr("MOTOR_ALM") + "9"));//电机报警9 + m_tempSensorList.append(makeASensorItem(0x000C, 0, tr("MOTOR_ALM") + "17"));//电机报警17 + m_tempSensorList.append(makeASensorItem(0x000D, 0, tr("MOTOR_ALM") + "25"));//电机报警25 + m_tempSensorList.append(makeASensorItem(0x000E, 0, tr("MOTOR_ALM") + "35"));//电机报警33 + m_tempSensorList.append(makeASensorItem(0x000F, 0, tr("MOTOR_ALM") + "41"));//电机报警41 + + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X "+ strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, "Y "+ strZeroPosition));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 0, "X "+ strDeceleration));//X降速 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y "+ strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0022, 0, "X "+ tr("negative limit")));//X负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 1, "Y "+ tr("negative limit")));//Y负限位 + + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0040, i, tr("Lifting upper limit ") + QString::number(i+1)));//机头高位 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0042, i, tr("Lifting lower limit ") + QString::number(i+1)));//机头低位 + + + QString moveZeroUp = tr("Move Zero Up "); //上移零位 + QString moveZeroDown = tr("Move Zero Down "); //下移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 2, moveZeroUp + QString::number(2)));//机头2上移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 4, moveZeroUp + QString::number(3)));//机头3上移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 6, moveZeroUp + QString::number(4)));//机头4上移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 3, moveZeroDown + QString::number(2)));//机头2下移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 5, moveZeroDown + QString::number(3)));//机头3下移零位 + m_tempSensorList.append(makeASensorItem(0x0060, 7, moveZeroDown + QString::number(4)));//机头4下移零位 + + QString upSlowDown = tr("Up slow down "); //上移降速 + QString DownSlowDown = tr("Down slow down "); //下移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 2, upSlowDown + QString::number(2)));//机头2上移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 4, upSlowDown + QString::number(3)));//机头3上移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 6, upSlowDown + QString::number(4)));//机头4上移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 3, DownSlowDown +QString::number(2)));//机头2下移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 5, DownSlowDown +QString::number(3)));//机头3下移降速 + m_tempSensorList.append(makeASensorItem(0x0061, 7, DownSlowDown +QString::number(4)));//机头4下移降速 + + QString upshiftLimit = tr("Upshift limit "); //上移限位 + QString lowerLimit = tr("Lower limit "); //下移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 0, upshiftLimit + QString::number(1) ));//机头1上移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 2, upshiftLimit + QString::number(2) ));//机头2上移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 4, upshiftLimit + QString::number(3) ));//机头3上移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 6, upshiftLimit + QString::number(4) ));//机头4上移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 1, lowerLimit + QString::number(1)));//机头1下移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 3, lowerLimit + QString::number(2)));//机头2下移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 5, lowerLimit + QString::number(3)));//机头3下移限位 + m_tempSensorList.append(makeASensorItem(0x0063, 7, lowerLimit + QString::number(4)));//机头4下移限位 + + m_tempSensorList.append(makeASensorItem(0x0064, 0, moveZeroUp + QString::number(5)));//机头5上移零位 + m_tempSensorList.append(makeASensorItem(0x0064, 1, moveZeroDown + QString::number(5)));//机头5下移零位 + + m_tempSensorList.append(makeASensorItem(0x0065, 0, upSlowDown + QString::number(6)));//机头6上移降速 + m_tempSensorList.append(makeASensorItem(0x0065, 1, DownSlowDown + QString::number(6)));//机头6下移降速 + + m_tempSensorList.append(makeASensorItem(0x0067, 0, upshiftLimit + QString::number(5)));//机头5上移限位 + m_tempSensorList.append(makeASensorItem(0x0067, 1, lowerLimit + QString::number(5)));//机头5下移限位 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0080, i, tr("Needle zero position ") + QString::number(i+1)));//针零位 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0088, i, tr("Shuttle zero position ") + QString::number(i+1)));//梭零位 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0170, i, tr("Thread breakage inspection ") + QString::number(i+1)));//面线断检 + + for(int i = 0; i < 5; i++) + m_tempSensorList.append(makeASensorItem(0x0174, i, tr("Thread trimming return ") + QString::number(i+1)));//剪刀回位 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define STA_BREAK1_ROLL 0x0259 // 机头1断线 +#define STA_BREAK2_ROLL 0x025A // 机头2断线 +#define STA_BREAK3_ROLL 0x025B // 机头3断线 +#define STA_BREAK4_ROLL 0x025C // 机头4断线 +#define STA_BREAK5_ROLL 0x025D // 机头5断线 + +//初始化错误代码和状态列表 //五头未更改 +void FiveHeadPrecisionSewing::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + QString threadBreak = tr("Head wire breakage,Head:");//机头断线,机头: + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_BREAK1_ROLL,threadBreak + QString::number(1))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_BREAK2_ROLL,threadBreak + QString::number(2))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_BREAK3_ROLL,threadBreak + QString::number(3))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_BREAK4_ROLL,threadBreak + QString::number(4))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(STA_BREAK5_ROLL,threadBreak + QString::number(5))); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NONE,tr("freedom from error"))); // 没有错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_POWER,tr("Not powered on"))); // 没有上电 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_AIR,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FILL_DATA,tr("Filling data error"))); // 填充数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CTRL_ERR,tr("control error"))); // 控制错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_ERR,tr("Motion control chip version error"))); // 运动控制芯片版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BUTTON_NOUP,tr("Waiting for button to lift timeout"))); // 等待按钮抬起超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_RESET,tr("FPGA reset error"))); // FPGA复位错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_READY,tr("Peripheral not ready"))); // 外设未就绪 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_SEND_ERR,tr("Transmission data error"))); // 传输数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDTION_ERR,tr("Program version error"))); // 程序版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_WORK_DONE,tr("Production completed"))); // 完成产量 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_POSITIVE,strForwardLimit)); // 正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_NEGATIVE,strReverseLimit)); // 反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_ALM,tr("Motion alarm"))); // 运动报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_LIMIT,tr("Motion limit"))); // 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_EMS,tr("Exercise emergency stop"))); // 运动急停 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NORMAL,tr("The file is correct"))); // 文件正确 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_WAIT,tr("Waiting for files"))); // 等待文件 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_RIGHT,tr("Zero successfully"))); // 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_ERROR,tr("Zero error"))); // 归零错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DATA_ERROR,tr("data error"))); // 数据错误 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_SYNC,tr("Needle shuttle out of sync"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RO_NOT_SYNC,tr("Rotation out of sync"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NOT_POS,tr("The scissors are not returning to their original position"))); // 剪刀不在回位(注:该报错码是缝纫剪刀) + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_LOW,tr("Machine head not in low position"))); // 机头不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Light curtain intervention"))); // 光幕介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("Bottom line disconnection"))); // 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_INSTALLMENT_OK,tr("Password set successfully"))); // 密码设置成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_INSTALLMENT_FAIL,tr("Password setting failed"))); // 密码设置失败 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_N_ALM,tr("Needle ") + strMotorAlarm)); // 针电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_H_ALM,tr("Shuttle") + strMotorAlarm)); // 梭电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_ALM,"X " + strMotorAlarm)); // X电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_Y_ALM,"Y " + strMotorAlarm)); // Y电机报警 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_N_FZ,tr("Needle ") + strMotorResetFailed)); // 针电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_H_FZ,tr("Shuttle ") + strMotorResetFailed)); // 梭电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_FZ,"X " + strMotorResetFailed)); // X电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_Y_FZ,"Y " + strMotorResetFailed)); // Y电机归零失败 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CS_TIMEOUT,tr("Slave board communication timeout"))); // 从板通讯超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_ZERO,tr("X motor not in zero position"))); // X电机不在零位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_GUARDRAIL_OPEN,tr("The safety door is not closed"))); // 安全门未关闭 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area"))); // 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_POS,tr("Template not in place"))); // 模版不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + QString str = tr("The scissors are not returning to their original position");//剪刀不在回位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, str + QString::number(1))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD2_CUTTER_NOT_POS, str + QString::number(2))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD3_CUTTER_NOT_POS, str + QString::number(3))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD4_CUTTER_NOT_POS, str + QString::number(4))); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD5_CUTTER_NOT_POS, str + QString::number(5))); + + +} diff --git a/mctype/patternsingleboard/function/fiveheadprecisionsewing.h b/mctype/patternsingleboard/function/fiveheadprecisionsewing.h new file mode 100644 index 0000000..761f9a6 --- /dev/null +++ b/mctype/patternsingleboard/function/fiveheadprecisionsewing.h @@ -0,0 +1,36 @@ +#ifndef FIVEHEADPRECISIONSEWING_H +#define FIVEHEADPRECISIONSEWING_H + +#include "mctype/machinetypefun.h" + + +//五头精密缝 +class FiveHeadPrecisionSewing : public MachineTypeFun +{ + Q_OBJECT +public: + FiveHeadPrecisionSewing(); + ~FiveHeadPrecisionSewing(); +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // FIVEHEADPRECISIONSEWING_H diff --git a/mctype/patternsingleboard/function/flyshuttle.cpp b/mctype/patternsingleboard/function/flyshuttle.cpp new file mode 100644 index 0000000..c84f8fd --- /dev/null +++ b/mctype/patternsingleboard/function/flyshuttle.cpp @@ -0,0 +1,680 @@ +#include "flyshuttle.h" + +FlyShuttle::FlyShuttle() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +FlyShuttle::~FlyShuttle() +{ + +} + +void FlyShuttle::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_MT_ALLZ,"buttonAllToZero")); + m_nineBtn.insert(2,NineItem(FUN_FORWARDORBACK,"buttonForwardOrBack")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void FlyShuttle::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 0, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 0, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +// //花样参数-花样设置参数-等比缩放 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_PATTERN, +// PATTERNPARA_SORT_QUI, +// SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, +// tr("Equal ratio"),//等比缩放 +// 1, 0, 1, 1, 0, tr(""), tr(""), +// tr(""), +// 0, 0, index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为正;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the positive X offset"),//罗拉补偿X偏移为正 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为负;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXNEG, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the negative X offset"),//罗拉补偿X偏移为负 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为0;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXZERO, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the X offset of 0"),//罗拉补偿X偏移为0 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +#if(0) + //花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); +#endif + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +} + +void FlyShuttle::initMcParasList() +{ + + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + QTextCodec *cod = QTextCodec::codecForLocale(); + //0 + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认 2000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing working speed"), + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + + //红外装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared curtain device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, 0, 0, index++, root));//连续:0;间歇式:1 + + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + 1, 1, index++, root)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数, 默认3 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index++, operate)); + + + // 换梭芯提醒功能, 0, 不启用该功能; 1 按长度提醒; 默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 2, 0, 0, tr(""), tr(""), + strImmediatelyReminder2, 0, 0, index++, operate)); + + // 底线长度, 单位 0.01mm,默认 10000000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + + //10 +// // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 10, 0, 0, PARA_VALUE_TYPE_LIST, +// tr("Refueling method selection"),// 加油方式选择 +// 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 +// strPersistentrefueling, 0, 0, index++, operate)); + +// // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 11, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Refueling needles interval"),// 加油针数间隔 +// 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), +// tr(""), 0, 0, index++, operate)); + +// // 加油时间间隔, 范围 1--S32_MAX,默认 1 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 31, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Refueling time interval"),// 加油时间间隔 +// 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), +// tr(""), 0, 0, index++, operate)); + +// // 针加油持续时长, 单位秒, // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 12, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Needle refueling duratio "),// 针加油持续时长 +// 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), +// tr(""), 1, 1, index++, operate)); + +// // 梭加油持续时长, 单位秒, (针梭独立加油时有效) // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_SETTING, +// 22, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Shuttle refueling duration"),// 梭加油持续时长 +// 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), +// tr(""), 0, 0, index++, operate)); + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + + // 降速最小偏差角度,单位度,范围0--180,默认 180 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 开机动作; + //BIT0:1:开机自动找零, 0:开机不自动找零 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 19, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + + //20 + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 20, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode, 0, 0, index++, root));//0:自动降速,1参数降速,2不降速 + +// // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; +// // bit0, 松线允许;// 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 3, 1, 0, PARA_VALUE_TYPE_SW, +// tr("Allow for needle starting and thread loosening"),// 起针松线允许 +// 0, 0, 1, 0, 0, tr(""), tr(""), +// tr(""), 0, 0, index++, operate)); + +// // 缝纫时动作允许, 0, 不允许; 1, 允许; +// // bit0 吹气允许; // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_SETTING, +// 14, 1, 0, PARA_VALUE_TYPE_SW, +// tr("Blow air during sewing"),// 缝纫时吹气 +// 0, 0, 1, 0, 0, tr(""), tr(""), +// tr(""),0, 0, index++, operate)); + + //15 +// // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; +// // bit0, 松线允许; // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_ACTION, +// 15, 1, 0, PARA_VALUE_TYPE_SW, +// tr("Moving basket Loose line"),// 移框松线允许 +// 0, 0, 1, 0, 0, tr(""), tr(""), +// tr(""), 0, 0, index++, operate)); + + + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 红外; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + // bit1, 气压; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index++, root)); + // bit2, 上电信号; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, root)); + + // bit4, 安全门 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + // bit5 手自动按钮 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 6, 0, PARA_VALUE_TYPE_LIST, + tr("Manual and automatic safe input"),// 安全输入手自动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, root)); + + +// // 缝纫吹气时间,范围0-10,单位s,默认0(0为持续吹气) // 参数设定 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_SETTING, +// 23, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Sewing air blowing time"),// 缝纫吹气时间 +// 0, 0, 50, 0, 0, tr("s"), tr(""), +// tr(""), 0, 0, index++, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 24, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + +// // 工作机头选择 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_SETTING, +// 30, 1, 0, PARA_VALUE_TYPE_INT, +// tr("Work head selection") + " " + "1",//工作头选择1 +// 1, 0, 1, 1, 0, tr(""), tr(""), +// strAllow, 0, 0, index++, operate)); + +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_WORK, +// MC_SORT_SETTING, +// 30, 2, 0, PARA_VALUE_TYPE_INT, +// tr("Work head selection") + " " + "2",//工作头选择2 +// 1, 0, 1, 1, 0, tr(""), tr(""), +// strAllow, 0, 0, index++, root)); + + + // 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 0, 0, PARA_VALUE_TYPE_INT, + tr("Continuous angle of sewing frame"),// 缝纫动框持续角度 + 15000, 0, 36000, 15000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, index++, root)); +} + +void FlyShuttle::initWkParasList() +{ + +} + +void FlyShuttle::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0000,tr("X to move motor"),MT_LX,// X向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0000,tr("Y to move motor"),MT_LY,// Y向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0000,tr("Spindle motor"),MT_LM,// 主轴电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0000,tr("Discharge motor"),MT_LOT,// 出料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); +} + +void FlyShuttle::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1;; + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("All_Zero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SpindleZero"),"buttonAllToZero",FUN_MT_ALLZ));//主轴电机归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("StartWork"),"buttonStartWork",FUN_STARTWORK));//启动工作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("PauseWork"),"buttonPauseWork",FUN_PAUSEWORK));//暂停 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SwitchStatus"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));//切换工作状态 +} + +void FlyShuttle::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("Setting"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorize"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +} + +void FlyShuttle::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 + //m_allPatternSetList.append(makeAPatternSetItem(0,0x0007,tr("Edit"),"buttonPatternEdit",PATTERNSET_PATTERNEDIT));//花样编辑 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0008,tr("NeedlePre"),"buttonNeedlePreview",PATTERNSET_NEEDLEPREVIEW));//排针预览 + //m_allPatternSetList.append(makeAPatternSetItem(0,0x0009,tr("LineGener"),"buttonLineGener",PATTERNSET_LINEGENER));//线迹生成 +} + +void FlyShuttle::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +void FlyShuttle::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton));//启动按钮 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton));//暂停按钮 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection));//气压检测 + m_tempSensorList.append(makeASensorItem(0x0008, 0, tr("Secure input")));//安全输入 + m_tempSensorList.append(makeASensorItem(0x0022, 0, tr("Limit")+ " X-"));//X限位- + m_tempSensorList.append(makeASensorItem(0x0023, 0, tr("Limit") + " X+"));//X限位+ + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing machine head stop position")));//缝纫机头针停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, tr("Sewing machine head Thread breakage inspection")));//缝纫机头面线断检 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +void FlyShuttle::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_INSTALLMENT_OK,"0x0300" + tr("Password set successfully"))); // 密码设置成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_INSTALLMENT_FAIL,"0x0301" + tr("Password setting failed"))); // 密码设置失败 +} diff --git a/mctype/patternsingleboard/function/flyshuttle.h b/mctype/patternsingleboard/function/flyshuttle.h new file mode 100644 index 0000000..1fab5f7 --- /dev/null +++ b/mctype/patternsingleboard/function/flyshuttle.h @@ -0,0 +1,37 @@ +#ifndef FLYSHUTTLE_H +#define FLYSHUTTLE_H + +#include "mctype/machinetypefun.h" + +/** + * @brief 飞梭机 + */ +class FlyShuttle : public MachineTypeFun +{ + Q_OBJECT +public: + FlyShuttle(); + ~FlyShuttle(); + +public: + void initNinebtn1234(); //九宫格 + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // FLYSHUTTLE_H diff --git a/mctype/patternsingleboard/function/fourheadcombqui.cpp b/mctype/patternsingleboard/function/fourheadcombqui.cpp new file mode 100644 index 0000000..6f2eed5 --- /dev/null +++ b/mctype/patternsingleboard/function/fourheadcombqui.cpp @@ -0,0 +1,1626 @@ +#include "fourheadcombqui.h" + +FourHeadCombQui::FourHeadCombQui() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +FourHeadCombQui::~FourHeadCombQui() +{ + +} + +//初始化九宫格功能按键 +void FourHeadCombQui::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_SET_WORK_HEAD,"buttonWorkHeadSwitch")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void FourHeadCombQui::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(BeginPoint2); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Position2); + m_fileInfo.append(Production); +} + +//花样参数 +void FourHeadCombQui::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围1-最大,默认500mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 50000, 1, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围1-最大,默认500mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 50000, 1, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-去除偏移针步大小设置;单位:mm ,范围0-10,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_OFTNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Remove offset needle step size setting"),//去除偏移针步大小设置 + 200, 200, 1000, 200, 2, tr("mm"), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(0) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#else + +#if(0) + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + +#endif + //花样参数--------------------------- +} + +//机器参数 +void FourHeadCombQui::initMcParasList() +{ + //自动换梭装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, 0x0001, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Light curtain device"),//光幕装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + // //手/自动按钮装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 1, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic button device"),//手自动按钮装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strClosedOpen, + // 0, 0, 0x0002, operate)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, 0x0004, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0006, operate)); + + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, 0x0007, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, 0x0008, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, 0x0009, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), 99300, 99300, 0x0010, operate)); + + + // //进料编码器系数分子, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 8, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient molecule"),//进料编码器系数分子 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x0011, operate)); + + // //进料编码器系数分母, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 205, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient denominator"),//进料编码器系数分母 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x00C3, operate)); + + + + // //零切距离, 范围1--500000 单位0.01mm + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 9, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Zero tangent distance"),//零切距离 + // 0, 1, 500000, 0, 2, tr("mm"), tr(""), + // tr(""), + // 0, 0, 0x0012, operate)); + // //切料箱装置选择, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 1, 0, PARA_VALUE_TYPE_LIST, + // tr("Feeding device"),//进料装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //横切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Crosscutting device"),//横切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //夹布装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Cloth clamping device"),//夹布装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //张紧装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Tensioning device"),//张紧装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //边切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 5, 0, PARA_VALUE_TYPE_LIST, + // tr("Edge cutting device"),//边切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + //X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0014, operate)); + + // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0015, operate)); + + // 工作机头选择,位图选择,共支持5个机头; 0, 不允许工作; 1, 允许工作; bit0 第一个机头, bit1, 第二个机头...... + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 14, 1, 0, PARA_VALUE_TYPE_SW, + tr("Working machine head") + tr("1"),//工作机头1 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0015, operate)); + + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 14, 2, 0, PARA_VALUE_TYPE_SW, + tr("Working machine head") + tr("2"),//工作机头2 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0015, operate)); +} + +//工作参数 +void FourHeadCombQui::initWkParasList() +{ + int index = 0; + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 主轴回针转速, 范围 1--1000,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 1000, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, + 0, 0, index, operate));//连续:0;间歇式:1 + + // // 缝纫加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + // 1, 1, index, operate)); + + // // 缝纫机头旋转方式, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing machine head rotating manner"),// 缝纫机头旋转方式 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("Continuous rotation:0;Xy intermittent rotation:1"),//连续旋转:0;Xy间歇旋转:1 + // 0, 0, index, operate)); + + // // 缝纫机头加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing head deceleration mode"),// 缝纫机头加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // tr("No acceleration or deceleration:0;Intermittent acceleration and deceleration:1"), //无加速或减速:0;间歇加减速:1 + // 1, 1, index, operate));//无加速或减速:0;间歇加减速:1 + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 3, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Needle and thread clamping allowed"),// 起针夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 剪线允许, 范围 0--3,默认 1 + // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, index, operate)); + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // // bit1, 拉线允许; + // // 剪线时拉线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Thread pulling allowed during thread trimming"),// 剪线时拉线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit2, 夹线允许; + // // 剪线时夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Thread clamping allowed during thread trimming"),// 剪线时夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit3, 提升压脚允许; + // // 剪线时提升压脚允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 4, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // bit4, 提升机头剪线; + // 剪线时提升机头剪线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // // bit5, 提升机头夹线;0:允许 1:不允许 + // // 剪线时提升机头夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 6, 0, PARA_VALUE_TYPE_SW, + // tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit6, 在压脚下勾线;0:允许 1:不允许 + // // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 7, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // bit7, 退针允许;0:允许 1:不允许 + // 剪线时退针允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit8, 扣线允许;0:允许 1:不允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 9, 0, PARA_VALUE_TYPE_LIST, + // tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + + // 断线检测针数, 范围 0--10,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index, operate)); + + // u32 BrokenRpairMode; // 断线补缝方式 , 范围 0--1, 1:反复加固模式 2回退模式 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 54, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Broken line patching method"), + 0, 0, 1, 0, 0, tr(""), tr(""), + //反复加固模式:0;回退模式:1 + tr("Repeated reinforcement mode:0;fallback mode:1"), + 0, 0, index, operate)); + + // u32 ReinforPins; // 加固针数 , 范围 1--10 , 单位 针 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 55, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of reinforcement needles"), + 0, 1, 10, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // u32 ReinforNumber; // 加固次数 , 范围 1--5 , 单位次 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 56, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"), + 0, 1, 5, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭芯提醒功能, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, index, operate)); + + // 底线长度, 范围 0--S32_MAX,默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭片数计数, 范围 0--1000,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, index, operate)); + + // 加油方式选择, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, index, operate)); + + // 加油针数间隔, 范围 S32_MIN--S32_MAX,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index, operate)); + + // // 加油时间间隔, 范围 1--S32_MAX,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 12, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Refueling time interval"),// 加油时间间隔 + // 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + // tr(""), 0, 0, index, operate)); + + // 针加油持续时长, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duration"), + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index, operate)); + + // // 完成后停车位置选择, 范围 0--4,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 14, 0, 0, PARA_VALUE_TYPE_LIST, + // tr("Parking position selection after completion"),// 完成后停车位置选择 + // 0, 0, 4, 0, 0, tr(""), tr(""), + // strParkingposition,//当前点:0;起始点:1;定位点:2;上料点:3;偏移点:4 + // 0, 0, index, operate)); + + // 偏移点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 偏移点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 偏移点坐标Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 穿线点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标 Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 产量预设, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线动框位移, 范围 0--1000,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blowing air is allowed during sewing"),// 缝纫时吹气允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫间越框机头升降, 范围 0--max,默认 0 + // bit0, 缝纫间越框机头升降; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 移框时动作选择, 范围 0--1,默认 0 + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // // 移框夹线允许, 范围 0--1,默认 0 + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Moving basket Clamp line"),// 移框夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框自动压框允许, 范围 0--1,默认 0 + // // bit2, 开框允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Frame moving and automatic frame pressing allowed"),// 移框自动压框允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框扣线允许, 范围 0--1,默认 0 + // // bit4. 叩线允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 5, 0, PARA_VALUE_TYPE_SW, + // tr("Allowed to move frame and thread"),// 移框扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 软件限位XY移动允许, 范围 0--1,默认 0 + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, index, operate)); + + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 降速最小偏差角度, 范围 0--180,默认 180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 开机自动找零, 范围 0--1,默认 1 + //BIT0:1:开机自动找零, 0:开机不自动找零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode,0, 0, index, operate));//0:自动降速,1参数降速,2不降速 + + // // 机器动作配置, 范围 0--1 + // // bit0 自动拉料允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 1, 0, PARA_VALUE_TYPE_SW, + // tr("Automatic drawing is allowed"),// 自动拉料允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时对边允许, 范围 0--1 + // // bit1 进料时对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 2, 0, PARA_VALUE_TYPE_SW, + // tr("The opposite side is allowed when feeding"),// 进料时对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时展布允许, 范围 0--1,默认 1 + // // bit2 进料时展布允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Allowing distribution during feeding"),// 进料时展布允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切允许, 范围 0--1,默认 1 + // // bit3 进料时中切允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 4, 0, PARA_VALUE_TYPE_SW, + // tr("Medium cutting is allowed during feeding"),// 进料时中切允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切对边允许, 范围 0--1,默认 1 + // // bit4 进料时中切对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 5, 0, PARA_VALUE_TYPE_SW, + // tr("During feeding, it is allowed to cut across the edge"),// 进料时中切对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 机头升降时松线允许, 范围 0--1,默认 1 + // bit5 机头升降时松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 安全输入光幕允许, 范围 0--1,默认 0 + // bit0, 光幕; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input light curtain allows"),// 安全输入光幕允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 安全输入气压允许, 范围 0--1,默认 1 + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入上电信号允许, 范围 0--1,默认 0 + // // bit2, 上电信号; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 安全输入安全门允许, 范围 0--1,默认 0 + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入手自动允许, 范围 0--1,默认 0 + // // bit5 手自动按钮 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic safe input"),// 安全输入手自动允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 循环工作允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 0, 0, PARA_VALUE_TYPE_SW, + tr("Loop work allowed"),// 循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 梭加油持续时长, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, root)); + + + // 缝纫吹气时间,范围0-10,单位 s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing air blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 针梭勾线角度, 范围 0--36000,单位0.01度,默认 20200; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, index, operate)); + + //u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, root)); + + //u32 xymvlSpd; // xy空走运行速度, 范围 100--2000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 100, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, index, operate)); + //u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); +} + +//电机和控制动作 +void FourHeadCombQui::initOutCtrlList() +{ + QString jogPStr = tr("JogP"); //正转 + QString jogNStr = tr("JogN"); //反转 + QString zeroStr = tr("Zero"); //归零 + QString openStr = tr("Open"); //打开 + QString closeStr= tr("Close");//关闭 + QString FWDStr = tr("FWD");//前进 + QString REVStr = tr("REV");//后退 + QString leftStr = tr("LMove");//左移 + QString rightStr = tr("RMove");//右移 + + m_allOutCtrlList.clear(); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("X-axis Traverse Motor"),MT_LX,//X向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + leftStr,true,-1,OUTCONTROL_LEFTMOVE,OUTCONTROL_STOP, + rightStr,true,-1,OUTCONTROL_RIGHTMOVE,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("X2-axis Traverse Motor"),MT_LX2_FOUR,//X2向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + leftStr,true,-1,OUTCONTROL_LEFTMOVE,OUTCONTROL_STOP, + rightStr,true,-1,OUTCONTROL_RIGHTMOVE,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Y-axis Traverse Motor"),MT_LY_FOUR,//Y向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + FWDStr,true,-1,OUTCONTROL_FORWARD,OUTCONTROL_STOP, + REVStr,true,-1,OUTCONTROL_REVERSE,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Spindle Motor"),MT_LM_FOUR,//主轴电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + jogPStr,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Needle Motor"),MT_LN_FOUR,//针电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + jogPStr,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Hook Motor"),MT_LH_FOUR,//梭电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + zeroStr,true,OUTCONTROL_ZERO,-1,-1, + jogPStr,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + jogNStr,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Thread Tension"),OT_LOOSE_THREAD,//松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Thread Tension 1"),OT_LOOSE_THREAD1,//松紧线1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Thread Tension 2"),OT_LOOSE_THREAD2,//松紧线2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Thread Tension 3"),OT_LOOSE_THREAD3,//松紧线3 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Thread Tension 4"),OT_LOOSE_THREAD4,//松紧线4 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Cut Thread with Lower Knife 1"),OT_DCUT_THREAD1,//下剪刀1剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Cut Thread with Lower Knife 2"),OT_DCUT_THREAD2,//下剪刀2剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Cut Thread with Lower Knife 3"),OT_DCUT_THREAD3,//下剪刀3剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Cut Thread with Lower Knife 4"),OT_DCUT_THREAD4,//下剪刀4剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Lubricate 1"),OT_OIL_FOUR,//加油1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Lubricate 2"),OT_OIL2,//加油2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Lubricate 3"),OT_OIL3,//加油3 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0001,tr("Lubricate 4"),OT_OIL4,//加油4 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + openStr,true,OUTCONTROL_OPEN,-1,-1, + closeStr,true,OUTCONTROL_CLOSE,-1,-1)); +} + +//快捷功能 +void FourHeadCombQui::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackThread"),"buttonSetAnchorPoint",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetOffsetPoint"),"buttonSetAnchorPoint",FUN_SETOFFSETPOINT));// 定偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backOffsetPoint"),"buttonBackOffsetPoint",FUN_BACKOFFSETPOINT));// 回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NeedZeroPos"),"buttonSetStartPoint",FUN_NEDDLEZEROPOS));//对针零位 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ShutZeroPos"),"buttonSetAnchorPoint",FUN_SHUTTLEZEROPOS));//对梭零位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP") + "2","buttonHeadUP",FUN_HEAD_LIFTING2));//机头上升2 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN") + "2","buttonHeadDOWN",FUN_HEAD_LOWERING2));//机头下降2 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("workHeadSet"),"buttonWorkHeadSet",FUN_WORK_HEAD_SET));// 工作机头设置 +} + +//辅助功能 +void FourHeadCombQui::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +//花样设置 +void FourHeadCombQui::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +//参数分类(参数分组功能) +void FourHeadCombQui::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +//初始化传感器列表 +void FourHeadCombQui::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + + m_tempSensorList.append(makeASensorItem(0x0020, 0, tr("X Zero Position")));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y Zero Position")));//Y零位 +// m_tempSensorList.append(makeASensorItem(0x0020, 2, tr("X2 Zero Position")));//X2零位 +// m_tempSensorList.append(makeASensorItem(0x0020, 3, tr("X3 Zero Position")));//X3零位 +// m_tempSensorList.append(makeASensorItem(0x0020, 4, tr("X4 Zero Position")));//X4零位 + + m_tempSensorList.append(makeASensorItem(0x0022, 0, tr("X Negative Limit")));//X负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 1, tr("Y Negative Limit")));//Y负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 2, tr("X2 Negative Limit")));//X2负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 3, tr("X3 Negative Limit")));//X3负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 4, tr("X4 Negative Limit")));//X4负限位 + + m_tempSensorList.append(makeASensorItem(0x0023, 0, tr("X Positive Limit")));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, tr("Y Positive Limit")));//Y正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 2, tr("X2 Positive Limit")));//X2正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 3, tr("X3 Positive Limit")));//X3正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 4, tr("X4 Positive Limit")));//X4正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, tr("Head 1 Upper Position")));//机头1高位 + m_tempSensorList.append(makeASensorItem(0x0040, 1, tr("Head 2 Upper Position")));//机头2高位 + m_tempSensorList.append(makeASensorItem(0x0040, 2, tr("Head 3 Upper Position")));//机头3高位 + m_tempSensorList.append(makeASensorItem(0x0040, 3, tr("Head 4 Upper Position")));//机头4高位 + + m_tempSensorList.append(makeASensorItem(0x0042, 0, tr("Head 1 Lower Position")));//机头1低位 + m_tempSensorList.append(makeASensorItem(0x0042, 1, tr("Head 2 Lower Position")));//机头2低位 + m_tempSensorList.append(makeASensorItem(0x0042, 2, tr("Head 3 Lower Position")));//机头3低位 + m_tempSensorList.append(makeASensorItem(0x0042, 3, tr("Head 4 Lower Position")));//机头4低位 + + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Shuttle Parking Space")+ "1"));//梭停车位1 + m_tempSensorList.append(makeASensorItem(0x0088, 1, tr("Shuttle Parking Space")+ "2"));//梭停车位2 + m_tempSensorList.append(makeASensorItem(0x0088, 2, tr("Shuttle Parking Space")+ "3"));//梭停车位3 + m_tempSensorList.append(makeASensorItem(0x0088, 3, tr("Shuttle Parking Space")+ "4"));//梭停车位4 + + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Spindle 1 Parking Position")));//主轴1停车位 + m_tempSensorList.append(makeASensorItem(0x0080, 1, tr("Spindle 2 Parking Position")));//主轴2停车位 + m_tempSensorList.append(makeASensorItem(0x0080, 2, tr("Spindle 3 Parking Position")));//主轴3停车位 + m_tempSensorList.append(makeASensorItem(0x0080, 3, tr("Spindle 4 Parking Position")));//主轴4停车位 + + m_tempSensorList.append(makeASensorItem(0x0081, 0, tr("Rotary Hook 1 Parking Position")));//旋梭1停车位 + m_tempSensorList.append(makeASensorItem(0x0081, 1, tr("Rotary Hook 2 Parking Position")));//旋梭2停车位 + m_tempSensorList.append(makeASensorItem(0x0081, 2, tr("Rotary Hook 3 Parking Position")));//旋梭3停车位 + m_tempSensorList.append(makeASensorItem(0x0081, 3, tr("Rotary Hook 4 Parking Position")));//旋梭4停车位 + + m_tempSensorList.append(makeASensorItem(0x0170, 0, tr("Top Thread Break Detection for Head 1")));//面线1断线检测 + m_tempSensorList.append(makeASensorItem(0x0170, 1, tr("Top Thread Break Detection for Head 2")));//面线2断线检测 + m_tempSensorList.append(makeASensorItem(0x0170, 2, tr("Top Thread Break Detection for Head 3")));//面线3断线检测 + m_tempSensorList.append(makeASensorItem(0x0170, 3, tr("Top Thread Break Detection for Head 4")));//面线4断线检测 + + m_tempSensorList.append(makeASensorItem(0x02C5, 4, tr("Head Intermediate Limit 1")));//机头中间限位1 + m_tempSensorList.append(makeASensorItem(0x02C5, 5, tr("Head Intermediate Limit 2")));//机头中间限位2 + + m_tempSensorList.append(makeASensorItem(0x03C0, 0, tr("Nose movement button")+" 1"));//机头移动按钮1 + m_tempSensorList.append(makeASensorItem(0x03C0, 1, tr("Nose movement button")+" 2"));//机头移动按钮2 + m_tempSensorList.append(makeASensorItem(0x03C0, 2, tr("Nose movement button")+" 3"));//机头移动按钮3 + m_tempSensorList.append(makeASensorItem(0x03C0, 3, tr("Nose movement button")+" 4"));//机头移动按钮4 + m_tempSensorList.append(makeASensorItem(0x03C0, 4, tr("safety light curtain")+" 1"));//安全光幕1 + m_tempSensorList.append(makeASensorItem(0x03C0, 5, tr("safety light curtain")+" 2"));//安全光幕2 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERRQUI_CHANGE_BOBBIN 0x000100F0 // 更换梭芯 +#define ERR_FEED_ROLLER 0x0200 // 进料压辊 异常 +#define ERR_DIS_ROLLER 0x0201 // 出料压辊 异常 +#define ERR_DIS_MATERIAL 0x0202 // 出料压料 异常 +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 +#define ERR_FCLAMP_LIFT 0x0207 // 前夹升降气缸 异常 +#define ERR_FCLAMP_OPCL 0x0208 // 前夹开合气缸 异常 +#define ERR_PULL_CLAMP 0x0209 // 机械手上夹气缸 异常 +#define ERR_PULL_CLIP 0x020A // 机械手下夹气缸 异常 +#define ERR_CHANGE_BOBBIN 0x00F0 // 更换梭芯 +#define ERR_BEDSEET_ERR13 0x00010233 // 上料架缺料 +#define ERRQUI_CROSS_MAT 0x00010207 // 物料参数设置错误 +#define ERRQUI_CROSS_OUT 0x00010208 // 出料压辊响应超时 +#define ERRQUI_CROSS_JAWDN 0x00010209 // 下夹料响应超时 +#define ERRQUI_CROSS_JAWOT 0x0001020A // 夹爪伸缩响应超时 +#define ERR_BEDSEET_ERRB 0x0001022B // 右边缝断线 +#define ERR_BEDSEET_ERRC 0x0001022C // 左边缝断线 +#define ERR_BEDSEET_ERRD 0x0001022D // 更换梭芯 +#define ERR_BEDSEET_ERRE 0x0001022E // 未满足拉料条件 +#define ERR_BEDSEET_ERRF 0x0001022F // 物料输送超时 + +//初始化错误代码和状态列表 +void FourHeadCombQui::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NONE,tr("freedom from error")));// 没有错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_POWER,tr("Not powered on")));// 没有上电 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_AIR,tr("Insufficient air pressure")));// 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_SAFE,tr("Safe Area Intervention")));// 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FILL_DATA,tr("Filling data error")));// 填充数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_ALLOWED,tr("Working status not allowed")));// 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CTRL_ERR,tr("control error")));// 控制错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_ERR,tr("Motion control chip version error")));// 运动控制芯片版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BUTTON_NOUP,tr("Waiting for button to lift timeout")));// 等待按钮抬起超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_RESET,tr("FPGA reset error")));// FPGA复位错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_READY,tr("Peripheral not ready")));// 外设未就绪 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_SEND_ERR,tr("Transmission data error")));// 传输数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDTION_ERR,tr("Program version error")));// 程序版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_WORK_DONE,tr("Production completed")));// 完成产量 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_POSITIVE,strForwardLimit));// 正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_NEGATIVE,strReverseLimit));// 反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_ALM,tr("Motion alarm")));// 运动报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_LIMIT,tr("Motion limit")));// 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_EMS,tr("Exercise emergency stop")));// 运动急停 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MV_PARA,tr("Motion parameter error")));// 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MC_PARA,tr("Machine parameter error")));// 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_IN_PARA,tr("Input parameter error")));// 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NORMAL,tr("The file is correct")));// 文件正确 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_WAIT,tr("Waiting for files")));// 等待文件 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_RIGHT,tr("Zero successfully")));// 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_ERROR,tr("Zero error")));// 归零错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_COOR_SYSTM,tr("Coordinate system error")));// 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DATA_ERROR,tr("data error"))); // 数据错误 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_SYNC,tr("Needle shuttle out of sync"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RO_NOT_SYNC,tr("Rotation out of sync"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NOT_POS,tr("The scissors are not returning to their original position"))); // 剪刀不在回位(注:该报错码是缝纫剪刀) + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_LOW,tr("Machine head not in low position"))); // 机头不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Infrared curtain intervention"))); // 红外介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("Bottom line disconnection"))); // 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_ERR,tr("Shuttle Change Device Alarm"))); // 换梭装置报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_SHUTDISK,tr("Replace Shuttle Disk"))); // 更换梭盘 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRD,tr("Replace the shuttle core")));// 更换梭芯 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEED_ROLLER,tr("Abnormal feeding pressure roller"))); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_ROLLER,tr("Abnormal discharge pressure roller"))); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_DIS_MATERIAL,tr("Abnormal discharge and pressing"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLOTH_DEVICE,tr("Abnormal cloth clamping device"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CROSS_MOTOR,tr("Cross cutting motor abnormality"))); // 横切电机 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FCLAMP_LIFT,tr("Front clamp lifting cylinder abnormality"))); // 前夹升降气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FCLAMP_OPCL,tr("Front clamp open/close cylinder abnormality"))); // 前夹开合气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULL_CLAMP,tr("Upper robotic arm gripper cylinder abnormality"))); // 机械手上夹气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULL_CLIP,tr("Lower robotic arm gripper cylinder abnormality"))); // 机械手下夹气缸 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERR13,tr("Feeder rack material shortage"))); // 上料架缺料 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_MAT,tr("Material parameter configuration error"))); // 物料参数设置错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_OUT,tr("Delivery roller response timeout"))); // 出料压辊响应超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_JAWDN,tr("Lower clamp material response timeout"))); // 下夹料响应超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_JAWOT,tr("Gripper extension/retraction response timeout"))); // 夹爪伸缩响应超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRB,tr("Right-side thread break"))); // 右边缝断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRC,tr("Left-side thread break"))); // 左边缝断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRD,tr("Replace the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRE,tr("Material pull conditions not met"))); // 未满足拉料条件 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_BEDSEET_ERRF,tr("Material conveyance timeout"))); // 物料输送超时 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area"))); // 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_POS,tr("Template not in place"))); // 模版不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + QString str = tr("The scissors are not returning to their original position");//剪刀不在回位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, str + QString::number(1))); +} + + diff --git a/mctype/patternsingleboard/function/fourheadcombqui.h b/mctype/patternsingleboard/function/fourheadcombqui.h new file mode 100644 index 0000000..0f70476 --- /dev/null +++ b/mctype/patternsingleboard/function/fourheadcombqui.h @@ -0,0 +1,55 @@ +#ifndef FOURHEADCOMBQUI_H +#define FOURHEADCOMBQUI_H + +#include "mctype/machinetypefun.h" + +//四头组合绗缝机 + +#define MT_LX2_FOUR 0x0002 //X2向移动电机 +#define MT_LY_FOUR 0x0003 //Y向移动电机 +#define MT_LM_FOUR 0x0004 //主轴电机 +#define MT_LN_FOUR 0x0005 //针电机 +#define MT_LH_FOUR 0x0006 //梭电机 + +#define OT_LOOSE_THREAD1 0x0002 //松紧线1 +#define OT_LOOSE_THREAD2 0x0003 //松紧线2 +#define OT_LOOSE_THREAD3 0x0004 //松紧线3 +#define OT_LOOSE_THREAD4 0x0005 //松紧线4 +#define OT_DCUT_THREAD1 0x0006 //下剪刀1剪线 +#define OT_DCUT_THREAD2 0x0007 //下剪刀2剪线 +#define OT_DCUT_THREAD3 0x0008 //下剪刀3剪线 +#define OT_DCUT_THREAD4 0x0009 //下剪刀4剪线 +#define OT_OIL_FOUR 0x000A //加油1 +#define OT_OIL2 0x000B //加油2 +#define OT_OIL3 0x000C //加油3 +#define OT_OIL4 0x000D //加油4 + +class FourHeadCombQui : public MachineTypeFun +{ + Q_OBJECT +public: + FourHeadCombQui(); + ~FourHeadCombQui(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; + +#endif // FOURHEADCOMBQUI_H diff --git a/mctype/patternsingleboard/function/fullyautomatic.cpp b/mctype/patternsingleboard/function/fullyautomatic.cpp new file mode 100644 index 0000000..f25ff8f --- /dev/null +++ b/mctype/patternsingleboard/function/fullyautomatic.cpp @@ -0,0 +1,1192 @@ +#include "fullyautomatic.h" + +FullyAutoMatic::FullyAutoMatic() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initPatternsParasList(); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void FullyAutoMatic::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void FullyAutoMatic::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +void FullyAutoMatic::initMcParasList() +{ + int index = 0; + // u32 autoChangeShut; // 自动换梭装置 , 0:打开 1关闭 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, index, root)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, root)); + //红外装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared curtain device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index, operate)); + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, index, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, index, operate)); + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, index, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, index, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, index, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""),99300, 99300, 0x0010, operate)); + + // u32 EncoderMolecule; // 编码器系数分子, 范围 1--100000,单位 无 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient molecule"),//进料编码器系数分子 + 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, index, root)); + + // u32 ZeroCutDistance; // 零切距离, 范围 1--500000,单位 0.01mm // 隐藏 + // u32 cutBoxDev; // 切料箱, + // bit.0, = 0, 无进料装置; 1, 有进料装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 1, 0, PARA_VALUE_TYPE_SW, + tr("Feeding device"),//进料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.1, = 0, 无横切装置; 1, 有横切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 2, 0, PARA_VALUE_TYPE_SW, + tr("Crosscutting device"),//横切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.2, = 0, 无夹布装置; 1, 有夹布装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 3, 0, PARA_VALUE_TYPE_SW, + tr("Cloth clamping device"),//夹布装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.3, = 0, 无张紧装置; 1, 有张紧装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 4, 0, PARA_VALUE_TYPE_SW, + tr("Tensioning device"),//张紧装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.4, = 0, 无边切装置; 1, 有边切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 5, 0, PARA_VALUE_TYPE_SW, + tr("Edge cutting device"),//边切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.7, = 0, 无切料确认功能; 1, 有切料确认功能 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 8, 0, PARA_VALUE_TYPE_SW, + tr("Cutting confirmation function"),//切料确认功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.8, = 0, 无边切升降装置; 1, 有边切升降装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 9, 0, PARA_VALUE_TYPE_SW, + tr("Edge cutting lifting device"),//边切升降装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.9, = 0, 无退料电机装置; 1, 有退料电机装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 10, 0, PARA_VALUE_TYPE_SW, + tr("Material return motor device"),//退料电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.11, = 0, 无中切装置; 1, 有中切装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 12, 0, PARA_VALUE_TYPE_SW, + tr("Mid cutting device"),//中切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + // bit.13, = 1, 无出料装置; 0, 有出料装置 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 13, 0, PARA_VALUE_TYPE_SW, + tr("Discharge device"),//出料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit.5, = 0, 无左上料装置; 1, 有左上料装置 // 隐藏 + // bit.6, = 0, 无右上料装置; 1, 有右上料装置 // 隐藏 + // bit.10, = 0, 无展布电机装置; 1, 有展布电机装置 // 隐藏 + // bit.12, = 0, 无中切对边装置; 1, 有中切对边装置 // 隐藏 + // bit.14, = 0, 无卷料装置; 1, 有卷料装置 // 隐藏 + + // s32 xGapCorrect; // X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index, root)); + // 超级用户 + // s32 yGapCorrect; // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index, root));// 超级用户 + // u32 EncoderDeno; // 编码器系数分母, 范围 1--100000,单位 无 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient denominator"),//进料编码器系数分母 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, index, root)); +} + +void FullyAutoMatic::initWkParasList() +{ + int index = 0; + QTextCodec *cod = QTextCodec::codecForLocale(); + +// u32 msWorkRpm; // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认 2000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // u32 msRevRpm; // 主轴回针转速, 范围 1--500,单位r/min,默认 200 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 sewMoveType; // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, + 0, 0, index, root)); + + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; // 超级用户 + //无加速或减速:0;Xy正弦加速度和减速度:1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, + 1, 1, index, root)); + + // bit2 = 0, 机头连续旋转; bit2 = 1, 机头间歇式旋转; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + //机头连续旋转:0;机头间歇式旋转:1 + tr("Continuous rotation of the machine head:0;Intermittent rotation of the machine head:1"), + 1, 1, index, root)); + + // bit3 = 0, 机头无加减速; bit3 = 1, 机头正弦加减速; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"), + 1, 0, 1, 1, 0, tr(""), tr(""), + //机头无加减速:0;机头正弦加减速:1 + tr("Machine head without acceleration or deceleration:0;Sinusoidal acceleration and deceleration of the machine head:1"), + 1, 1, index, root)); +// u32 actionWhenStart; // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit1, 夹线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 2, 0, PARA_VALUE_TYPE_SW, + tr("Needle and thread clamping allowed"),// 起针夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 cutTrdEn; // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, index, operate)); + +// //5 +// u32 actionWhenCut; // 剪线时动作允许, 位图选择, +// bit0, 松线允许;0:不允许 1:允许 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for loose thread during thread cutting"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + +// bit1, 拉线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 2, 0, PARA_VALUE_TYPE_SW, + tr("When cutting the thread, pulling the thread is allowed"),// 剪线时拉线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// bit2, 夹线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allowing for wire clamping during wire cutting"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// bit3, 提升压脚允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 4, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// bit4, 提升机头剪线;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + +// bit5, 提升机头夹线;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + +// bit6, 在压脚下勾线;0:不允许 1:允许 // 隐藏 + // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 7, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// bit7, 退针允许;0:不允许 1:允许 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// bit8, 扣线允许;0:不允许 1:允许 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 9, 0, PARA_VALUE_TYPE_LIST, + tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + +// u32 tbdNumber; // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数, 默认3 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index, operate)); + +// u32 changeBobbinMode; // 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, index, operate)); + +// u32 changeBobbinLength; // 底线长度, 单位 0.01mm,默认 10000000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 changeBobbinNums; // 换梭片数计数, 单位 次,默认 0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, index, operate)); + +// // 10 + +// u32 oilMode; // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""), + strPersistentrefueling, 0, 0, index, operate)); + +// u32 addOilGapStitch; // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 yuliu; //12 +// u32 addOilTime; // 针加油持续时长, 单位秒, // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duration"), + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index, operate)); + +// u32 finishStopSel; // 完成后停车位置选择, 0, 当前位置; 1,起点,2,定位点,3,上料点; 4,偏移点 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 14, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Parking position selection after completion"),// 完成后停车位置选择 + 0, 0, 4, 0, 0, tr(""), tr(""), + strParkingposition, + 0, 0, index, operate)); + +// u32 offsetEn; // 偏移点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + +// s32 offsetX; // 偏移点坐标xx // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// s32 offsetY; // 偏移点坐标yy // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 fixPosEn; // 穿线点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + +// s32 fixPosX; // 穿线点坐标x // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// //20 +// s32 fixPosY; // 穿线点坐标y // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 expectedOutput; // 产量预设 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 cutXYMovement; // 剪线动框位移, 1--1000, 单位0.01mm, 默认500 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 singlequiltActEn; // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blowing air is allowed during sewing"),// 缝纫时吹气允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit1 自动回穿线点允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + +// u32 liftHeadOption; // 机头升降选择, 位图选择, 0, 不允许; 1, 允许; + // bit0, 缝纫间越框机头升降; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 actionWhenMove; // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit1, 夹线允许; // 隐藏 + // bit2, 开框允许 // 隐藏 + // bit4. 叩线允许 // 隐藏 +// u32 softwareLimit; // 软件限位; 位图选择, 0, 不允许; 1, 允许; +// // bit0, xy移动; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index, operate)); + + +// u32 cutMoveDir; // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, index, operate)); + +// u32 msCornerRpm; // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 slowAngle; // 降速最小偏差角度,单位度,范围0--180,默认 180 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + +// // 30 +// u32 actionWhenBegin; // 开机动作; + //BIT0:1:开机自动找零, 0:开机不自动找零 // 隐藏 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + +// u32 sewSlowMode; // 缝纫降速模式:0:自动降速,1参数降速,2不降速 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode,0, 0, index, operate));//0:自动降速,1参数降速,2不降速 + +// u32 machActEn; // 机器动作配置, 0, 不允许; 1, 允许; + // bit0 自动拉料允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 1, 0, PARA_VALUE_TYPE_SW, + tr("Automatic drawing is allowed"),// 自动拉料允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit0 自动拉料允许; // 隐藏 + // bit1 进料时对边允许; // 隐藏 + // bit2 进料时展布允许; // 隐藏 + // bit3 进料时中切允许; // 隐藏 + // bit4 进料时中切对边允许; // 隐藏 + // bit5 机头升降时松线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // bit6 裁切装置禁用 允许 0, 允许; 1, 不允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 7, 0, PARA_VALUE_TYPE_SW, + tr("Cutting device disabled"),// 裁切装置禁用 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 safetyEn; // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 红外; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // bit1, 气压; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // bit2, 上电信号; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index, root)); + + // bit4, 安全门 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + + // bit5 手自动按钮 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 6, 0, PARA_VALUE_TYPE_SW, + tr("Hand automatic button"),// 手自动按钮 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, root)); + +// u32 autoworkstart; // 循环工作功能,0, 不允许; 1, 允许; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 1, 0, PARA_VALUE_TYPE_SW, + tr("Circular working function"),// 循环工作功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0005, operate)); + +// u32 addOilHookTime; // 梭加油持续时长, 单位秒, (针梭独立加油时有效) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Duration of shuttle refueling"),// 梭加油持续时长 + 0, 0, 60, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, 0x0019, operate)); + +// u32 sewBlowConTime; // 缝纫吹气时间,范围0-10,单位s,默认0(0为持续吹气) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing and blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("second"), tr(""), //秒 + tr(""),0, 0, 0x0015, operate)); + +// u32 sewMoveStAng; // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, root)); + +// u32 cutTrdDivAngle; // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, root)); + +// u32 cutTrdEndAngle; // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, root)); + +// s32 mStopAng; // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 mscutRpm; // 主轴剪线转速, 范围 1--500,单位r/min,默认 120 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + +// s32 mHookAng; // 针梭勾线角度,0--36000, 单位 0.01度,默认 20200 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, index, operate)); + +// u32 pullingLength; // 拉料长度,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"),//拉料长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + +// u32 cuttingLength; // 裁切长度,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting length"),//裁切长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + +// u32 tensionDistance; // 拉料张紧距离,单位 0.01mm // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 45, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling and tensioning distance"),//拉料张紧距离 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + +// u32 sewingActEn; // 缝纫时动作允许, 0, 不允许; 1, 允许; +// // bit8 缝纫过程中进料允许 ; // 隐藏 + + +// u32 PullingPos; // 拉料电机拉料位置,单位 0.01mm //隐藏 +// u32 clipOpenLen; // 夹子开合保护距离(0~100.00mm, 范围0~100.00mm) //隐藏 + +// u32 llRunSpd; // 机械手拉料速度, 范围 1--1000,单位mm/s,默认 300 //隐藏 +// u32 llBakSpd; // 机械手返程速度, 范围 1--1000,单位mm/s,默认 300 //隐藏 +// u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 xymvlSpd; // xy空走运行速度, 范围 100--2000,单位mm/s,默认 300 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 100, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, index, operate)); + +// u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 //参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + +} + +#define OT_LOOSE_THREAD 0x0001 // 松紧线 打开 关闭 +#define OT_DCUT_THREAD 0x0004 // 下剪刀剪线 打开 关闭 +#define OT_OIL 0x0006 // 加油 打开 关闭 +#define OT_LIGHT 0x0007 // 照明灯 打开 关闭 +#define OT_SEW_LIFT 0x000E // 缝纫机头升降 上升 下降 +#define OT_SEW_BLOW 0x0010 // 缝纫吹气 打开 关闭 +#define OT_CRAMP_OPEN 0x0011 // 夹布 开合 +#define OT_TENS_OPEN 0x0012 // 张紧 开合 +#define OT_ROLL_OUT_DOWN 0x0014 // 出料压辊 升降 +#define OT_ROLL_IN_DOWN 0x0013 // 进料压辊 升降 +#define OT_ROLL_CUT_DOWN 0x0015 // 切料压杠 升降 + +#define MT_LIN 0x0016 // 进料电机 +#define MT_LPL 0x0017 // 拉料电机 +#define MT_LOT 0x0018 // 出料电机 +#define MT_LHM 0x0019 // 横切移动电机 +#define MT_LHX 0x001A // 横切旋刀电机 +#define MT_LBQ 0x001B // 边切刀电机 + +void FullyAutoMatic::initOutCtrlList() +{ + int showPriority = 0; + m_allOutCtrlList.clear(); + + // X向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX)); + // Y向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY)); + // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor"),MT_LM)); + // 针电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Needle motor"),MT_LN)); + // 梭电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor"),MT_LH)); + // 升降电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor"),MT_LU)); + + //#define OT_LOOSE_THREAD 0x0001 // 松紧线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD)); + //#define OT_DCUT_THREAD 0x0004 // 下剪刀剪线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Cut the line with scissors"),OT_DCUT_THREAD)); + //#define OT_OIL 0x0006 // 加油 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Add oil"),OT_OIL)); + //#define OT_LIGHT 0x0007 // 照明灯 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Electric light"),OT_LIGHT)); + //#define OT_SEW_LIFT 0x000E // 缝纫机头升降 上升 下降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Sewing machine head lifting"),OT_SEW_LIFT)); + //#define OT_SEW_BLOW 0x0010 // 缝纫吹气 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Sewing and blowing air"),OT_SEW_BLOW)); + //#define OT_CRAMP_OPEN 0x0011 // 夹布 开合 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("textile"),OT_CRAMP_OPEN)); + //#define OT_TENS_OPEN 0x0012 // 张紧 开合 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("tensioning"),OT_TENS_OPEN)); + //#define OT_ROLL_OUT_DOWN 0x0014 // 出料压辊 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Discharge pressure roller"),OT_ROLL_OUT_DOWN)); + //#define OT_ROLL_IN_DOWN 0x0013 // 进料压辊 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Feed pressure roller"),OT_ROLL_IN_DOWN)); + //#define OT_ROLL_CUT_DOWN 0x0015 // 切料压杠 升降 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Cutting pressure bar"),OT_ROLL_CUT_DOWN)); + + //#define MT_LIN 0x0016 // 进料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Feed motor"),MT_LIN)); + //#define MT_LPL 0x0017 // 拉料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Pulling motor"),MT_LPL)); + //#define MT_LOT 0x0018 // 出料电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Discharge motor"),MT_LOT)); + //#define MT_LHM 0x0019 // 横切移动电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Transverse moving motor"),MT_LHM)); + //#define MT_LHX 0x001A // 横切旋刀电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Cross cutting rotary knife motor"),MT_LHX)); + //#define MT_LBQ 0x001B // 边切刀电机 + m_allOutCtrlList.append(creatPNJoyItem(0,showPriority++,tr("Edge cutter motor"),MT_LBQ)); + +} + +void FullyAutoMatic::initShortCutList() +{ + int index = 0; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING));//手动剪线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));//所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTUPDOWN));//机头升降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Enter the sewing state"),"buttonSewingState",FUN_CTB_INTO_SEW_STA));//进入绗缝状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Enter the material pulling state"),"buttonPullingState",FUN_CTB_INTO_PULL_STA));//进入拉料状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Cross Cut"),"chiselPoint",FUN_CTB_ONEKEY_CROSSCUT));//一键横切 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackOffset"),"buttonQuantityMoveFrame",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set Start Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 +} + +void FullyAutoMatic::initParaSetList() +{ + +} + +#define DSS6_ADDR_02C4 0x02C4 // +// BIT1 : 进料压辊升 +// BIT2 : 出料压辊高 +// BIT3 : 夹布开 +// BIT4 : 张紧 放松 +// BIT5 : 出料压料升 +// BIT6 : 横切降速 +// BIT7 : 横切降速 +// BIT8 : 横切左限位 + +#define DSS6_ADDR_02C5 0x02C5 // +// BIT1 : 横切右限位 +// BIT2 : 一键横切按钮 +// BIT3 : 进料微调按钮 +// BIT4 : 退料微调按钮 + +#define DSS5_ST1_BKU1 0x0170 // 缝纫面线断线检测(1~8) + +void FullyAutoMatic::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 0, tr("Feeding roller lift")));//进料压辊升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 1, tr("High discharge pressure roller")));//出料压辊高 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 2, tr("High discharge pressure roller")));//夹布开 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 3, tr("Tighten and relax")));// BIT4 : 张紧 放松 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 4, tr("Discharge pressure material lift")));// 出料压料升 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 5, tr("Horizontal speed reduction") + "1"));// 横切降速 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 6, tr("Horizontal speed reduction") + "2"));// 横切降速 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C4, 7, tr("Horizontal left limit")));// 横切左限位 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 0, tr("Horizontal right limit position")));// 横切右限位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 1, tr("One click cross cutting button")));// 一键横切按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 2, tr("Feed fine-tuning button")));// 进料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02C5, 3, tr("Return material fine adjustment button")));// 退料微调按钮 + + QString sewingdetection = tr("Sewing thread breakage detection");// 缝纫面线断线检测 + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 0, sewingdetection + "1")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 1, sewingdetection + "2")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 2, sewingdetection + "3")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 3, sewingdetection + "4")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 4, sewingdetection + "5")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 5, sewingdetection + "6")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 6, sewingdetection + "7")); + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 7, sewingdetection + "8")); + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERRQUI_FEED_ROLLER 0x00010200 // 进料压辊 异常 +#define ERRQUI_DIS_ROLLER 0x00010201 // 出料压辊 异常 +#define ERRQUI_DIS_MATERIAL 0x00010202 // 出料压料 异常 +#define ERRQUI_TENS_DEVICE 0x00010203 // 张紧装置 异常 +#define ERRQUI_CLOTH_DEVICE 0x00010204 // 夹布装置 异常 +#define ERRQUI_EDGE_MOTOR 0x00010205 // 边切电机 阻塞 +#define ERRQUI_CROSS_MOTOR 0x00010206 // 横切电机 异常 + +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERR_CLOTH_DEVICE 0x0204 // 夹布装置 异常 +#define ERR_EDGE_MOTOR 0x0205 // 边切电机 阻塞 +#define ERR_CROSS_MOTOR 0x0206 // 横切电机 异常 + +void FullyAutoMatic::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FEED_ROLLER,tr("Feed pressure roller") + tr("error")));// 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_ROLLER,tr("Discharge pressure roller")+ tr("error")));// 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_MATERIAL,tr("Discharging and pressing materials")+ tr("error"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_TENS_DEVICE,tr("Tensioning device")+ tr("error")));// 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CLOTH_DEVICE,tr("Cloth clamping device")+ tr("error")));// 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDGE_MOTOR,tr("Edge cutting motor")+ tr("error")));// 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_MOTOR,tr("Transverse motor")+ tr("error")));// 横切电机 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("Tensioning device")+ tr("error"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLOTH_DEVICE,tr("Cloth clamping device")+ tr("error"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EDGE_MOTOR,tr("Edge cutting motor")+ tr("error"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CROSS_MOTOR,tr("Transverse motor")+ tr("error"))); // 横切电机 异常 + +} diff --git a/mctype/patternsingleboard/function/fullyautomatic.h b/mctype/patternsingleboard/function/fullyautomatic.h new file mode 100644 index 0000000..8ccec8b --- /dev/null +++ b/mctype/patternsingleboard/function/fullyautomatic.h @@ -0,0 +1,35 @@ +#ifndef FULLYAUTOMATIC_H +#define FULLYAUTOMATIC_H + +#include + +#include "mctype/machinetypefun.h" + +/// +/// \brief The FullyAutoMatic class 全自动缝纫机 +/// +class FullyAutoMatic : public MachineTypeFun +{ + Q_OBJECT +public: + FullyAutoMatic(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; + +#endif // FULLYAUTOMATIC_H diff --git a/mctype/patternsingleboard/function/glassfibremac.cpp b/mctype/patternsingleboard/function/glassfibremac.cpp new file mode 100644 index 0000000..95fdba6 --- /dev/null +++ b/mctype/patternsingleboard/function/glassfibremac.cpp @@ -0,0 +1,1726 @@ +#include "glassfibremac.h" + +GlassFibreMac::GlassFibreMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +GlassFibreMac::~GlassFibreMac() +{ + +} + + +//初始化九宫格功能按键 +void GlassFibreMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); + +} + +void GlassFibreMac::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +//花样参数 +void GlassFibreMac::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 1, U16_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 1, U16_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + +#if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,index++, operate)); + } +#endif + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-200,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 200, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(0) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#else + + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +#endif + //花样参数--------------------------- +} + +//机器参数 +void GlassFibreMac::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + + //自动换梭装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, 0x0001, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //红外装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Light curtain device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, root)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, 0x0004, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0006, operate)); + + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, 0x0007, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, 0x0008, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, 0x0009, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0010, operate)); + + + //进料编码器系数分子, 范围 1--100000,单位 无 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient molecule"),//进料编码器系数分子 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0011, root)); + + //零切距离, 范围1--500000 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Zero tangent distance"),//零切距离 + 0, 1, 500000, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0012, root)); + //切料箱装置选择, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Feeding device"),//进料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //横切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Crosscutting device"),//横切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //夹布装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Cloth clamping device"),//夹布装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //张紧装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Tensioning device"),//张紧装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //边切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Edge cutting device"),//边切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("No:0;Have:1"), + 0, 0, 0x0013, root)); + + //左上料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 6, 0, PARA_VALUE_TYPE_SW, + tr("Left feeding device"),//左上料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //右上料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 7, 0, PARA_VALUE_TYPE_SW, + tr("Right feeding device"),//右上料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //切料确认功能, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 8, 0, PARA_VALUE_TYPE_SW, + tr("Cutting confirmation function"),//切料确认功能 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, operate)); + + //退料电机装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 8, 0, PARA_VALUE_TYPE_SW, + tr("Material return motor device"),//退料电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //展布电机装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 9, 0, PARA_VALUE_TYPE_SW, + tr("Distribution motor device"),//展布电机装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //中切装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 10, 0, PARA_VALUE_TYPE_SW, + tr("Mid cutting device"),//中切装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //中切对边装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 11, 0, PARA_VALUE_TYPE_SW, + tr("Mid cut edge device"),//中切对边装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //出料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 12, 0, PARA_VALUE_TYPE_SW, + tr("Discharge device"),//出料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + //卷料装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 10, 13, 0, PARA_VALUE_TYPE_SW, + tr("Roll material device"),//卷料装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0013, root)); + + + //X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0014, root)); + + // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0015, root)); + + //进料编码器系数分母, 范围 1--100000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder coefficient denominator"),//进料编码器系数分母 + 0, 1, 100000, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x00C3, root)); + +} + +//工作参数 +void GlassFibreMac::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0100, operate)); + + // 主轴回针转速, 范围 1--500,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0101, operate)); + + // 缝纫动框方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, 0, 0, 0x0102, root));//连续:0;间歇式:1 + + // 缝纫加减速方式, 范围 0--1,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + 1, 1, 0x0102, root)); + + // 缝纫机头旋转方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing machine head rotating manner"),// 缝纫机头旋转方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Continuous rotation:0;Xy intermittent rotation:1"),//连续旋转:0;Xy间歇旋转:1 + 0, 0, 0x0102, root)); + + // 缝纫机头加减速方式, 范围 0--1,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing head deceleration mode"),// 缝纫机头加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr("No acceleration or deceleration:0;Intermittent acceleration and deceleration:1"), //无加速或减速:0;间歇加减速:1 + 1, 1, 0x0102, root));//无加速或减速:0;间歇加减速:1 + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0102, operate)); + // bit1, 夹线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 2, 0, PARA_VALUE_TYPE_SW, + tr("Needle and thread clamping allowed"),// 起针夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0102, operate)); + + // 剪线允许, 范围 0--3,默认 1 + // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, 0x0104, operate)); + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // bit1, 拉线允许; + // 剪线时拉线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 2, 0, PARA_VALUE_TYPE_SW, + tr("Thread pulling allowed during thread trimming"),// 剪线时拉线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit2, 夹线允许; + // 剪线时夹线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 3, 0, PARA_VALUE_TYPE_SW, + tr("Thread clamping allowed during thread trimming"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // bit3, 提升压脚允许; + // 剪线时提升压脚允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 4, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit4, 提升机头剪线; + // 剪线时提升机头剪线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit5, 提升机头夹线;0:允许 1:不允许 + // 剪线时提升机头夹线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit6, 在压脚下勾线;0:允许 1:不允许 + // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 7, 0, PARA_VALUE_TYPE_SW, + tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + + // bit7, 退针允许;0:允许 1:不允许 + // 剪线时退针允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, root)); + // bit8, 扣线允许;0:允许 1:不允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 9, 0, PARA_VALUE_TYPE_LIST, + tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + + + // 断线检测针数, 范围 0--10,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, 0x0106, operate)); + + // 换梭芯提醒功能, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, 0x0107, operate)); + + // 底线长度, 范围 0--S32_MAX, 单位 0.01mm 默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0108, operate)); + + // 换梭片数计数, 范围 0--1000,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, 0x0109, operate)); + + // 加油方式选择, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, 0x010A, operate)); + + // 加油针数间隔, 范围 S32_MIN--S32_MAX,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, 0x010B, operate)); + + // 加油持续时长, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling duration"),// 加油持续时长 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, 0x010D, operate)); + + // 完成后停车位置选择, 范围 0--4,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 14, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Parking position selection after completion"),// 完成后停车位置选择 + 0, 0, 4, 0, 0, tr(""), tr(""), + strParkingposition,//当前点:0;起始点:1;定位点:2;上料点:3;偏移点:4 + 0, 0, 0x010E, operate)); + + // 偏移点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x010F, operate)); + + // 偏移点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0110, operate)); + + // 偏移点坐标Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("") + ("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0111, operate)); + + // 穿线点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x0112, operate)); + + // 穿线点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0113, operate)); + + // 穿线点坐标 Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("") + ("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0114, operate)); + + // 产量预设, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0115, operate)); + + // 剪线动框位移, 范围 0--1000,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0116, operate)); + + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0, 0, 不允许; 1, 允许 + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 缝纫间越框机头升降, 范围 0--max,默认 0 + // bit0, 缝纫间越框机头升降; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框时动作选择, 范围 0--1,默认 0 + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框夹线允许, 范围 0--1,默认 0 + // bit1, 夹线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 2, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Clamp line"),// 移框夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, operate)); + + // 移框自动压框允许, 范围 0--1,默认 0 + // bit2, 开框允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 3, 0, PARA_VALUE_TYPE_SW, + tr("Frame moving and automatic frame pressing allowed"),// 移框自动压框允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, root)); + + // 移框扣线允许, 范围 0--1,默认 0 + // bit4. 叩线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 5, 0, PARA_VALUE_TYPE_SW, + tr("Allowed to move frame and thread"),// 移框扣线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0117, root)); + + // 软件限位XY移动允许, 范围 0--1,默认 0 + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x011C, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, 0x0122, operate)); + + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0123, operate)); + + // 降速最小偏差角度, 范围 0--180,默认 180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0124, operate)); + + // 开机自动找零, 范围 0--1,默认 1 + //BIT0:1:开机自动找零, 0:开机不自动找零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0125, root)); + + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode, 0, 0, 0x0126, root));//0:自动降速,1参数降速,2不降速 + + // 机器动作配置, 范围 0--1 + // bit0 自动拉料允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 1, 0, PARA_VALUE_TYPE_SW, + tr("Automatic drawing is allowed"),// 自动拉料允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时对边允许, 范围 0--1 + // bit1 进料时对边允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 2, 0, PARA_VALUE_TYPE_SW, + tr("The opposite side is allowed when feeding"),// 进料时对边允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时展布允许, 范围 0--1,默认 1 + // bit2 进料时展布允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allowing distribution during feeding"),// 进料时展布允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时中切允许, 范围 0--1,默认 1 + // bit3 进料时中切允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 4, 0, PARA_VALUE_TYPE_SW, + tr("Medium cutting is allowed during feeding"),// 进料时中切允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 进料时中切对边允许, 范围 0--1,默认 1 + // bit4 进料时中切对边允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 5, 0, PARA_VALUE_TYPE_SW, + tr("During feeding, it is allowed to cut across the edge"),// 进料时中切对边允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, root)); + + // 机头升降时松线允许, 范围 0--1,默认 1 + // bit5 机头升降时松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0126, operate)); + + // 安全输入红外允许, 范围 0--1,默认 0 + // bit0, 红外; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input light curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0127, operate)); + + // 安全输入气压允许, 范围 0--1,默认 1 + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0127, operate)); + + // 安全输入上电信号允许, 范围 0--1,默认 0 + // bit2, 上电信号; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0127, root)); + + // 安全输入安全门允许, 范围 0--1,默认 0 + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0128, root)); + + // 安全输入手自动允许, 范围 0--1,默认 0 + // bit5 手自动按钮 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 6, 0, PARA_VALUE_TYPE_LIST, + tr("Manual and automatic safe input"),// 安全输入手自动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0127, root)); + + // 循环工作允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 0, 0, PARA_VALUE_TYPE_SW, + tr("Loop work allowed"),// 循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, 0x0129, root)); + + // 梭加油持续时长, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, 0x0129, root)); + + + // 缝纫吹气时间,范围0-50,单位 s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing air blowing time"),// 缝纫吹气时间 + 0, 0, 50, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 针梭勾线角度, 范围 0--36000,单位0.01度,默认 20200; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, 0x0130, operate)); + + // 拉料长度, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"),//拉料长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, operate)); + // 裁切长度, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 44, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting length"),//裁切长度 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 拉料张紧距离, 单位 0.01mm,默认0; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 45, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling and tensioning distance"),//拉料张紧距离 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0130, root)); + // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit0 吹气允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blow air during sewing"),// 缝纫时吹气 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit1 摆针允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 2, 0, PARA_VALUE_TYPE_SW, + tr("Stitch during sewing"),// 缝纫时摆针 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit2 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 3, 0, PARA_VALUE_TYPE_SW, + tr("Automatic rewinding point during sewing"),// 缝纫时自动回穿线点 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit3 机头旋转允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 4, 0, PARA_VALUE_TYPE_SW, + tr("The machine head rotates during sewing"),// 缝纫时机头旋转 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // bit4 送边条允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 5, 0, PARA_VALUE_TYPE_SW, + tr("Send edge strips during sewing"),// 缝纫时送边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // bit5 针杆离合允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 6, 0, PARA_VALUE_TYPE_SW, + tr("Needle bar clutch during sewing"),// 缝纫时针杆离合 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit6 大压脚动作允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 7, 0, PARA_VALUE_TYPE_SW, + tr("Heavy foot pressure action during sewing"),// 缝纫时大压脚动作 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit7 缝纫前拍照允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 8, 0, PARA_VALUE_TYPE_SW, + tr("Taking photos before sewing"),// 缝纫前拍照允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + // bit8 缝纫过程中进料允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 9, 0, PARA_VALUE_TYPE_SW, + tr("Feed during sewing"),// 缝纫时进料 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit9 缝纫过程中缝织带允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 10, 0, PARA_VALUE_TYPE_SW, + tr("Sew tape during sewing"),// 缝纫时缝织带 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit10 缝纫过程中边缝允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 11, 0, PARA_VALUE_TYPE_SW, + tr("Side Seam during sewing"),// 缝纫时边缝 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit11 按数据送边条 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 12, 0, PARA_VALUE_TYPE_SW, + tr("Send border strips according to data"),// 按数据送边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit12 移框时出边条 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 13, 0, PARA_VALUE_TYPE_SW, + tr("Exceeding the border when moving the frame"),// 移框时超出边条 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + // bit13 缝纫机头作画笔允许 ; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 46, 14, 0, PARA_VALUE_TYPE_SW, + tr("Sewing machine head as a paintbrush"),// 缝纫机头作画笔允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, root)); + + // 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 67, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing motion frame continuous Angle"),//缝纫动框持续角度 + 15000, 0, 36000, 15000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, 0x0130, root)); + +} + +#define OT_DRAW_LIFT 0x0008 // 画笔升降 上升 下降 +#define OT_DRAW_HAT 0x0009 // 画笔笔帽 打开 关闭 + +//电机和控制动作 +void GlassFibreMac::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + + int showPriority = 0; + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Draw Lift"),OT_DRAW_LIFT));//画笔升降(上升,下降) + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Draw Hat"),OT_DRAW_HAT));//画笔笔帽 打开 关闭 + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("X to move motor"),MT_LX,// X向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Y to move motor"),MT_LY,// Y向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor"),MT_LM,// 主轴电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Needle motor"),MT_LN,// 针电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle motor"),MT_LH,// 梭电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower scissors to cut thread"),OT_DCUT_THREAD,// 下剪刀剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("oil"),OT_OIL,// 加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("headlamp"),OT_LIGHT,// 照明灯 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sewing machine head lifting"),OT_SEW_LIFT,// 缝纫机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device grabbing"),OT_CHBOB_GRAB_OPEN,// 换梭装置抓取 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changer swing"),OT_CHBOB_SWAY_PUSH,// 换梭装置摆动 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changer rotation"),OT_CHBOB_SPIN,// 换梭装置旋转 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sewing Blow"),OT_SEW_BLOW,// 缝纫吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Pulling motor"),MT_LPL,// 拉料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + +} + +//快捷功能 +void GlassFibreMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackThread"),"buttonSetAnchorPoint",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++, tr("Needle shuttle reset"),"buttonNeedleShuttleReset",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("installFirst bobbin"),"buttonBottomDetect",FUN_INSTALL_FIRST_BOBBIN));//安装第一个梭壳 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom plateToHead"),"buttonCoilParas",FUN_SHUT_FROM_PLATE_TO_HEAD));//将旋梭从梭盘拿到机头 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom headToPlate"),"buttonCoilParas",FUN_SHUT_FROM_HEAD_TO_PLATE));//将旋梭从机头拿到梭盘 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto takePlate"),"buttonHeadEmb",FUN_SHUT_INTO_TAKE_PLATE));//进入更换梭盘状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto indxSta"),"buttonHardwareConfig",FUN_SHUT_INTO_INDX_STA));//进入缝纫状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackOffset"),"buttonQuantityMoveFrame",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonSetAnchorPoint",FUN_OUTPUTRESET));//产量清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTUPDOWN));//机头升降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING));//手动剪线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set Start Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 +} + +//辅助功能 +void GlassFibreMac::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + // m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +//花样设置 +void GlassFibreMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +//参数分类(参数分组功能) +void GlassFibreMac::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +#define DSS1_B_START_BT 0x0000 // 启动按钮(1~8) +#define DSS6_ADDR_02B0 0x02B0 // 自动换梭信号 +// BIT1 : 梭在位检测 +// BIT2 : 扣线伸出位 +// BIT3 : 换梭旋转伸出位 +// BIT4 : 换梭旋转收回位 +// BIT5 : 换梭推动伸出位 +// BIT6 : 换梭推动收回位 +// BIT7 : 换梭摆动伸出位 +// BIT8 : 换梭摆动收回位 + +#define DSS6_ADDR_02B1 0x02B1 // 自动换梭信号 +// BIT1 :防扎带-检测 +// BIT2 :一键横切按钮 +// BIT3 : 高低速切换 按钮 +// BIT4 :进料微调按钮 +// BIT5 :退料微调按钮 +// BIT6 :手动加油按钮 +// BIT7 :画笔高位 +// BIT8 :画笔低位 + +//初始化传感器列表 +void GlassFibreMac::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 0, tr("X deceleration")));//X降速 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0082, 0, tr("Sewing needle hook thread")));//缝纫针勾线位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x008A, 0, tr("Sewing shuttle hook thread")));//缝纫梭勾线位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 0, tr("Shuttle position detection")));//梭在位检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 1, tr("Buckle extension")));//扣线伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 2, tr("Swapping shuttle, rotating and extending")));//换梭旋转伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 3, tr("Swap shuttle, rotate and retract")));//换梭旋转收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 4, tr("Replace the shuttle and push it out")));//换梭推动伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 5, tr("Replace the shuttle and push for retrieval")));//换梭推动收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 6, tr("Swapping shuttle swings and extends")));//换梭摆动伸出位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B0, 7, tr("Swapping shuttle, swinging and retracting")));//换梭摆动收回位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 0, tr("Anti zip ties - detection")));//防扎带-检测 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 1, tr("One click cross cutting button")));//一键横切按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 2, tr("High/Low Speed Switching Button")));//高低速切换按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 3, tr("Feed fine-tuning button")));//进料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 4, tr("Return material fine adjustment button")));//退料微调按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 5, tr("Manual refueling button")));//手动加油按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 6, tr("Brush high position")));//画笔高位 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B1, 7, tr("Brush low position")));//画笔低位 + m_tempSensorList.append(makeASensorItem(0x02B2, 0, tr("light curtain 1")));//红外1 + m_tempSensorList.append(makeASensorItem(0x02B2, 1, tr("light curtain 2")));//红外2 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + + +#define ERR_PEN_TIMEOUT 0x00010042 // 画笔升降超时 +#define ERR_PENHAT_TIMEOUT 0x00010043 // 画笔笔帽超时 + +//初始化错误代码和状态列表 +void GlassFibreMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NONE,tr("freedom from error")));// 没有错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_POWER,tr("Not powered on")));// 没有上电 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_AIR,tr("Insufficient air pressure")));// 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_SAFE,tr("Safe Area Intervention")));// 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FILL_DATA,tr("Filling data error")));// 填充数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_ALLOWED,tr("Working status not allowed")));// 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CTRL_ERR,tr("control error")));// 控制错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_ERR,tr("Motion control chip version error")));// 运动控制芯片版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BUTTON_NOUP,tr("Waiting for button to lift timeout")));// 等待按钮抬起超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_RESET,tr("FPGA reset error")));// FPGA复位错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_READY,tr("Peripheral not ready")));// 外设未就绪 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_SEND_ERR,tr("Transmission data error")));// 传输数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDTION_ERR,tr("Program version error")));// 程序版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_WORK_DONE,tr("Production completed")));// 完成产量 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_POSITIVE,strForwardLimit));// 正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_NEGATIVE,strReverseLimit));// 反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_ALM,tr("Motion alarm")));// 运动报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_LIMIT,tr("Motion limit")));// 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_EMS,tr("Exercise emergency stop")));// 运动急停 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MV_PARA,tr("Motion parameter error")));// 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MC_PARA,tr("Machine parameter error")));// 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_IN_PARA,tr("Input parameter error")));// 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NORMAL,tr("The file is correct")));// 文件正确 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_WAIT,tr("Waiting for files")));// 等待文件 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_RIGHT,tr("Zero successfully")));// 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_ERROR,tr("Zero error")));// 归零错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_COOR_SYSTM,tr("Coordinate system error")));// 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DATA_ERROR,tr("data error"))); // 数据错误 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_SYNC,tr("Needle shuttle out of sync"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RO_NOT_SYNC,tr("Rotation out of sync"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NOT_POS,tr("The scissors are not returning to their original position"))); // 剪刀不在回位(注:该报错码是缝纫剪刀) + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_LOW,tr("Machine head not in low position"))); // 机头不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Light curtain intervention"))); // 红外介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("Bottom line disconnection"))); // 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_ERR,tr("Shuttle Change Device Alarm"))); // 换梭装置报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_SHUTDISK,tr("Replace Shuttle Disk"))); // 更换梭盘 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FEED_ROLLER,tr("Abnormal feeding pressure roller"))); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_ROLLER,tr("Abnormal discharge pressure roller"))); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_MATERIAL,tr("Abnormal discharge and pressing"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CLOTH_DEVICE,tr("Abnormal cloth clamping device"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_MOTOR,tr("Cross cutting motor abnormality"))); // 横切电机 异常 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_INSTALLMENT_OK,tr("Password set successfully"))); // 密码设置成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_INSTALLMENT_FAIL,tr("Password setting failed"))); // 密码设置失败 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_N_ALM,tr("Needle ") + strMotorAlarm)); // 针电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_H_ALM,tr("Shuttle") + strMotorAlarm)); // 梭电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_ALM,"X " + strMotorAlarm)); // X电机报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_Y_ALM,"Y " + strMotorAlarm)); // Y电机报警 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_N_FZ,tr("Needle ") + strMotorResetFailed)); // 针电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_H_FZ,tr("Shuttle ") + strMotorResetFailed)); // 梭电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_FZ,"X " + strMotorResetFailed)); // X电机归零失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_Y_FZ,"Y " + strMotorResetFailed)); // Y电机归零失败 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CS_TIMEOUT,tr("Slave board communication timeout"))); // 从板通讯超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MOTO_X_ZERO,tr("X motor not in zero position"))); // X电机不在零位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area"))); // 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_POS,tr("Template not in place"))); // 模版不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + QString str = tr("The scissors are not returning to their original position");//剪刀不在回位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PEN_TIMEOUT, tr("Brush lifting timeout"))); // 画笔升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, tr("Pen cap timeout"))); // 画笔笔帽超时 + +} + + diff --git a/mctype/patternsingleboard/function/glassfibremac.h b/mctype/patternsingleboard/function/glassfibremac.h new file mode 100644 index 0000000..ab9c2af --- /dev/null +++ b/mctype/patternsingleboard/function/glassfibremac.h @@ -0,0 +1,38 @@ +#ifndef GLASSFIBREMAC_H +#define GLASSFIBREMAC_H + +#include "mctype/machinetypefun.h" + +/// +/// \brief 玻璃纤维 +/// +class GlassFibreMac : public MachineTypeFun +{ + Q_OBJECT +public: + GlassFibreMac(); + ~GlassFibreMac(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // GLASSFIBREMAC_H diff --git a/mctype/patternsingleboard/function/highsinglequilting.cpp b/mctype/patternsingleboard/function/highsinglequilting.cpp new file mode 100644 index 0000000..a2408a4 --- /dev/null +++ b/mctype/patternsingleboard/function/highsinglequilting.cpp @@ -0,0 +1,1547 @@ +#include "highsinglequilting.h" + +// 高速单针绗缝机 +HighSingleQui::HighSingleQui() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +HighSingleQui::~HighSingleQui() +{ + +} + +//初始化九宫格功能按键 +void HighSingleQui::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); + +} + +void HighSingleQui::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +//花样参数 +void HighSingleQui::initPatternsParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-左边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETLEFT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Left"),//左边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-前边;单位:毫米 ,范围0-10000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETFRONT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Front"),//前边 + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 1, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, index++, operate)); + } + + //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation angle"),//旋转角度 + 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //绣花机-花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //绣花机-花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + //花样参数--------------------------- +} + +//机器参数 +void HighSingleQui::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + + //自动换梭装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Automatic shuttle changing device"),//自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, 0, 0, 0x0001, operate)); + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, 0x0002, operate)); + + // //手/自动按钮装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 1, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic button device"),//手自动按钮装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strClosedOpen, + // 0, 0, 0x0002, operate)); + + //X可移动区域正边界, 范围S32_MIN--S32_MAX,默认207500 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("X movable area positive boundary"),//X可移动区域正边界 + 207500, S32_MIN, S32_MAX, 207500, 2, tr("mm"), tr(""), + tr(""), + 207500, 207500, 0x0004, operate)); + + //Y可移动区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y movable area positive boundary"),//Y可移动区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), + 99300, 99300, 0x0006, operate)); + + //x可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认6800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Negative boundary"),//x可缝纫区域负边界 + 6800, S32_MIN, S32_MAX, 6800, 2, tr("mm"), tr(""), + tr(""), + 6800, 6800, 0x0007, operate)); + + //x可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认128800 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Sewing area Positive margin"),//x可缝纫区域正边界 + 128800, S32_MIN, S32_MAX, 128800, 2, tr("mm"), tr(""), + tr(""), + 128800, 128800, 0x0008, operate)); + + //y可缝纫区域负边界, 范围S32_MIN--S32_MAX,默认20300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Negative boundary"),//y可缝纫区域负边界 + 20300, S32_MIN, S32_MAX, 20300, 2, tr("mm"), tr(""), + tr(""), + 20300, 20300, 0x0009, operate)); + + //y可缝纫区域正边界, 范围S32_MIN--S32_MAX,默认99300 单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Sewing area Positive margin"),//y可缝纫区域正边界 + 99300, S32_MIN, S32_MAX, 99300, 2, tr("mm"), tr(""), + tr(""), 99300, 99300, 0x0010, operate)); + + + // //进料编码器系数分子, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 8, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient molecule"),//进料编码器系数分子 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x0011, operate)); + + // //进料编码器系数分母, 范围S32_MIN--S32_MAX,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 205, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Encoder coefficient denominator"),//进料编码器系数分母 + // 0, S32_MIN, S32_MAX, 0, 0, tr(""), tr(""), + // tr(""), + // 0, 0, 0x00C3, operate)); + + + + // //零切距离, 范围1--500000 单位0.01mm + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 9, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Zero tangent distance"),//零切距离 + // 0, 1, 500000, 0, 2, tr("mm"), tr(""), + // tr(""), + // 0, 0, 0x0012, operate)); + // //切料箱装置选择, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 1, 0, PARA_VALUE_TYPE_LIST, + // tr("Feeding device"),//进料装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //横切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Crosscutting device"),//横切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //夹布装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Cloth clamping device"),//夹布装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //张紧装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Tensioning device"),//张紧装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + // //边切装置, 范围0-1,默认0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_MACH, + // MC_SORT_SETTING, + // 10, 5, 0, PARA_VALUE_TYPE_LIST, + // tr("Edge cutting device"),//边切装置 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("No:0;Have:1"), + // 0, 0, 0x0013, operate)); + + //X间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("X Gap Compensation"),//X间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0014, operate)); + + // Y间隙补偿,范围-200--200 单位 0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y Gap Compensation"),//Y间隙补偿 + 0, -200, 200, 0, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0015, operate)); +} + +//工作参数 +void HighSingleQui::initWkParasList() +{ + int index = 0; + QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 主轴回针转速, 范围 1--1000,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle back needle speed"),// 主轴回针转速 + 200, 1, 1000, 200, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框方式, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, + 0, 0, index, operate));//连续:0;间歇式:1 + + // // 缝纫加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 2, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + // 1, 1, index, operate)); + + // // 缝纫机头旋转方式, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing machine head rotating manner"),// 缝纫机头旋转方式 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr("Continuous rotation:0;Xy intermittent rotation:1"),//连续旋转:0;Xy间歇旋转:1 + // 0, 0, index, operate)); + + // // 缝纫机头加减速方式, 范围 0--1,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 2, 4, 0, PARA_VALUE_TYPE_LIST, + // tr("Sewing head deceleration mode"),// 缝纫机头加减速方式 + // 1, 0, 1, 1, 0, tr(""), tr(""), + // tr("No acceleration or deceleration:0;Intermittent acceleration and deceleration:1"), //无加速或减速:0;间歇加减速:1 + // 1, 1, index, operate));//无加速或减速:0;间歇加减速:1 + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 3, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Needle and thread clamping allowed"),// 起针夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 剪线允许, 范围 0--3,默认 1 + // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 最后剪线;3,数据剪线;默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 4, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Cut lines allow"),// 剪线允许 + 1, 0, 3, 1, 0, tr(""), tr(""), + strTrimList,//不剪线:0;自动剪线:1;最后剪线:2;数据剪线:3 + 1, 1, index, operate)); + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // // bit1, 拉线允许; + // // 剪线时拉线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Thread pulling allowed during thread trimming"),// 剪线时拉线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit2, 夹线允许; + // // 剪线时夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Thread clamping allowed during thread trimming"),// 剪线时夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit3, 提升压脚允许; + // // 剪线时提升压脚允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 4, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to lift the presser foot during thread trimming"),// 剪线时提升压脚允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // bit4, 提升机头剪线; + // 剪线时提升机头剪线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 5, 0, PARA_VALUE_TYPE_SW, + tr("Lifting machine head thread cutting is allowed during thread cutting"),// 剪线时提升机头剪线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0105, operate)); + // // bit5, 提升机头夹线;0:允许 1:不允许 + // // 剪线时提升机头夹线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 6, 0, PARA_VALUE_TYPE_SW, + // tr("The thread clamping of the lifting head is allowed during thread cutting"),// 剪线时提升机头夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + // // bit6, 在压脚下勾线;0:允许 1:不允许 + // // 剪线时在压脚下勾线允许, 范围 0--1,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 7, 0, PARA_VALUE_TYPE_SW, + // tr("It is allowed to hook the thread at the foot of the presser during thread cutting"),// 剪线时在压脚下勾线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // bit7, 退针允许;0:允许 1:不允许 + // 剪线时退针允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 5, 8, 0, PARA_VALUE_TYPE_SW, + tr("Needle withdrawal allowed during thread trimming"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // bit8, 扣线允许;0:允许 1:不允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 5, 9, 0, PARA_VALUE_TYPE_LIST, + // tr("Buckle the thread allowed during thread trimming"),// 剪线时扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + + // 断线检测针数, 范围 0--10,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index, operate)); + + // u32 BrokenRpairMode; // 断线补缝方式 , 范围 0--1, 1:反复加固模式 2回退模式 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 54, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Broken line patching method"), + 0, 0, 1, 0, 0, tr(""), tr(""), + //反复加固模式:0;回退模式:1 + tr("Repeated reinforcement mode:0;fallback mode:1"), + 0, 0, index, operate)); + + // u32 ReinforPins; // 加固针数 , 范围 1--10 , 单位 针 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 55, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of reinforcement needles"), + 0, 1, 10, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // u32 ReinforNumber; // 加固次数 , 范围 1--5 , 单位次 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 56, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"), + 0, 1, 5, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭芯提醒功能, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), //未启用:0;按长度划分的延迟提醒:1;按切片数计数:2;按长度立即提醒:3 + strImmediatelyReminder, 0, 0, index, operate)); + + // 底线长度, 范围 0--S32_MAX,默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 换梭片数计数, 范围 0--1000,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of shuttles"),// 换梭片数计数 + 0, 0, 1000, 0, 0, tr("times"), tr(""), + tr(""), 0, 0, index, operate)); + + // 加油方式选择, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, index, operate)); + + // 加油针数间隔, 范围 S32_MIN--S32_MAX,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index, operate)); + + // // 加油时间间隔, 范围 1--S32_MAX,默认 1 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 12, 0, 0, PARA_VALUE_TYPE_INT, + // tr("Refueling time interval"),// 加油时间间隔 + // 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + // tr(""), 0, 0, index, operate)); + + // 针加油持续时长, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duration"), + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index, operate)); + + // // 完成后停车位置选择, 范围 0--4,默认 0 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 14, 0, 0, PARA_VALUE_TYPE_LIST, + // tr("Parking position selection after completion"),// 完成后停车位置选择 + // 0, 0, 4, 0, 0, tr(""), tr(""), + // strParkingposition,//当前点:0;起始点:1;定位点:2;上料点:3;偏移点:4 + // 0, 0, index, operate)); + + // 偏移点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 15, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 偏移点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+ " " + ("X"),// 偏移点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 偏移点坐标Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset point coordinate")+" "+("Y"),// 偏移点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标有效标志, 范围 0--3,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 18, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Threading point coordinate effective mark"),// 穿线点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, index, operate)); + + // 穿线点坐标X, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+ " " + ("X"),// 穿线点坐标X + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 穿线点坐标 Y, 范围 S32_MIN--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Threading point coordinates")+" "+("Y"),// 穿线点坐标Y + 0, S32_MIN, S32_MAX, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 产量预设, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线动框位移, 范围 0--1000,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),// 剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blowing air is allowed during sewing"),// 缝纫时吹气允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + // 缝纫时自动回穿线点允许, 范围 0--1,默认 0 + // bit1 自动回穿线点允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 2, 0, PARA_VALUE_TYPE_SW, + tr("Automatic threading back point is allowed during sewing"),// 缝纫时自动回穿线点允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫间越框机头升降, 范围 0--max,默认 0 + // bit0, 缝纫间越框机头升降; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 24, 1, 0, PARA_VALUE_TYPE_SW, + tr("Lifting and lowering of frame crossing machine head in sewing room"),// 缝纫间越框机头升降 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 移框时动作选择, 范围 0--1,默认 0 + // bit0, 松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 25, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // // 移框夹线允许, 范围 0--1,默认 0 + // // bit1, 夹线允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 2, 0, PARA_VALUE_TYPE_SW, + // tr("Moving basket Clamp line"),// 移框夹线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框自动压框允许, 范围 0--1,默认 0 + // // bit2, 开框允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Frame moving and automatic frame pressing allowed"),// 移框自动压框允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 移框扣线允许, 范围 0--1,默认 0 + // // bit4. 叩线允许 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_ACTION, + // 25, 5, 0, PARA_VALUE_TYPE_SW, + // tr("Allowed to move frame and thread"),// 移框扣线允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 软件限位XY移动允许, 范围 0--1,默认 0 + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 26, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Software limit XY move allowed"),// 软件限位XY移动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, index, operate)); + + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 降速最小偏差角度, 范围 0--180,默认 180 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 开机自动找零, 范围 0--1,默认 1 + //BIT0:1:开机自动找零, 0:开机不自动找零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 31, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode,0, 0, index, operate));//0:自动降速,1参数降速,2不降速 + + // // 机器动作配置, 范围 0--1 + // // bit0 自动拉料允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 1, 0, PARA_VALUE_TYPE_SW, + // tr("Automatic drawing is allowed"),// 自动拉料允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时对边允许, 范围 0--1 + // // bit1 进料时对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 2, 0, PARA_VALUE_TYPE_SW, + // tr("The opposite side is allowed when feeding"),// 进料时对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时展布允许, 范围 0--1,默认 1 + // // bit2 进料时展布允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 3, 0, PARA_VALUE_TYPE_SW, + // tr("Allowing distribution during feeding"),// 进料时展布允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切允许, 范围 0--1,默认 1 + // // bit3 进料时中切允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 4, 0, PARA_VALUE_TYPE_SW, + // tr("Medium cutting is allowed during feeding"),// 进料时中切允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // // 进料时中切对边允许, 范围 0--1,默认 1 + // // bit4 进料时中切对边允许; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 32, 5, 0, PARA_VALUE_TYPE_SW, + // tr("During feeding, it is allowed to cut across the edge"),// 进料时中切对边允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // tr(""), 0, 0, index, operate)); + + // 机头升降时松线允许, 范围 0--1,默认 1 + // bit5 机头升降时松线允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 6, 0, PARA_VALUE_TYPE_SW, + tr("The thread loosening is allowed when the head is lifting"),// 机头升降时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index, operate)); + + // 安全输入红外允许, 范围 0--1,默认 0 + // bit0, 红外; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 安全输入气压允许, 范围 0--1,默认 1 + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入上电信号允许, 范围 0--1,默认 0 + // // bit2, 上电信号; + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 3, 0, PARA_VALUE_TYPE_LIST, + // tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 安全输入安全门允许, 范围 0--1,默认 0 + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // // 安全输入手自动允许, 范围 0--1,默认 0 + // // bit5 手自动按钮 + // m_allParasList.append(makeAParaItem(0, + // PARA_TYPE_WORK, + // MC_SORT_SETTING, + // 33, 6, 0, PARA_VALUE_TYPE_LIST, + // tr("Manual and automatic safe input"),// 安全输入手自动允许 + // 0, 0, 1, 0, 0, tr(""), tr(""), + // strAllow, 0, 0, index, operate)); + + // 循环工作允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 34, 0, 0, PARA_VALUE_TYPE_SW, + tr("Loop work allowed"),// 循环工作允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index, operate)); + + // 梭加油持续时长, 范围 0--S32_MAX,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, root)); + + + // 缝纫吹气时间,范围0-10,单位 s,默认0(0为持续吹气) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing air blowing time"),// 缝纫吹气时间 + 0, 0, 10, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index, operate)); + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 针梭勾线角度, 范围 0--36000,单位0.01度,默认 20200; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle-Hook Looping Angle"),//针梭勾线角度 + 20200, 0, 36000, 20200, 2, "°", tr(""), + tr(""), 0, 0, index, operate)); + + //u32 cutMovement; // 剪线移框调整, 1--1000, 单位0.01mm, 默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 51, 0, 0, PARA_VALUE_TYPE_INT, + tr("Cutting lines moving frames and adjusting"), + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), 0, 0, index, root)); + + //u32 xymvlSpd; // xy空走运行速度, 范围 1--2000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 52, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"), + 300, 1, 2000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, index, operate)); + + //u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 53, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 最小缝纫速度 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 63, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum sewing speed"),//最小缝纫速度 + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 最大缝纫速度 范围 1--3000,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 64, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum sewing speed"),//最大缝纫速度 + 100, 1, 3000, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 最小速度变化限制 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 65, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed variation limit"),//最小速度变化限制 + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫加速度 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 66, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing acceleration"),//缝纫加速度 + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index, operate)); + + // 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 67, 0, 0, PARA_VALUE_TYPE_INT, + tr("Continuous angle of sewing frame"),// 缝纫动框持续角度 + 15000, 0, 36000, 15000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0021, root)); + + // 夹面线装置, 0--1, 1启动 0关闭 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 68, 0, 0, PARA_VALUE_TYPE_SW, + tr("Clamping surface line device"),// 夹面线装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0021, operate)); +} + +//电机和控制动作 +void HighSingleQui::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 0; + // X向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX)); + // Y向移动电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY)); + // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor"),MT_LM)); + // 针电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Needle motor"),MT_LN)); + // 梭电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Shuttle motor"),MT_LH)); + // 升降电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Lifting motor"),MT_LU)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Lower scissors to cut thread"),OT_DCUT_THREAD,// 下剪刀剪线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,0x0008,tr("Buckle the bottom line"),OT_PUSH_BTRD,// 扣底线 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("oil"),OT_OIL,// 加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("headlamp"),OT_LIGHT,// 照明灯 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sewing machine head lifting"),OT_SEW_LIFT,// 缝纫机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_OPEN,-1,-1, + strDescend,true,OUTCONTROL_CLOSE,-1,-1)); + + // #define OT_CLIP_UTRD 0x0003 // 夹面线 打开 关闭 + // #define OT_CLIP_UTRD_OUT 0x0002 // 夹面线 伸出 收回 + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sandwich line ")+tr("Retractable"),OT_CLIP_UTRD_OUT,// 夹面线 伸出 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sandwich line ")+tr("Switch"),OT_CLIP_UTRD,// 夹面线 开关 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changing device grabbing"),OT_CHBOB_GRAB_OPEN,// 换梭装置抓取 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changer swing"),OT_CHBOB_SWAY_PUSH,// 换梭装置摆动 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + // m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Shuttle changer rotation"),OT_CHBOB_SPIN,// 换梭装置旋转 + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // "",false,-1,-1,-1, + // openStr,true,OUTCONTROL_OPEN,-1,-1, + // closeStr,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority,tr("Sewing Blow"),OT_SEW_BLOW,// 缝纫吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); +} + +//快捷功能 +void HighSingleQui::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackThread"),"buttonSetAnchorPoint",FUN_BACKTHREADPOINT));//回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S_Proof"),"buttonAutoParas",FUN_NEEDLESHUTTLERESET));//针梭校对 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackOffset"),"buttonQuantityMoveFrame",FUN_BACKOFFSETPOINT));//回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("BackZero"),"buttonAllToZero",FUN_BACKZEROPOINT));//回零点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NeedZeroPos"),"buttonSetStartPoint",FUN_NEDDLEZEROPOS));//对针零位 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ShutZeroPos"),"buttonSetAnchorPoint",FUN_SHUTTLEZEROPOS));//对梭零位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ThreadCut"),"buttonMunualThreadCutting",FUN_MANUAL_THREAD_CUTTING));//手动剪线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadLifting"),"buttonHeadLifting",FUN_HEAD_LIFTUPDOWN));//机头升降 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadUP"),"buttonHeadUP",FUN_HEAD_LIFTING));//机头上升 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("HeadDOWN"),"buttonHeadDOWN",FUN_HEAD_LOWERING));//机头下降 + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("NSReset"),"buttonNSReset",FUN_NS_RESET));//缝纫针梭复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Set Start Point"),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back Start Point"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 +} + +//辅助功能 +void HighSingleQui::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + m_allAssistList.append(makeAAssistItem(0,0x0015,tr("DebugInfo"),"buttonSpindleTest",ASSIST_DEBUGINFO));//调试信息 +} + +//花样设置 +void HighSingleQui::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 +} + +//参数分类(参数分组功能) +void HighSingleQui::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +//初始化传感器列表 +void HighSingleQui::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, strSecurityInput + " 1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + + m_tempSensorList.append(makeASensorItem(0x0040, 0, strSewingMachineHead + " 1" +" "+ strLiftingUpperLimit));//缝纫机头1升降上限位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, strLowerLiftingLimit + strSewingMachineHead + " 1"));//缝纫机头1升降下限位 + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing spindle needle") + " 1" + tr("parking space")));//缝纫主轴1针-停车位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Sewing shuttle") + " 1" + tr("parking space")));//缝纫旋梭1-停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, strSewingMachineHead + " 1" + tr("surface thread breakage inspection")));//缝纫机头1-面线断检 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERR_TENS_DEVICE 0x0203 // 张紧装置 异常 +#define ERRQUI_CHANGE_BOBBIN 0x000100F0 // 更换梭芯 + +//初始化错误代码和状态列表 +void HighSingleQui::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_BOBBIN,tr("replace the shuttle core")));// 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_TENS_DEVICE,tr("tensioning device")));// 张紧装置 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NONE,tr("freedom from error")));// 没有错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_POWER,tr("Not powered on")));// 没有上电 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_AIR,tr("Insufficient air pressure")));// 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_SAFE,tr("Safe Area Intervention")));// 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FILL_DATA,tr("Filling data error")));// 填充数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NOT_ALLOWED,tr("Working status not allowed")));// 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CTRL_ERR,tr("control error")));// 控制错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_ERR,tr("Motion control chip version error")));// 运动控制芯片版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BUTTON_NOUP,tr("Waiting for button to lift timeout")));// 等待按钮抬起超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FPGA_RESET,tr("FPGA reset error")));// FPGA复位错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_READY,tr("Peripheral not ready")));// 外设未就绪 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_SEND_ERR,tr("Transmission data error")));// 传输数据错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDTION_ERR,tr("Program version error")));// 程序版本错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_WORK_DONE,tr("Production completed")));// 完成产量 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_POSITIVE,strForwardLimit));// 正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LMT_NEGATIVE,strReverseLimit));// 反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_ALM,tr("Motion alarm")));// 运动报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_LIMIT,tr("Motion limit")));// 运动限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RUN_EMS,tr("Exercise emergency stop")));// 运动急停 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MV_PARA,tr("Motion parameter error")));// 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MC_PARA,tr("Machine parameter error")));// 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_IN_PARA,tr("Input parameter error")));// 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NORMAL,tr("The file is correct")));// 文件正确 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_WAIT,tr("Waiting for files")));// 等待文件 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_RIGHT,tr("Zero successfully")));// 归零成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MTZ_ERROR,tr("Zero error")));// 归零错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_COOR_SYSTM,tr("Coordinate system error")));// 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DATA_ERROR,tr("data error"))); // 数据错误 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_MS_NOT_SYNC,tr("Needle shuttle out of sync"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_RO_NOT_SYNC,tr("Rotation out of sync"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CUTTER_NOT_POS,tr("The scissors are not returning to their original position"))); // 剪刀不在回位(注:该报错码是缝纫剪刀) + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_HEAD_NOT_LOW,tr("Machine head not in low position"))); // 机头不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIGHTCURTAINS,tr("Infrared curtain intervention"))); // 红外介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_BOBBIN_TBREAK,tr("Bottom line disconnection"))); // 底线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_ERR,tr("Shuttle Change Device Alarm"))); // 换梭装置报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CHANGE_SHUTDISK,tr("Replace Shuttle Disk"))); // 更换梭盘 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_FEED_ROLLER,tr("Abnormal feeding pressure roller"))); // 进料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_ROLLER,tr("Abnormal discharge pressure roller"))); // 出料压辊 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_DIS_MATERIAL,tr("Abnormal discharge and pressing"))); // 出料压料 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_TENS_DEVICE,tr("Tensioning device abnormal"))); // 张紧装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CLOTH_DEVICE,tr("Abnormal cloth clamping device"))); // 夹布装置 异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_EDGE_MOTOR,tr("Edge cutting motor blocked"))); // 边切电机 阻塞 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERRQUI_CROSS_MOTOR,tr("Cross cutting motor abnormality"))); // 横切电机 异常 + + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"X " + strForwardLimit)); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"X " + strReverseLimit)); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"Y " + strForwardLimit)); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"Y " + strReverseLimit)); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_SAFE,tr("Safe Area Intervention"))); // 安全区域介入 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_AIR_POWER,tr("Insufficient air pressure"))); // 气压不足 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UPER_TBREAK,tr("Broken surface thread"))); // 面线断线 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHANGE_BOBBIN,tr("Replacing the shuttle core"))); // 更换梭芯 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NO_DATA,tr("No Data"))); // 无数据 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,tr("The machine head is not in a safe area"))); // 机头不在安全区域 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_ALLOWED,tr("Working status not allowed"))); // 不允许工作状态 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NOT_AT_POS,tr("Template not in place"))); // 模版不到位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_EXPIRATION,tr("The usage deadline has expired"))); // 使用时限已到 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,tr("Input parameter error"))); // 输入参数错误 + QString str = tr("The scissors are not returning to their original position");//剪刀不在回位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HD1_CUTTER_NOT_POS, str + QString::number(1))); + +} + diff --git a/mctype/patternsingleboard/function/highsinglequilting.h b/mctype/patternsingleboard/function/highsinglequilting.h new file mode 100644 index 0000000..f304e43 --- /dev/null +++ b/mctype/patternsingleboard/function/highsinglequilting.h @@ -0,0 +1,35 @@ +#ifndef HIGHSINGLEQUI +#define HIGHSINGLEQUI + +#include "mctype/machinetypefun.h" + + +//高速单针绗缝机 +class HighSingleQui : public MachineTypeFun +{ + Q_OBJECT +public: + HighSingleQui(); + ~HighSingleQui(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; +#endif // HIGHSINGLEQUI diff --git a/mctype/patternsingleboard/function/l2000multimac.cpp b/mctype/patternsingleboard/function/l2000multimac.cpp new file mode 100644 index 0000000..65f86ef --- /dev/null +++ b/mctype/patternsingleboard/function/l2000multimac.cpp @@ -0,0 +1,803 @@ +#include "l2000multimac.h" + +L2000MultiMac::L2000MultiMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void L2000MultiMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_ALLTOZERO,"buttonFrameZero")); + m_nineBtn.insert(2,NineItem(FUN_SPINDLETEST,"buttonSetStartPoint")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void L2000MultiMac::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 1, U16_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 1, U16_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-等比缩放 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_QUI, + SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, + tr("Equal ratio"),//等比缩放 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +#if(0) + //花样参数-花样设置参数-加固方式;单位:无 ,范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINMODE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Reinforcement method"),//加固方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr("Tight locking:0;Reinforced locking:1"),//密针锁针:0;加固锁针:1 + 0, 0,index++, operate)); + + //花样参数-花样设置参数-加固针数;单位:针 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement needles"),//加固针数 + 2, 0, 10, 2, 0, tr("pin"), tr(""),//针 + tr(""), 0, 0,index++, operate)); + + //花样参数-花样设置参数-加固次数;单位:次 ,范围0-10,默认2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_REINNUM, 0, 0, PARA_VALUE_TYPE_INT, + tr("Reinforcement frequency"),//加固次数 + 2, 0, 10, 2, 0, tr(""), tr(""), + tr(""), 0, 0,index++, operate)); +#endif + + //花样参数-花样设置参数-罗拉补偿X偏移为正;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the positive X offset"),//罗拉补偿X偏移为正 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为负;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXNEG, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the negative X offset"),//罗拉补偿X偏移为负 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为0;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXZERO, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the X offset of 0"),//罗拉补偿X偏移为0 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +#if(1) + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + //花样参数-花样设置参数-角度修正x正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x positive"),//角度修正x正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正x负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction x negative"),//角度修正x负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y正;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRPOSY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y positive"),//角度修正y正 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正y负;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORRNEGY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction y negative"),//角度修正y负 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + //花样参数--------------------------- +} + +void L2000MultiMac::initMcParasList() +{ + + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + QTextCodec *cod = QTextCodec::codecForLocale(); + //0 + int maxSpeed = g_pSettings->readFromIniFile("MaxSpeedOfMainSewWork").toInt(); + if(maxSpeed <= 0) + { + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认 2000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing working speed"), + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, index++, operate)); + } + else + { + // 主轴缝纫工作转速, 范围 1--maxSpeed,单位r/min,默认 2000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing working speed"), + 2000, 1, maxSpeed, 2000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, index++, operate)); + } + + //安全装置配置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + //气压装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Pneumatic device"),//气压装置 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr("Normal open:0;Normal closed:1"), + 0, 0, index++, root)); + + //上电装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Power-on device"),//上电装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + + //红外装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 4, 0, PARA_VALUE_TYPE_LIST, + tr("Infrared curtain device"),//红外装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + //安全门装置, 范围0-1,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 1, 5, 0, PARA_VALUE_TYPE_LIST, + tr("Safety door device"),//安全门装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + strClosedOpen, + 0, 0, index++, root)); + + // 缝纫动框方式, 位图 + // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 1, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing frame movement method"),// 缝纫动框方式 + 0, 0, 1, 0, 0, tr(""), tr(""), + strContinuous, 0, 0, index++, root));//连续:0;间歇式:1 + + // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 2, 2, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing acceleration and deceleration mode"),// 缝纫加减速方式 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAcceleration, //无加速或减速:0;Xy正弦加速度和减速度:1 + 1, 1, index++, root)); + + // 起针动作允许; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许;// 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 3, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for needle starting and thread loosening"),// 起针松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数, 默认3 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Number of broken wires"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needles"), tr(""),//针 + tr(""), 0, 0, index++, operate)); + + + // 换梭芯提醒功能, 0, 不启用该功能; 1 按长度提醒; 默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 7, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Change bobbin Reminder function"),// 换梭芯提醒功能 + 0, 0, 2, 0, 0, tr(""), tr(""), + strImmediatelyReminder2, 0, 0, index++, operate)); + + // 底线长度, 单位 0.01mm,默认 10000000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bottom line length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, index++, operate)); + + //10 + // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 10, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""),//不加油:0;按工作时间间断加油:1;按工作针数间歇加油:2;持续加油:3 + strPersistentrefueling, 0, 0, index++, operate)); + + // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling needles interval"),// 加油针数间隔 + 10000, S32_MIN, S32_MAX, 10000, 0, tr("Needles"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 针加油持续时长, 单位秒, // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Needle refueling duratio "),// 针加油持续时长 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 1, 1, index++, operate)); + + // 梭加油持续时长, 单位秒, (针梭独立加油时有效) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Shuttle refueling duration"),// 梭加油持续时长 + 0, 0, S32_MAX, 0, 0, tr("s"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 缝纫时动作允许, 0, 不允许; 1, 允许; + // bit0 吹气允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 14, 1, 0, PARA_VALUE_TYPE_SW, + tr("Blow air during sewing"),// 缝纫时吹气 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, index++, operate)); + + + //15 + // 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; + // bit0, 松线允许; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 15, 1, 0, PARA_VALUE_TYPE_SW, + tr("Moving basket Loose line"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // 主轴拐角转速, 范围 1--3000,单位r/min,默认 1000 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),// 主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + + // 降速最小偏差角度,单位度,范围0--180,默认 180 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Minimum speed deviation angle"),// 降速最小偏差角度 + 180, 0, 180, 180, 0, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 开机动作; + //BIT0:1:开机自动找零, 0:开机不自动找零 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 19, 1, 0, PARA_VALUE_TYPE_SW, + tr("Auto Zero after power on"),// 开机自动归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + + //20 + // 缝纫降速模式:0:自动降速,1参数降速,2不降速 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 20, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed reduction mode"),// 缝纫降速模式 + 0, 0, 2, 0, 0, tr(""), tr(""), + strSlowDownMode, 0, 0, index++, root));//0:自动降速,1参数降速,2不降速 + + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 红外; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input infrared curtain allows"),// 安全输入红外允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + // bit1, 气压; // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + //strAllow, 0, 0, 0x0127, operate)); + tr(""), 0, 0, index++, root)); + // bit2, 上电信号; // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 3, 0, PARA_VALUE_TYPE_LIST, + tr("Safe input power-on signal allowed"),// 安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, root)); + + // bit4, 安全门 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 5, 0, PARA_VALUE_TYPE_SW, + tr("Safe input emergency door allowed"),// 安全输入安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, root)); + + // bit5 手自动按钮 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 21, 6, 0, PARA_VALUE_TYPE_LIST, + tr("Manual and automatic safe input"),// 安全输入手自动允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow, 0, 0, index++, root)); + + + // 缝纫吹气,范围0-1,默认0(0为持续吹气) // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 23, 0, 0, PARA_VALUE_TYPE_SW, + tr("Sewing air blowing"),// 缝纫吹气 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 24, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of the sewing frame movement"),// 缝纫动框起始角度 + 28000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, root)); + + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 // 超级用户 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 工作机头选择 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 1, 0, PARA_VALUE_TYPE_INT, + tr("Work head selection") + " " + tr("up"),//工作头选择 上 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow, 0, 0, index++, operate)); + + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 30, 2, 0, PARA_VALUE_TYPE_INT, + tr("Work head selection") + " " + tr("down"),//工作头选择 下 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow, 0, 0, index++, operate)); + // 加油时间间隔, 范围 1--S32_MAX,默认 1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 31, 0, 0, PARA_VALUE_TYPE_INT, + tr("Refueling time interval"),// 加油时间间隔 + 1, 1, S32_MAX, 1, 0, tr("s"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 缝纫动框持续角度, 0--36000, 单位 0.01度,默认 15000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 32, 0, 0, PARA_VALUE_TYPE_INT, + tr("Continuous angle of sewing frame"),// 缝纫动框持续角度 + 15000, 0, 36000, 15000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0021, root)); + + // 缝纫启动停止转速, 范围 1--500,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 33, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing start stop speed"),// 缝纫启动停止转速 + 100, 1, 500, 100, 0, tr("r/min"), tr(""), + tr(""),0, 0, 0x0021, root)); + + // 缝纫提速加速度 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 34, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing speed up acceleration"),// 缝纫提速加速度 + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""),0, 0, 0x0021, root)); + + // 缝纫刹车加速度 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 35, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing brake acceleration"),// 缝纫刹车加速度 + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""),0, 0, 0x0021, root)); + + // 编码器辊周长 范围1~100000 范围0.01mm 30000 (30cm) + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 36, 0, 0, PARA_VALUE_TYPE_INT, + tr("Encoder roller circumference"),// 编码器辊周长 + 30000, 1, 100000, 30000, 2, tr("cm"), tr(""), + tr(""),0, 0, 0x0021, root)); + + // 缝纫速度来源 0:参数 1:编码器 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 37, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Sewing speed source"),// 缝纫速度来源 + 0, 0, 1, 0, 0, tr(""), tr(""), + strSewSource,0, 0, 0x0021, root));//0:参数 1:编码器 + + // 采集编码器时间间隔 范围1~5000 单位 毫秒ms + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 38, 0, 0, PARA_VALUE_TYPE_INT, + tr("Collect the time interval of encoder"),// 采集编码器时间间隔 + 2000, 1, 5000, 2000, 0, tr("ms"), tr(""), + tr(""),0, 0, 0x0021, operate)); + + // 暂停按钮延时时间 范围0~10 单位 秒s + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 39, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pause button delay time"),// 暂停按钮延时时间 + 0, 0, 10, 0, 0, tr("s"), tr(""), + tr(""),0, 0, 0x0021, operate)); + + // 启动按钮延时时间 范围0~10 单位 秒s + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start button delay time"),// 启动按钮延时时间 + 0, 0, 10, 0, 0, tr("s"), tr(""), + tr(""),0, 0, 0x0021, operate)); +} + +void L2000MultiMac::initWkParasList() +{ + +} + +#define OT_LOOSE_THREAD 0x0001 // 松紧线 打开 关闭 +#define OT_OIL_ 0x0003 // 加油 打开 关闭 +#define OT_UP_NEEDLE_OIL 0x0005 // 上针加油 +#define OT_UP_HOOK_OIL 0x0006 // 上梭加油 +#define OT_DW_NEEDLE_OIL 0x0007 // 下针加油 +#define OT_DW_HOOK_OIL 0x0008 // 下梭加油 +#define OT_DW_PUSH_CLOTH 0x0009 // 下压布气缸 + +#define MT_LX 0x0001 // X向移动电机 正反转 +#define MT_LY 0x0002 // Y向移动电机 正反转 +#define MT_LM 0x0003 // 主轴1电机 找零正反转 +#define MT_LM2_ 0x0004 // 主轴2电机 找零正反转 +#define MT_LMA 0x0005 // 所有主轴电机 找零正反转 + + +void L2000MultiMac::initOutCtrlList() +{ + int showPriority = 0; + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD));//松紧线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Add oil"),OT_OIL_));//加油 打开 关闭 + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Inject oil onto the needle"),OT_UP_NEEDLE_OIL));// 上针加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Add fuel to the shuttle"),OT_UP_HOOK_OIL));// 上梭加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Inject and refuel"),OT_DW_NEEDLE_OIL));// 下针加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Get off the shuttle and refuel"),OT_DW_HOOK_OIL));// 下梭加油 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Lower pressure cloth cylinder"),OT_DW_PUSH_CLOTH));// 下压布气缸 + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Move motor") + "X",MT_LX,//移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Move motor") + "Y",MT_LY,//移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "1",MT_LM)); // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Spindle motor") + "2",MT_LM2_)); // 主轴电机 + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("All spindle motors"),MT_LMA));// 所有主轴电机 + +} + +void L2000MultiMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllMain ShaftRun"),"buttonSetStartPoint",FUN_SPINDLETEST));// 所有主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Process Reset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 +} + +void L2000MultiMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 + //m_allPatternSetList.append(makeAPatternSetItem(0,0x0007,tr("Edit"),"buttonPatternEdit",PATTERNSET_PATTERNEDIT));//花样编辑 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0008,tr("NeedlePre"),"buttonNeedlePreview",PATTERNSET_NEEDLEPREVIEW));//排针预览 + //m_allPatternSetList.append(makeAPatternSetItem(0,0x0009,tr("LineGener"),"buttonLineGener",PATTERNSET_LINEGENER));//线迹生成 +} + +void L2000MultiMac::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,QObject::tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,QObject::tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,QObject::tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,QObject::tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,QObject::tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,QObject::tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,QObject::tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,QObject::tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,QObject::tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,QObject::tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,QObject::tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,QObject::tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,QObject::tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +} + + +#define DSS3_HS_UZ1_POS 0x0080 // + //DSS_BIT1 (上主轴电机零位) + //DSS_BIT2 (下主轴电机零位) + +#define DSS2_F1_NLIMT_POS 0x0022 + //DSS_BIT1 X限位- + +#define DSS2_F1_PLIMT_POS 0x0023 // + //DSS_BIT1 X限位+ + +#define DSS1_B_START_BT 0x0000 // + //DSS_BIT1 启动按钮 + +#define DSS1_B_PAUSE_BT 0x0001 // + //DSS_BIT1 暂停按钮( + +#define DSS1_B_AIR_TEST 0x0007 // + //DSS_BIT1 气压保护 + +#define DSS1_B_BASE_TEST 0x0010 // + //DSS_BIT1 加电信号 + +#define DSS1_B_SAFE_TEST 0x0008 + //DSS_BIT1 红外1 + //DSS_BIT2 红外2 + +#define DSS5_ST1_BKU1 0x0170 + //DSS_BIT1 上排断线检测 + //DSS_BIT2 下排断线检测 + + +#define DSS6_ADDR_02B2 0x02B2 // + // BIT1 : 红外1 + // BIT2 红外2 + // BIT6 : 上气按钮 + // BIT7 : 储料架下限位 + +void L2000MultiMac::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(DSS3_HS_UZ1_POS, 0, tr("Zero position of upper spindle motor")));//(上主轴电机零位) + m_tempSensorList.append(makeASensorItem(DSS3_HS_UZ1_POS, 1, tr("Lower spindle motor zero position")));//(下主轴电机零位) + m_tempSensorList.append(makeASensorItem(DSS2_F1_NLIMT_POS, 0, tr("X limit") + "-"));//(X限位-) + m_tempSensorList.append(makeASensorItem(DSS2_F1_PLIMT_POS, 0, tr("X limit") + "+"));//(X限位+) + + m_tempSensorList.append(makeASensorItem(DSS1_B_START_BT, 0, tr("Start botton")));//(启动按钮) + m_tempSensorList.append(makeASensorItem(DSS1_B_PAUSE_BT, 0, tr("Pause botton")));//(暂停按钮) + m_tempSensorList.append(makeASensorItem(DSS1_B_AIR_TEST, 0, tr("Air pressure protection")));//(气压保护) + m_tempSensorList.append(makeASensorItem(DSS1_B_BASE_TEST, 0, tr("Power on signal")));//(加电信号) + m_tempSensorList.append(makeASensorItem(DSS1_B_SAFE_TEST, 0, tr("infrared curtain") + "1"));//红外1 + m_tempSensorList.append(makeASensorItem(DSS1_B_SAFE_TEST, 1, tr("infrared curtain") + "2"));//红外2 + + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 0, tr("Upper line breakage detection")));//上排断线检测 + m_tempSensorList.append(makeASensorItem(DSS5_ST1_BKU1, 1, tr("Bottom line disconnection detection")));//下排断线检测 + + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B2, 5, tr("Gas button")));//上气按钮 + m_tempSensorList.append(makeASensorItem(DSS6_ADDR_02B2, 6, tr("Lower limit of storage rack")));//储料架下限位 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +void L2000MultiMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); +} + diff --git a/mctype/patternsingleboard/function/l2000multimac.h b/mctype/patternsingleboard/function/l2000multimac.h new file mode 100644 index 0000000..dd3d7f2 --- /dev/null +++ b/mctype/patternsingleboard/function/l2000multimac.h @@ -0,0 +1,33 @@ +#ifndef L2000MULTIMAC_H +#define L2000MULTIMAC_H + + +#include "mctype/machinetypefun.h" + +/// +/// \brief The L2000MultiMac class +/// L2000多针机-多头旋梭 +/// +class L2000MultiMac : public MachineTypeFun +{ + Q_OBJECT +public: + L2000MultiMac(); + +public: + void initNinebtn1234(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initPatternSetList();//花样设置 + virtual void initAssistList(); +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 +}; + +#endif // L2000MULTIMAC_H diff --git a/mctype/patternsingleboard/function/multineedlerotary.cpp b/mctype/patternsingleboard/function/multineedlerotary.cpp new file mode 100644 index 0000000..0df413a --- /dev/null +++ b/mctype/patternsingleboard/function/multineedlerotary.cpp @@ -0,0 +1,341 @@ +#include "multineedlerotary.h" + +MultiNeedleRotary::MultiNeedleRotary() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +MultiNeedleRotary::~MultiNeedleRotary() +{ + +} + +void MultiNeedleRotary::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTING,"buttonHeadLifting")); + m_nineBtn.insert(2,NineItem(FUN_FORWARDORBACK,"buttonForwardOrBack")); + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void MultiNeedleRotary::initPatternsParasList() +{ + +} + +void MultiNeedleRotary::initMcParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + +} + +void MultiNeedleRotary::initWkParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--500,单位r/min,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing main shaft working speed"),// 主轴缝纫工作转速 + 2000, 1, 3600, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 主轴归零转速, 范围 1--3000,单位r/min,默认 120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Main shaft zero reset speed"),//主轴归零转速 + 120, 1, 3000, 120, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 主轴运转转速, 范围 1--3000,单位r/min,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 111, 0, 0, PARA_VALUE_TYPE_INT, + tr("Main shaft running speed"),//主轴运转转速 + 120, 1, 3000, 120, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy归零运行速度, 范围 1--500,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 101, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY zero reset speed"),//xy归零运行速度 + 100, 1, 500, 100, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy空走运行速度, 范围 1--1700,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 102, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY zero reset speed"),//xy空走运行速度 + 300, 1, 1700, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度1, 范围 1--1000,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 105, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 1"),//xy手动移动速度1 + 10, 1, 1000, 10, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度2, 范围 1--1000,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 106, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 2"),//xy手动移动速度2 + 100, 1, 1000, 100, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度3, 范围 1--1000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 107, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 3"),//xy手动移动速度3 + 300, 1, 1000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 工作机头选择 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 100, 1, 0, PARA_VALUE_TYPE_INT, + tr("Work head selection") + " " + "1",//工作头选择1 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0001, operate)); + + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 100, 2, 0, PARA_VALUE_TYPE_INT, + tr("Work head selection") + " " + "2",//工作头选择2 + 1, 0, 1, 1, 0, tr(""), tr(""), + strAllow, 0, 0, 0x0001, operate)); + + // 产量预设 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("No. of stitch detect if thread broken"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needle"), tr(""),//针 + tr(""), 0, 0, 0x0001, operate)); + + // 底线长度, 单位 0.01mm,默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin thread length"),// 底线长度 + 10000000, 0, S32_MAX, 10000000, 2, tr("mm"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("No. of stitch detect if thread broken"),// 断线检测针数 + 3, 0, 10, 3, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0002, operate)); + + // 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 16, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Bobbin change reminder function"),//换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), + //0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + tr("Not enabled:0;Delay reminder by length:1;Count by number of slices:2;Immediately reminder by length:3"), 0, 0, 0x0012, operate)); + + // 底线长度, 单位 0.01mm,默认 10000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Bobbin thread length"),// 底线长度 + 10000000, 1, 10000000, 10000000, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0013, operate)); + + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 光幕; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 101, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input light curtain allows"),//安全输入光幕允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + + // bit1, 气压; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 101, 2, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),//安全输入气压允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + + // bit2, 上电信号; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 101, 3, 0, PARA_VALUE_TYPE_SW, + tr("Safe input power-on signal allowed"),//安全输入上电信号允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + + // bit4, 安全门 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 101, 4, 0, PARA_VALUE_TYPE_SW, + tr("Safe door allowed"),//安全门允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); + +} + +void MultiNeedleRotary::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority = 1; + + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("X to move motor"),MT_LX));// X向移动电机(归零,正转,反转) + m_allOutCtrlList.append(creatZeroForRevItem(0,showPriority++,tr("Y to move motor"),MT_LY));// Y向移动电机(归零,正转,反转) + + + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All spindle zero positions"),MT_ALLZ)); // 所有主轴 零位 (归零) + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All Spindle Hook Lines positions"),MT_ALLG)); // 所有主轴 勾线 (归零) + m_allOutCtrlList.append(creatZeroItem(0,showPriority++,tr("All spindle jogs positions"),MT_ALLM)); // 所有主轴 点动 (归零) + + +} + +void MultiNeedleRotary::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1;; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("All_Zero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllSpleZero"),"buttonAllToZero",FUN_MT_ALLZ));//所有主轴零位 + +} + +void MultiNeedleRotary::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("Setting"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorize"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 +} + +void MultiNeedleRotary::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 + +} + +void MultiNeedleRotary::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 + +} + +void MultiNeedleRotary::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0002, 0, tr("Jog button 1")));//点动按钮1 + m_tempSensorList.append(makeASensorItem(0x0003, 0, tr("Open frame button 1")));//开框按钮1 + +} + +void MultiNeedleRotary::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + +} + diff --git a/mctype/patternsingleboard/function/multineedlerotary.h b/mctype/patternsingleboard/function/multineedlerotary.h new file mode 100644 index 0000000..731e58d --- /dev/null +++ b/mctype/patternsingleboard/function/multineedlerotary.h @@ -0,0 +1,37 @@ +#ifndef MULTINEEDLEROTARY_H +#define MULTINEEDLEROTARY_H + +#include "mctype/machinetypefun.h" + +/** + * @brief 双排多针旋梭机 + */ +class MultiNeedleRotary : public MachineTypeFun +{ + Q_OBJECT +public: + MultiNeedleRotary(); + ~MultiNeedleRotary(); + +public: + void initNinebtn1234(); //九宫格 + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // MULTINEEDLEROTARY_H diff --git a/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.cpp b/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.cpp new file mode 100644 index 0000000..037ad58 --- /dev/null +++ b/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.cpp @@ -0,0 +1,190 @@ +#include "pkgfoursidedtestboardmac.h" + +PkgFourSidedTestBoardMac::PkgFourSidedTestBoardMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 +// initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + +// //初始化传感器列表 +// initSensorList(); + +// //初始化错误代码和状态列表 +// initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void PkgFourSidedTestBoardMac::initPatternsParasList() +{ + +} + +void PkgFourSidedTestBoardMac::initMcParasList() +{ + +} + +void PkgFourSidedTestBoardMac::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; + //u32 msrstspRpm; // 主轴启动停止转速, 范围 1--300,单位r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 主轴缝纫工作转速, 范围 1--3000,单位r/min,默认2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 1, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle sewing operating speed"),// 主轴缝纫工作转速 + 2000, 1, 3000, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + + // 主轴剪线转速, 范围 1--500,单位r/min,默认 120u32 // beifen4; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 2, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),//主轴剪线转速 + 120, 1, 500, 36000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 剪线分线角度,0--36000, 单位 0.01度,默认 20000 // beifen1; // 备用1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 3, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread separation angle during trimming"),// 剪线分线角度 + 20000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 // beifen2; // 备用2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 4, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 主轴停车传感器角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 5, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),// 主轴停车传感器角度 + 6000, 0, 36000, 36000, 2, cod->toUnicode("°"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 剪线气缸延迟,1--100000, 单位 毫秒,默认 10 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 6, 0, 0, PARA_VALUE_TYPE_INT, + tr("Wire cutting cylinder delay"),// 剪线气缸延迟 + 10, 1, 100000, 10, 0, tr("ms"), tr(""), + tr(""), 0, 0, index++, operate)); + // 拨线气缸延迟,1--100000, 单位 毫秒,默认 10 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 7, 0, 0, PARA_VALUE_TYPE_INT, + tr("Delay of wire cylinder"),// 拨线气缸延迟 + 10, 1, 100000, 10, 0, tr("ms"), tr(""), + tr(""), 0, 0, index++, operate)); + + // 递增转速, 1--1000, 单位 转,默认 1 // 参数设定 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 8, 0, 0, PARA_VALUE_TYPE_INT, + tr("Increasing rotational speed"),// 递增转速 + 1, 1, 1000, 1, 0, tr("ms"), tr(""), + tr(""), 0, 0, index++, operate)); + + // bit0, 松线允许; + // 剪线时松线允许, 范围 0--1,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_ACTION, + 9, 1, 0, PARA_VALUE_TYPE_SW, + tr("Thread loosening allowed during thread trimming"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, index++, operate)); + +} + +#define MT_MM1 0x0001 // 主轴1电机 +#define MT_MM2 0x0002 // 主轴2电机 + +void PkgFourSidedTestBoardMac::initOutCtrlList() +{ + int showPriority = 0; + + // 主轴电机 + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor") + "1", MT_MM1,//主轴电机1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor") + "2", MT_MM2,//主轴电机2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Elastic thread"),0x0001,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strRelease,true,OUTCONTROL_OPEN,-1,-1, + strTighten,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Lower scissors to cut thread"),0x0002));//下剪刀剪线 打开 关闭 + m_allOutCtrlList.append(creatOpenCloseItem(0,showPriority++,tr("Wire pulling"),0x0003));//拨线 打开 关闭 + m_allOutCtrlList.append(creatAscDscItem(0,showPriority++,tr("Presser foot"),0x0004));//压脚 上升 下降 + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Manual wire cutting"), 0x0005,//手动剪线 打开 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1)); + +} diff --git a/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h b/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h new file mode 100644 index 0000000..5d6da6c --- /dev/null +++ b/mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h @@ -0,0 +1,26 @@ +#ifndef PKGFOURSIDEDTESTBOARDMAC_H +#define PKGFOURSIDEDTESTBOARDMAC_H + +#include "mctype/machinetypefun.h" + +class PkgFourSidedTestBoardMac : public MachineTypeFun +{ + Q_OBJECT +public: + PkgFourSidedTestBoardMac(); + +public: + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + +private: +}; + +#endif // PKGFOURSIDEDTESTBOARDMAC_H diff --git a/mctype/patternsingleboard/function/singlemutilneedlemac.cpp b/mctype/patternsingleboard/function/singlemutilneedlemac.cpp new file mode 100644 index 0000000..db4fe33 --- /dev/null +++ b/mctype/patternsingleboard/function/singlemutilneedlemac.cpp @@ -0,0 +1,490 @@ +#include "singlemutilneedlemac.h" + +SingleMutilNeedleMac::SingleMutilNeedleMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +void SingleMutilNeedleMac::initPatternsParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 + //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Width"),//宽度 + 5000, 0, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Height"),//高度 + 5000, 0, S32_MAX, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +#if(0) + //花样参数-花样设置参数-罗拉补偿;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensation"),//罗拉补偿 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); +#endif + + //花样参数-花样设置参数-罗拉补偿X偏移为正;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMP, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the positive X offset"),//罗拉补偿X偏移为正 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为负;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXNEG, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the negative X offset"),//罗拉补偿X偏移为负 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-罗拉补偿X偏移为0;单位:0.1毫米 ,范围-128-128,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_LOLACOMPXZERO, 0, 0, PARA_VALUE_TYPE_INT, + tr("Lola compensates for the X offset of 0"),//罗拉补偿X偏移为0 + 0, -128, 128, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + + //花样参数-花样设置参数-角度修正量;单位:毫米 ,范围0-200,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_ANGLECORROFFSET, 0, 0, PARA_VALUE_TYPE_INT, + tr("Angle correction offset"),//角度修正量 + 0, 0, 100, 0, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +} + +void SingleMutilNeedleMac::initMcParasList() +{ + //QTextCodec *cod = QTextCodec::codecForLocale(); + + // xy空走运行速度, 范围 1--1700,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 102, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"),//xy空走运行速度 + 300, 1, 1700, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度1, 范围 1--1000,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 105, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 1"),//xy手动移动速度1 + 10, 1, 1000, 10, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度2, 范围 1--1000,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 106, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 2"),//xy手动移动速度2 + 100, 1, 1000, 100, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // xy手动移动速度3, 范围 1--1000,单位mm/s,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 107, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 3"),//xy手动移动速度3 + 300, 1, 1000, 300, 0, tr("mm/s"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 主轴归零转速, 范围 1--3000,单位r/min,默认 120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 110, 0, 0, PARA_VALUE_TYPE_INT, + tr("Main shaft zero reset speed"),//主轴归零转速 + 120, 1, 3000, 120, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 主轴运转转速, 范围 1--3000,单位r/min,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 111, 0, 0, PARA_VALUE_TYPE_INT, + tr("Main shaft running speed"),//主轴运转转速 + 300, 1, 3000, 300, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); +} + +void SingleMutilNeedleMac::initWkParasList() +{ + // QTextCodec *cod = QTextCodec::codecForLocale(); + + // 主轴缝纫工作转速, 范围 1--500,单位r/min,默认 300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 0, 0, 0, PARA_VALUE_TYPE_INT, + tr("Sewing main shaft working speed"),// 主轴缝纫工作转速 + 2000, 1, 3600, 2000, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 起针动作松线允许, 范围 0--1, 默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 9, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Needle loosening action is allowed"),// 起针动作松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + strAllow,//允许 + 0, 0, 0x0001, operate)); + + // 产量预设 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 33, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数,默认3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("No. of stitch detect if thread broken"),// 断线检测针数 + 3, 0, 10, 3, 0, tr("Needle"), tr(""),//针 + tr(""), 0, 0, 0x0001, operate)); + + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + // bit0, 光幕; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 101, 1, 0, PARA_VALUE_TYPE_SW, + tr("Secure input light curtain allows"),//安全输入光幕允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0010, operate)); +} + + +#define OT_UP_NEEDLE_OIL 0x0096 // 上针加油 // 多针旋梭机 +#define OT_DW_NEEDLE_OIL 0x0098 // 下针加油 +#define OT_UP_HOOK_OIL 0x0097 // 上梭加油 +#define OT_DW_HOOK_OIL 0x0099 // 下梭加油 +#define OT_DW_PUSH_CLOTH 0x009A // 下压布气缸电磁阀 +#define OT_DW_ONEKEY_OIL 0x009B // 一键加油 +#define OT_SEW_BLOW 0x0010 // 缝纫吹气 +#define MT_SPREAD 0x0062 // 展布电机-转动 + +#define OT_UP_NEEDLE_OIL1 0x0074 // 上针加油1 +#define OT_UP_HOOK_OIL1 0x0075 // 上梭加油1 + +#define OT_UP_NEEDLE_OIL2 0x0076 // 上针加油2 +#define OT_UP_HOOK_OIL2 0x0077 // 上梭加油2 + +#define OT_DW_NEEDLE_OIL1 0x0078 // 下针加油1 +#define OT_DW_HOOK_OIL1 0x0079 // 下梭加油1 + +#define OT_DW_NEEDLE_OIL2 0x007A// 下针加油2 +#define OT_DW_HOOK_OIL2 0x007B // 下梭加油2 + + +void SingleMutilNeedleMac::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + + int showPriority = 0; + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("X to move motor"),MT_LX,// X向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Y to move motor"),MT_LY,// Y向移动电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor 1"),MT_LM,// 主轴电机1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor 2"),MT_LM2,// 主轴电机2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Display motor"),MT_SPREAD,// 展布电机-转动 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strZero,true,OUTCONTROL_ZERO,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Elastic thread"),OT_LOOSE_THREAD,// 松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower pressure cloth cylinder"),OT_DW_PUSH_CLOTH,// 下压布气缸 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject oil onto the needle"),OT_UP_NEEDLE_OIL,// 上针加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject and refuel"),OT_DW_NEEDLE_OIL,// 下针加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Add fuel to the shuttle"),OT_UP_HOOK_OIL,// 上梭加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Get off the shuttle and refuel"),OT_DW_HOOK_OIL,// 下梭加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sewing and blowing air"),OT_SEW_BLOW,// 缝纫吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject oil on needle") + "1",OT_UP_NEEDLE_OIL1,// 上针加油1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject oil on needle") + "2",OT_UP_NEEDLE_OIL2,// 上针加油2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Add fuel to the shuttle")+"1",OT_UP_HOOK_OIL1,// 上梭加油1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Add fuel to the shuttle")+"2",OT_UP_HOOK_OIL2,// 上梭加油2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject and refuel") + "1",OT_DW_NEEDLE_OIL1,// 下针加油1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Inject and refuel") + "2",OT_DW_NEEDLE_OIL2,// 下针加油2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Get off the shuttle and refuel")+"1",OT_DW_HOOK_OIL1,// 下梭加油1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Get off the shuttle and refuel")+"2",OT_DW_HOOK_OIL2,// 下梭加油2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + +} + +void SingleMutilNeedleMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1;; + //m_allShortCutList.append(makeAShortCutItem(0,index++,tr("All_Zero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Front_Back"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SpindleZero"),"buttonAllToZero",FUN_MT_ALLZ));//主轴电机归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("StartWork"),"buttonStartWork",FUN_STARTWORK));//启动工作 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("PauseWork"),"buttonPauseWork",FUN_PAUSEWORK));//暂停 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("OutputReset"),"buttonFrameZero",FUN_OUTPUTRESET));//产量清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Hook"),"buttonHookPos",FUN_HOOKPOS));//主轴去勾线位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Park"),"buttonParkPos",FUN_PARKPOS));//主轴去停车位 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SwitchStatus"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));//切换工作状态 +} + +void SingleMutilNeedleMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//花样参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//花样选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//花样导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//花样导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//花样删除 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0007,tr("Edit"),"buttonPatternEdit",PATTERNSET_PATTERNEDIT));//花样编辑 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0008,tr("NeedlePre"),"buttonNeedlePreview",PATTERNSET_NEEDLEPREVIEW));//排针预览 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0009,tr("LineGener"),"buttonLineGener",PATTERNSET_LINEGENER));//线迹生成 +} + +void SingleMutilNeedleMac::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 + } + +void SingleMutilNeedleMac::initSensorList() +{ + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton + "1"));//启动按钮1 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton + "1"));//暂停按钮1 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection + "1"));//气压检测1 + m_tempSensorList.append(makeASensorItem(0x0008, 0, tr("Secure input") + "1"));//安全输入1 + m_tempSensorList.append(makeASensorItem(0x0008, 1, tr("Secure input 2")));//安全输入2 + m_tempSensorList.append(makeASensorItem(0x0010, 0, tr("Power on signal 1")));//加电信号1 + m_tempSensorList.append(makeASensorItem(0x0022, 0, tr("Limit")+ " X-"));//X限位- + m_tempSensorList.append(makeASensorItem(0x0023, 0, tr("Limit") + " X+"));//X限位+ + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Sewing machine head stop position")));//缝纫机头针停车位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, tr("Sewing machine head Thread breakage inspection")));//缝纫机头面线断检 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +void SingleMutilNeedleMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); +} diff --git a/mctype/patternsingleboard/function/singlemutilneedlemac.h b/mctype/patternsingleboard/function/singlemutilneedlemac.h new file mode 100644 index 0000000..02d2ad6 --- /dev/null +++ b/mctype/patternsingleboard/function/singlemutilneedlemac.h @@ -0,0 +1,34 @@ +#ifndef SINGLEMUTILNEEDLEMAC_H +#define SINGLEMUTILNEEDLEMAC_H + +#include "mctype/machinetypefun.h" + +/// +/// \brief 单排多帧旋梭机 +/// +class SingleMutilNeedleMac : public MachineTypeFun +{ + Q_OBJECT +public: + SingleMutilNeedleMac(); + +public: + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initPatternSetList();//花样设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // SINGLEMUTILNEEDLEMAC_H diff --git a/mctype/patternsingleboard/function/thickwiringmac.cpp b/mctype/patternsingleboard/function/thickwiringmac.cpp new file mode 100644 index 0000000..868ae91 --- /dev/null +++ b/mctype/patternsingleboard/function/thickwiringmac.cpp @@ -0,0 +1,1701 @@ +#include "thickwiringmac.h" + + +ThickWiringMac::ThickWiringMac() +{ + //添加各种参数到列表中 + initRootParasList(); + initRootHMIConfigurationList(m_allParasList);//超级用户界面配置 + initRootIOTConfigurationList(m_allParasList); + initPatternsParasList(); + initSoftwareParasList(m_allParasList); + initTimeParasList(m_allParasList); + initMcParasList(); + initWkParasList(); + + //初始化控制动作列表 + initOutCtrlList(); + + //初始化快捷功能列表 + initShortCutList(); + + //初始化辅助功能列表 + initAssistList(); + + //初始化花样设置功能列表 + initPatternSetList(); + + //参数分类功能 + initParaSetList(); + + //初始化传感器列表 + initSensorList(); + + //初始化错误代码和状态列表 + initErrorCodeAndStateList(); + + //初始化九宫格 + initNinebtn1234(); + + //加载右上角信息 + initFileInfoLabel(); +} + +ThickWiringMac::~ThickWiringMac() +{ + +} + +void ThickWiringMac::initNinebtn1234() +{ + m_nineBtn.insert(1,NineItem(FUN_HEAD_LIFTUPDOWN,"buttonHeadLifting")); //机头升降 +// m_nineBtn.insert(2,NineItem(FUN_MANUAL_THREAD_CUTTING,"buttonMunualThreadCutting")); + m_nineBtn.insert(2,NineItem(FUN_CUT_UD,"buttonMunualThreadCutting")); //剪底面线 + m_nineBtn.insert(3,NineItem(FUN_PROCESSRESET,"buttonProcessReset")); + m_nineBtn.insert(4,NineItem(FUN_SIMULATED_STATUS,"buttonSimulatedStatus")); +} + +void ThickWiringMac::initFileInfoLabel() +{ + m_fileInfo.append(FileName); + m_fileInfo.append(Index); + m_fileInfo.append(BeginPoint); + m_fileInfo.append(RangeX); + m_fileInfo.append(RangeY); + m_fileInfo.append(Position); + m_fileInfo.append(Production); +} + +void ThickWiringMac::initPatternsParasList() +{ + int index = 0; //按顺序排列,想要更改顺序只需要修改代码位置 +// QTextCodec *cod = QTextCodec::codecForLocale(); + + //花样参数-花样设置参数-针步大小;单位:毫米 ,范围20-80,默认20 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_SETSTEPSIZE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Step size"),//针步大小 + 20, 20, 80, 20, 1, tr("mm"), tr(""), + tr(""), + 0, 0, index++, operate)); + +// //花样参数-花样设置参数-缩放x;单位:毫米 ,范围0-20000,默认0 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_PATTERN, +// PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, +// SET_SCANX, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Width"),//宽度 +// 5000, 0, 20000, 0, 1, tr("mm"), tr(""), +// tr(""), +// 0, 0, index++, operate)); + +// //花样参数-花样设置参数-缩放y;单位:毫米 ,范围0-20000,默认0 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_PATTERN, +// PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, +// SET_SCANY, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Height"),//高度 +// 5000, 0, 20000, 0, 1, tr("mm"), tr(""), +// tr(""), +// 0, 0, index++, operate)); + + //花样参数-花样设置参数-起始点x;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_STARTX, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start") + ("X"),//起始点X + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0003, operate)); + + //花样参数-花样设置参数-起始点y;范围-1000000--1000000,单位0.01mm,默认 0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR , + SET_STARTY, 0, 0, PARA_VALUE_TYPE_INT, + tr("Start") + ("Y"),//起始点Y + 0, -1000000, 1000000, 0, 2, tr("mm"), tr(""),//mm + tr(""), 0, 0,0x0004, operate)); + + if(1) + { + //花样参数-花样设置参数-翻转式样;单位:无 ,范围0-7,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_ROTATESTYLE, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Flip style"),//翻转式样 + 0, 0, 7, 0, 0, tr(""), tr(""), + ("normalP:0;nRight90P:1;nRight180P:2;nRight270P:3;mirrorP:4;mRight90P:5;mRight180P:6;mRight270P:7"), + 0, 0, 0x0005, operate)); + } + + //花样参数-花样设置参数-平分距离;单位:毫米 ,范围0-20000,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR, + SET_BISECT, 0, 0, PARA_VALUE_TYPE_INT, + tr("Divide the distance equally"),//高度 + 0, 0, 20000, 0, 0, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0006, operate)); + + //绣花机-花样参数-花样设置参数-去除偏移针步大小设置;单位:mm ,范围0-10,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_PATTERN, + PATTERNPARA_SORT_DSTR | PATTERNPARA_SORT_QUI, + SET_OFTNEEDLE, 0, 0, PARA_VALUE_TYPE_INT, + tr("Remove offset needle step size setting"),//去除偏移针步大小设置 + 0, 0, 1000, 0, 2, tr("mm"), tr(""), + tr(""), 0, 0,index++, operate)); + +// //花样参数-花样设置参数-旋转角度;单位:° ,范围0-90,默认0 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_PATTERN, +// PATTERNPARA_SORT_DSTR, +// SET_ROTATEANGLE, 0, 0, PARA_VALUE_TYPE_INT, +// tr("Rotation angle"),//旋转角度 +// 0, 0, 90, 0, 0, cod->toUnicode("°"), tr(""),//度 +// tr(""), 0, 0,0x0006, operate)); + +// //花样参数-花样设置参数-等比缩放 +// m_allParasList.append(makeAParaItem(0, +// PARA_TYPE_PATTERN, +// PATTERNPARA_SORT_QUI, +// SET_EQUAL, 0, 0, PARA_VALUE_TYPE_SW, +// tr("Equal ratio"),//等比缩放 +// 1, 0, 1, 1, 0, tr(""), tr(""), +// tr(""), +// 0, 0, index++, operate)); + + +} + +void ThickWiringMac::initMcParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + // 主轴停车传感器角度,范围0--10000, 单位 0.01度,默认 400 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle parking sensor angle"),//主轴停车传感器角度 + 400, 0, 10000, 400, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 上旋转找零补偿,范围-1000--1000, 单位 0.01度,默认 400 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Upward rotation zero compensation"),//上旋转找零补偿 + 400, -1000, 1000, 400, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 下旋转找零补偿,范围-1000--1000, 单位 0.01度,默认 400 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Downward rotation zero compensation"),//下旋转找零补偿 + 400, -1000, 1000, 400, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴找零补偿, 范围-1000--1000, 单位 0.01度,默认 400 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 22, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle zero compensation"),//主轴找零补偿 + 400, -1000, 1000, 400, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔相对位置X,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 23, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush relative position")+ " " + ("X"),//画笔相对位置X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔相对位置Y,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 24, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush relative position")+" "+("Y"),//画笔相对位置Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // X框传感器坐标,单位 0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 25, 0, 0, PARA_VALUE_TYPE_INT, + tr("X-box sensor coordinates"),//X框传感器坐标 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // Y框传感器坐标,单位 0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 26, 0, 0, PARA_VALUE_TYPE_INT, + tr("Y-box sensor coordinates"),//Y框传感器坐标 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 自动换梭装置 0,无 1,有 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 27, 0, 0, PARA_VALUE_TYPE_SW, + tr("Automatic shuttle changing device"),// 自动换梭装置 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 夹布开合延时,单位0.1秒,默认5,范围1-30 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 28, 0, 0, PARA_VALUE_TYPE_INT, + tr("Delay in opening and closing with fabric clamp"),// 夹布开合延时 + 5, 1, 100, 5, 1, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔下降延时,单位0.1秒,默认5,范围1-30 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 29, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush descent delay"),// 画笔下降延时 + 5, 1, 50, 5, 1, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 40 + // 可移动区域(X-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 40, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (X -)"),//可移动区域(X-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(X+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 41, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (X +)"),//可移动区域(X+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(Y-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 42, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (Y-)"),//可移动区域(Y-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 可移动区域(Y+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 43, 0, 0, PARA_VALUE_TYPE_INT, + tr("Movable area (Y+)"),//可移动区域(Y+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //44 + QString workableArea = tr("Workable area "); + // 可工作区域(X-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 44, 0, 0, PARA_VALUE_TYPE_INT, + workableArea + "(X-)",//可工作区域(X-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 可工作区域(X+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 45, 0, 0, PARA_VALUE_TYPE_INT, + workableArea + "(X+)",//可工作区域(X+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 可工作区域(Y-), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 46, 0, 0, PARA_VALUE_TYPE_INT, + workableArea + "(Y-)",//可工作区域(Y-) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 可工作区域(Y+), 范围 -2147483648--2147483647,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_POSITION, + 47, 0, 0, PARA_VALUE_TYPE_INT, + workableArea + "(Y+)",//可工作区域(Y+) + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // X向气框长度, 范围 1000--2000,单位mm,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SETTING, + 48, 0, 0, PARA_VALUE_TYPE_INT, + tr("X-direction air frame length"),// X-direction air frame length + 1000, 1000, 2000, 1000, 0, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 79 + // XY归零运行速度, 范围 1--100,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 79, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY zero running speed"),//XY归零运行速度 + 100, 1, 100, 100, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // XY空走运行速度, 范围 100--500,单位mm/s,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 80, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY idle running speed"),//XY空走运行速度 + 200, 100, 500, 200, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度1, 范围 10--50,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 81, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 1"),//xy手动移动速度1 + 10, 10, 50, 10, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度2, 范围 50--200,单位mm/s,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 82, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 2"),//xy手动移动速度2 + 100, 50, 200, 100, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // xy手动移动速度3, 范围 200--500,单位mm/s,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 83, 0, 0, PARA_VALUE_TYPE_INT, + "XY " + tr("manual movement speed") + (" 3"),//xy手动移动速度3 + 200, 200, 500, 200, 0, "mm/s", tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 84 + // 主轴运转转速, 范围 100--300,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 84, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle running speed"),//主轴运转转速 + 200, 100, 300, 200, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴最高转速, 范围 700--3000,单位r/min,默认 800 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 85, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum spindle speed"),//主轴最高转速 + 800, 700, 3000, 800, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴手动移动转速,范围1-50,单位r/min,默认10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 86, 0, 0, PARA_VALUE_TYPE_INT, + tr("Manual spindle movement speed"),//主轴手动移动转速 + 10, 1, 50, 10, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 87 + // 旋转归零速度,单位deg/s,范围10-200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 87, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotation zeroing speed"),//旋转归零速度 + 10, 10, 200, 10, 0, tr("deg/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 旋转电机手动移动速度,范围10-100,单位deg/s,默认50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 88, 0, 0, PARA_VALUE_TYPE_INT, + tr("Manual movement speed of rotary motor "),//旋转电机手动移动速度 + 50, 10, 100, 50, 0, tr("deg/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 旋转电机空走运行速度,范围 100--720, 单位 deg/s(度/秒),默认 720 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 89, 0, 0, PARA_VALUE_TYPE_INT, + tr("Rotating motor idle running speed "),//旋转电机空走运行速度 + 720, 100, 720, 720, 0, tr("deg/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 90 + // 画笔最小绘画速度, 范围 1--100,单位mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 90, 0, 0, PARA_VALUE_TYPE_INT, + tr("The minimum drawing speed of the brush"),//画笔最小绘画速度 + 10, 1, 100, 10, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔最大绘画速度, 范围 1--1500,单位mm/s,默认 1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 91, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum painting speed of the brush"),//画笔最大绘画速度 + 1000, 1, 1500, 1000, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔绘画加速度, 范围 1--5000,单位mm/s2,默认 500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 92, 0, 0, PARA_VALUE_TYPE_INT, + tr("Brush painting acceleration"),//画笔绘画加速度 + 500, 1, 5000, 500, 0, tr("mm/s2"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 画笔绘画降速最小偏差角度,范围 0--18000,单位 0.01度,默认 3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 93, 0, 0, PARA_VALUE_TYPE_INT, + tr("The minimum deviation angle for brush painting speed reduction"),//画笔绘画降速最小偏差角度 + 3000, 0, 18000, 3000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 拉料速度,单位mm/s,范围50-200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 94, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling speed"),//拉料速度 + 50, 50, 200, 50, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 机头旋转最高速度, 范围 1--720,单位 deg/s,默认 720 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 95, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum speed of head rotation"),//机头旋转最高速度 + 720, 1, 720, 720, 0, tr("deg/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // XY启动停止速度, 范围 1--100,单位 mm/s,默认 10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 96, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY start stop speed"), + 10, 1, 100, 10, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // XY行走加速度, 范围 1--10000,单位 mm/s2,默认 2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 97, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY walking acceleration"), + 2000, 1, 10000, 2000, 0, tr("mm/s2"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // XY刹车加速度, 范围 1--10000,单位 mm/s2,默认 10000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 98, 0, 0, PARA_VALUE_TYPE_INT, + tr("XY brake acceleration"), + 2000, 1, 10000, 2000, 0, tr("mm/s2"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴启动停止转速, 范围 1--300,单位 r/min,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 99, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start stop speed"), + 100, 1, 300, 100, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴运转加速度, 范围 1--100,单位 r/ss,默认 50 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 100, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle operating acceleration"), + 50, 1, 100, 50, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴刹车加速度, 范围 1--100,单位 r/ss,默认 100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_MACH, + MC_SORT_SPEED, + 101, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle brake acceleration"), + 100, 1, 100, 100, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); +} + +void ThickWiringMac::initWkParasList() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + // 主轴工作加速度 单位r/ss,默认20,范围 1-100 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 9, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle working acceleration"), + 20, 1, 100, 20, 0, tr("r/ss"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 10 + // 降速最大偏差角度,单位度,范围0-180,默认30 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 10, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum deviation angle of deceleration"),//降速最大偏差角度 + 30, 0, 180, 30, 0, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 起针慢动针数, 范围0--10,单位 针, ,默认 3 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 11, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting needle, slow moving needle count"),//起针慢动针数 + 3, 0, 10, 3, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 主轴工作转速, 范围 100--1000,单位r/min,默认 600 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 12, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle working speed"),//主轴工作转速 + 600, 100, 1000, 600, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 动框最高速度限制 单位mm/s,默认180,范围50-300 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 13, 0, 0, PARA_VALUE_TYPE_INT, + tr("Maximum speed limit for moving frames"),//动框最高速度限制 + 180, 50, 300, 180, 0, tr("mm/s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数,默认5,单位针,范围0-30 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 14, 0, 0, PARA_VALUE_TYPE_INT, + tr("Stitch detect if thread broken"),//断线检测针数 + 5, 0, 30, 5, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 15 + // 主轴剪线转速, 范围 1--200,单位r/min,默认 120 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 15, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle thread cutting speed"),// 主轴剪线转速 + 120, 1, 200, 120, 0, tr("r/min"), tr(""), + tr(""), 0, 0, 0x0001, operate)); + //主轴拐角转速, 范围1-3000,默认1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 16, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle corner speed"),//主轴拐角转速 + 1000, 1, 3000, 1000, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + //主轴启动慢动转速, 范围 1--500,单位r/min,默认 200 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 17, 0, 0, PARA_VALUE_TYPE_INT, + tr("Spindle start slow speed"),//主轴启动慢动转速 + 200, 1, 500, 200, 0, tr("r/min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + //摆臂动作起始角度,单位0.01度,范围0-36000,默认5000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 18, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of arm swing action"),//摆臂动作起始角度 + 5000, 0, 36000, 5000, 2, cod->toUnicode("°"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 起针压电阻丝针数,默认3,单位针,范围0-10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 19, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting needle pressure resistance wire number of needles"),//断线检测针数 + 3, 0, 10, 3, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 送电阻丝位移量,默认400,单位,范围0-2000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 20, 0, 0, PARA_VALUE_TYPE_INT, + tr("Displacement of resistance wire"),//送电阻丝位移量 + 400, 0, 2000, 400, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 拉料长度,默认500,单位mm,范围10-3000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 21, 0, 0, PARA_VALUE_TYPE_INT, + tr("Pulling length"),//拉料长度 + 500, 10, 3000, 500, 0, tr(""), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 联动功能 0,不联动,1 单次 2 循环 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 22, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Linkage function"),// 联动功能 + 0, 0, 2, 0, 0, tr(""), tr(""), + tr("No:0;SingleTime:1;Loop:2"),//不联动:0;单次:1;循环:2 + 0, 0, 0x0001, operate)); + + + // 70 + // 换梭芯提醒功能, 0, 不启用该功能; 1, 按针度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 70, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Bobbin change reminder function"),// 换梭芯提醒功能 + 0, 0, 3, 0, 0, tr(""), tr(""), + //0, 不启用该功能; 1, 按针度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0 + tr("Not enabled:0;Delay reminder by needle count:1;Count by number of slices:2;Immediately reminder by length:3"), 0, 0, 0x0001, operate)); + + // 换梭针数计数,单位针,默认10000,范围0-50000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SPEED, + 71, 0, 0, PARA_VALUE_TYPE_INT, + tr("Count of changing shuttle needles"),//换梭针数计数 + 10000, 0, 50000000, 10000, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 换梭片数计数, 单位片,默认100,范围0-50000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 72, 0, 0, PARA_VALUE_TYPE_INT, + tr("Count of shuttle change pieces"),// 换梭片数计数 + 100, 0, 50000000, 100, 0, tr("piece"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 73 + // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油,默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 73, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Refueling method selection"),// 加油方式选择 + 0, 1, 3, 0, 0, tr(""), tr(""), + // 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油, + tr("not refueling:0;According to worktime:1;According to the stitches number:2;Continuously refueling:3"),0, 0, 0x0001, operate)); + // 加油针数间隔, 单位针, 加油方式为按针数加油时有用,默认 10000,范围0-50000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 74, 0, 0, PARA_VALUE_TYPE_INT, + tr("Interval between refueling stitches"),// 加油针数间隔 + 10000, 0, 50000000, 10000, 0, tr("needle"), tr(""), + tr(""),0, 0, 0x0001, operate)); + + // 加油时间间隔, 单位分钟, 加油方式为按工作时间加油时有用;默认720,范围0-1440 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 75, 0, 0, PARA_VALUE_TYPE_INT, + tr("Oiling interval by working time"),//加油时间间隔 + 720, 0, 1440, 720, 0, tr("min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 加油持续时长,单位秒,默认3,范围1-10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 76, 0, 0, PARA_VALUE_TYPE_INT, + tr("Oiling sustained time"),//加油持续时长 + 3, 1, 10, 3, 0, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 77 + // 产量预设, 0, 关闭功能;其余,按照预设产量提示 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 77, 0, 0, PARA_VALUE_TYPE_INT, + tr("Production preset"),// 产量预设 + 0, 0, S32_MAX, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0001, operate)); + //完成后停车位置选择, 0, 当前位置; 1,起点, 2,偏移点, 3,上料点, 默认1 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 78, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Stop position selection after work complete"),//完成后停车位置选择 + 0, 0, 3, 0, 0, tr(""), tr(""), + //当前位置:0;起始点:1;定位点:2;上料点:3 + tr("Current:0;Start:1;Anchor:2;Feeding:3"), + 0, 0, 0x0001, operate)); + + // 79 + // 吹气方式选择, 0, 不吹气; 1, 按工作时间间歇吹气; 2, 按工作针数间歇吹气; 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 79, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Selection of blowing method"),//吹气方式选择 + 0, 0, 3, 0, 0, tr(""), tr(""), + //不吹气:0;按工作时间间歇吹气:1;按工作针数间歇吹气:2 + tr("Not blowing air:0;By working hours:1;By the number of working stitches:2"), + 0, 0, 0x0001, operate)); + // 吹气针数间隔, 单位针, 吹气方式为按针数吹气时有用,默认 10000,范围0-50000000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 80, 0, 0, PARA_VALUE_TYPE_INT, + tr("Blowing needle interval"),//吹气针数间隔 + 10000, 0, 50000000, 10000, 0, tr("needle"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 吹气时间间隔, 单位分钟, 吹气方式为按工作时间吹气时有用;默认720,范围0-1440 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 81, 0, 0, PARA_VALUE_TYPE_INT, + tr("Blowing time interval"),//吹气时间间隔 + 720, 0, 1440, 720, 0, tr("min"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 吹气持续时长,单位秒,默认3,范围1-10 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 82, 0, 0, PARA_VALUE_TYPE_INT, + tr("Blowing duration"),//吹气持续时长 + 3, 0, 10, 3, 0, tr("s"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + // 83 + // 电阻丝料架选择 0,料架1 1,料架2 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 83, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Selection of resistance wire rack"),//电阻丝料架选择 + 0, 0, 1, 0, 0, tr(""), tr(""), + //料架1:0;料架2:1 + tr("Material rack 1:0;Material rack 2:1"), + 0, 0, 0x0001, operate)); + // 拉料压料控制选择 0,左侧开启 1,全部开启 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 84, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Selection of material pulling and pressing control"),//拉料压料控制选择 + 0, 0, 1, 0, 0, tr(""), tr(""), + //左侧开启:0;全部开启:1 + tr("Left side open:0;Open All:1"), + 0, 0, 0x0001, operate)); + + // 电阻丝送料补偿,单位%,范围0-1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 85, 0, 0, PARA_VALUE_TYPE_INT, + tr("Resistance wire feeding compensation "),//电阻丝送料补偿 + 0, 0, 1000, 0, 0, tr("%"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 电阻丝送料拐角补偿,单位%,范围0-1000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 86, 0, 0, PARA_VALUE_TYPE_INT, + tr("Resistance wire feeding corner compensation"),//电阻丝送料拐角补偿 + 0, 0, 1000, 0, 0, tr("%"), tr(""), + tr(""), + 0, 0, 0x0001, operate)); + + // 115 + // 缝纫动框起始角度, 0--36000, 单位 0.01度,默认 28000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 115, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting angle of sewing frame"),// 缝纫动框起始角度 + 28000, 0, 36000, 28000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0001, operate)); + + // 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 116, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Thread trimming moving frame direction"),// 剪线动框方向 + 0, 0, 4, 0, 0, tr(""), tr(""), + strFixedFrame, 0, 0, 0x0001, operate)); + // 剪线动框位移, 0--1000, 单位0.01mm, 默认500 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 117, 0, 0, PARA_VALUE_TYPE_INT, + tr("Trimming frame displacement"),//剪线动框位移 + 500, 0, 1000, 500, 2, tr("mm"), tr(""), + tr(""), + 0, 0, 0x0001, root)); + // 剪线完成角度,0--36000, 单位 0.01度,默认 6000 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 118, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread trimming completion angle"),// 剪线完成角度 + 6000, 0, 36000, 6000, 2, cod->toUnicode("°"), tr(""), //度 + tr(""),0, 0, 0x0001, operate)); + //119 + // 剪线时动作允许, 位图选择, + // bit0,压脚上升允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 119, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow the presser foot to rise during thread cutting"),// 剪线时压脚上升允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // bit1,松线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 119, 2, 0, PARA_VALUE_TYPE_SW, + tr("Allow for loose thread during thread cutting"),// 剪线时松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // bit2,退针允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 119, 3, 0, PARA_VALUE_TYPE_SW, + tr("Allow needle withdrawal during thread cutting"),// 剪线时退针允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // bit3,夹线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_ACTION, + 119, 4, 0, PARA_VALUE_TYPE_SW, + tr("Allowing for wire clamping during wire cutting"),// 剪线时夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0009, operate)); + // 120 + // 开机动作 + //bit 0 摆臂归零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 120, 1, 0, PARA_VALUE_TYPE_SW, + tr("Zero the swing arm when starting up"),// 开机时摆臂归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + //bit 1 旋转归零 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 120, 2, 0, PARA_VALUE_TYPE_SW, + tr("Rotate to Zero when starting up"),// 开机时旋转归零 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // 121 + // 安全输入允许,位图选择,0, 不允许; 1, 允许; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_DETECT, + 121, 1, 0, PARA_VALUE_TYPE_SW, + tr("Safety input pressure allowed"),// 安全输入气压允许 + 1, 0, 1, 1, 0, tr(""), tr(""), + tr(""), 1, 1, 0x0001, operate)); + // 122 + // 软件限位; 位图选择, 0, 不允许; 1, 允许; + // bit0, xy移动; + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 122, 1, 0, PARA_VALUE_TYPE_SW, + tr("Software limit: xy movement"),// 软件限位:xy移动 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""),0, 0, 0x0027, operate)); + // 123 + // 功能控制 + // bit0,断线检测允许 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 123, 1, 0, PARA_VALUE_TYPE_SW, + tr("Wire breakage detection allowed"),// 断线检测允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // bit1,扎线报警允许 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 123, 2, 0, PARA_VALUE_TYPE_SW, + tr("Wire tie alarm allowed"),// 扎线报警允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // bit2,工作结束夹布自动打开 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 123, 3, 0, PARA_VALUE_TYPE_SW, + tr("After work is completed, the fabric clamp will automatically open"),// 工作结束夹布自动打开 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // bit3,起针松线 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 123, 4, 0, PARA_VALUE_TYPE_SW, + tr("Starting needle and loosening thread"),// 起针松线 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // bit4,起针夹线 0,禁止 1,允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 123, 5, 0, PARA_VALUE_TYPE_SW, + tr("Starting needle clamping thread"),// 起针夹线 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // 124 + // 偏移点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 124, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Offset point coordinate valid flag"),// 偏移点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x0001, operate)); + // 偏移点坐标X,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 125, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset")+ " " + ("X"),// 偏移点坐标 X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 偏移点坐标Y,单位0.01mm, 范围 -2147483648--2147483647 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 126, 0, 0, PARA_VALUE_TYPE_INT, + tr("Offset")+" "+("Y"),// 偏移点坐标 Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 127 + // 上料点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效 默认0 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 127, 0, 0, PARA_VALUE_TYPE_LIST, + tr("Loading point coordinate valid flag"),// 上料点坐标有效标志 + 0, 0, 3, 0, 0, tr(""), tr(""), + strInvalid,//无效:0;X有效:1;Y有效:2;XY同时有效:3 + 0, 0, 0x0001, operate)); + // 上料点坐标X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 128, 0, 0, PARA_VALUE_TYPE_INT, + tr("Loading point coordinate")+ " " + ("X"),// 上料点坐标 X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 上料点坐标Y,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 129, 0, 0, PARA_VALUE_TYPE_INT, + tr("Loading point coordinate")+" "+("Y"),// 上料点坐标 Y + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 拉料起始位置,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 130, 0, 0, PARA_VALUE_TYPE_INT, + tr("Starting position of material pulling"),// 拉料起始位置 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 拉料结束位置,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 131, 0, 0, PARA_VALUE_TYPE_INT, + tr("End position of material pulling"),// 拉料结束位置 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + // 132 + // 移框时动作允许 0,不允许 1,允许 + // bit0,松线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 132, 1, 0, PARA_VALUE_TYPE_SW, + tr("Allow for moving frames and loosening lines"),// 移框松线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + // bit0,夹线允许 + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_SETTING, + 132, 2, 0, PARA_VALUE_TYPE_SW, + tr("Allow for frame movement and line clamping"),// 移框夹线允许 + 0, 0, 1, 0, 0, tr(""), tr(""), + tr(""), 0, 0, 0x0001, operate)); + + // 更换X梭盘位置,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 133, 0, 0, PARA_VALUE_TYPE_INT, + tr("Replacing the position of the X shuttle disc"),// 更换X梭盘位置 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + + // 更换Y梭盘位置,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 134, 0, 0, PARA_VALUE_TYPE_INT, + tr("Replacing the position of the Y shuttle disc"),// 更换Y梭盘位置 + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + + // 穿线点X,单位0.01mm + m_allParasList.append(makeAParaItem(0, + PARA_TYPE_WORK, + MC_SORT_POSITION, + 135, 0, 0, PARA_VALUE_TYPE_INT, + tr("Thread point")+ " " + ("X"),// 穿线点X + 0, S32_MIN, S32_MAX, 0, 2, "mm", tr(""), + tr(""),0, 0, 0x0001, operate)); + +} + +#define MT_LX 0x0001 // X向移动电机 +#define MT_LY 0x0002 // Y向移动电机 +#define MT_LMS 0x0003 // 主轴 +#define MT_LND 0x0004 // 针 +#define MT_LHK 0x0005 // 梭 +#define MT_LR 0x0006 // 旋转 +#define MT_LUR 0x0007 // 上旋转 +#define MT_LDR 0x0008 // 下旋转 +#define MT_LCB 0x0009 // 环带 +#define MT_LP 0x000A // 拉料电机(拉料,料斗收放料) +#define MT_LZ 0x000B // 摆嘴电机 + + +#define OT_FEEDPRESS 0x0001 // 进料压料升降 +#define OT_CLAMPOPEN 0x0002 // 夹布开合 +#define OT_CLAMPLOOSEN 0x0003 // 夹布松紧 +#define OT_PULLPRESS1 0x0004 // 拉料压料1升降 +#define OT_WIRESHELF1 0x0005 // 电阻丝料架1(正转 反转 停止) +#define OT_HEADLIFT 0x0006 // 机头升降 +#define OT_FEEDWIRE 0x0007 // 放料电机 +#define OT_FOOT 0x0008 // 小压脚升降 +#define OT_LOOSEN 0x0009 // 松紧线 +#define OT_CLIP 0x000A // 夹面线 +#define OT_UOIL 0x000B // 机头加油 +#define OT_FEEDLIFT 0x000C // 送料辊升降 +#define OT_CUTLIFT 0x000D // 上剪刀升降 +#define OT_UCUT 0x000E // 上剪刀开合 +#define OT_PENLIFT 0x000F // 马克笔升降 +#define OT_DCUT 0x0010 // 下剪刀开合 +#define OT_PUSH 0x0011 // 扣线 +#define OT_BLOW 0x0012 // 吹气 +#define OT_DOIL 0x0013 // 旋梭加油 +#define OT_PUSHSTRETCH 0x0014 // 扣线伸缩装置 +#define OT_PULLPRESS2 0x0015 // 拉料压料2升降 +#define OT_WIRESHELF2 0x0016 // 电阻丝料架2(正转 反转 停止) +#define OT_ZIGZAG 0x0017 // 摆嘴摆动 +#define OT_PRESSWIRE 0x0018 // 压电阻丝 + +#define OT_CHBOB_GRAB_OPEN 0x0070 // 换梭装置抓取 开合 +#define OT_CHBOB_SWAY_PUSH 0x0071 // 换梭装置摆动 伸缩 +#define OT_CHBOB_PUSH_PUSH 0x0072 // 换梭装置推动 伸缩 +#define OT_CHBOB_SPIN 0x0073 // 换梭装置旋转 伸缩 + +#define UP_OPEN_ON 0x0001 // 上升、打开、放松、伸出 +#define DOWN_CLOSE_OFF 0x0002 // 下降、关闭、加紧、收回 +#define OT_ACTION 0x0003 // 动作 + +void ThickWiringMac::initOutCtrlList() +{ + m_allOutCtrlList.clear(); + int showPriority =1; + //电机 + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("X-direction moving motor"),MT_LX,// X向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Y-direction moving motor"),MT_LY,// Y向移动电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spindle motor"),MT_LMS,// 主轴电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Needle motor"),MT_LND,// 针电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle motor"),MT_LHK,// 梭电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Rotating motors"),MT_LR,// 旋转电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Upward rotating motor"),MT_LUR,// 上旋转电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower rotating motor"),MT_LDR,// 下旋转电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Ring motor"),MT_LCB,// 环带电机 没有归零 + "",false,-1,-1,-1, + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Pulling motor"),MT_LP,// 拉料电机 这个动作位置更换,没有归零 + "",false,-1,-1,-1, + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Swinging mouth motor"),MT_LZ,// 摆嘴电机 + strEnable,true,OUTCONTROL_ENABLE,-1,-1, + strDisable,true,OUTCONTROL_DISABLE,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP, + strZero,true,OUTCONTROL_ZERO,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Manual material pulling"),MT_LYPB,// Y 手动拉料 环带 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strBack,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strPull,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Linkage material return"),MT_LINKRE,// 联动退料 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strBack,true,OUTCONTROL_PULLBACK,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Send resistance wire"),MT_LFW,// 送电阻丝 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strClose,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + + + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Swinging mouth"),OT_ZIGZAG,// 摆嘴摆动 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strSwing + "1",true,OUTCONTROL_OPEN,-1,-1, + strSwing + "2",true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Piezoresistive wire"),OT_PRESSWIRE,//压电阻丝 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Feeding and pressing lifting"),OT_FEEDPRESS,//进料压料升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Cloth clip opening and closing"),OT_CLAMPOPEN,//夹布开合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Tightness of the cloth clip"),OT_CLAMPLOOSEN,//夹布松紧 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strRelease,true,OUTCONTROL_OPEN,-1,-1, + strTighten,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("material pulling and pressing") + (" 1"),OT_PULLPRESS1,//拉料压料1 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_OPEN,-1,-1, + strDescend,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Resistance wire material rack") + (" 1"),OT_WIRESHELF1,//电阻丝料架1(正转 反转 停止) + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,OUTCONTROL_OPEN,-1,-1, + strJogN,true,OUTCONTROL_CLOSE,-1,-1, + strStop,true,OUTCONTROL_COCOSTOP,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("material pulling and pressing") + (" 2"),OT_PULLPRESS2,//拉料压料2 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_OPEN,-1,-1, + strDescend,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Resistance wire material rack") + (" 2"),OT_WIRESHELF2,//电阻丝料架2(正转 反转 停止) + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,OUTCONTROL_OPEN,-1,-1, + strJogN,true,OUTCONTROL_CLOSE,-1,-1, + strStop,true,OUTCONTROL_COCOSTOP,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Head lifting and lowering"),OT_HEADLIFT,//机头升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Discharge motor "),OT_FEEDWIRE,//放料电机 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strJogP,true,-1,OUTCONTROL_JOGP,OUTCONTROL_STOP, + strJogN,true,-1,OUTCONTROL_JOGN,OUTCONTROL_STOP)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Small presser foot lifting"),OT_FOOT,//小压脚升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Elastic thread"),OT_LOOSEN,//松紧线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_CLOSE,-1,-1, + strClose,true,OUTCONTROL_OPEN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Sandwich line"),OT_CLIP,//夹面线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_CLOSE,-1,-1, + strClose,true,OUTCONTROL_OPEN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Nose refueling"),OT_UOIL,//机头加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Feeding roller lifting"),OT_FEEDLIFT,//送料辊升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Upper scissors lifting and lowering"),OT_CUTLIFT,//上剪刀升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Upper scissors opening and closing"),OT_UCUT,//上剪刀开合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Mark pen up and down"),OT_PENLIFT,//马克笔升降 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strAscend,true,OUTCONTROL_UP,-1,-1, + strDescend,true,OUTCONTROL_DOWN,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Lower scissors opening and closing"),OT_DCUT,//下剪刀开合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Buckle thread"),OT_PUSH,//扣线 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Blow air"),OT_BLOW,//吹气 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Spinning shuttle refueling"),OT_DOIL,//旋梭加油 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Wire buckle expansion device"),OT_PUSHSTRETCH,//扣线伸缩装置 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device grabbing"),OT_CHBOB_GRAB_OPEN,//换梭装置抓取 开合 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strOpen,true,OUTCONTROL_OPEN,-1,-1, + strClose,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Swinging of shuttle changing device"),OT_CHBOB_SWAY_PUSH,//换梭装置摆动 伸缩 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device push"),OT_CHBOB_PUSH_PUSH,//换梭装置推动 伸缩 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + m_allOutCtrlList.append(makeAOutCtrlItem(0,showPriority++,tr("Shuttle changing device rotation "),OT_CHBOB_SPIN,//换梭装置旋转 伸缩 + "",false,-1,-1,-1, + "",false,-1,-1,-1, + "",false,-1,-1,-1, + strStretch,true,OUTCONTROL_OPEN,-1,-1, + strRecover,true,OUTCONTROL_CLOSE,-1,-1)); + +} + +void ThickWiringMac::initShortCutList() +{ + m_allShortCutList.clear(); + int index = 1; + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("AllToZero"),"buttonFrameZero",FUN_ALLTOZERO));//全部归零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("FrontBack"),"buttonForwardOrBack",FUN_FORWARDORBACK));// 快进快退 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ProcessReset"),"buttonProcessReset",FUN_PROCESSRESET));//流程复位 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Simulated"),"buttonSimulatedStatus",FUN_SIMULATED_STATUS));// 模拟缝纫 + + + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("msToAngle"),"buttonBackEmbPoint",FUN_MS_TO_ANGLE));//主轴去指定角度 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("wireMsRun"),"buttonBackFeedingPoint",FUN_WIRE_MS_RUN));//主轴研车 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("rotToAngle"),"buttonBackOffsetPoint",FUN_ROT_TO_ANGLE));//旋转电机去指定角度 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoPull"),"buttonBackStartPoint",FUN_AUTO_PULL));//自动拉料 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("cutUd"),"buttonManualTrim",FUN_CUT_UD));//剪底面线 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("cutWire"),"buttonBackStopPoint",FUN_CUT_WIRE));//剪电阻丝 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("gotoPullpos"),"buttonBackToOrigin",FUN_GOTO_PULLPOS));//回拉料起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("jawWork"),"buttonBackWorkPoint",FUN_JAW_WORK));//夹布工作状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("jawFeed"),"buttonCommonFunction",FUN_JAW_FEED));//夹布上料状态 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("zigzagPos1"),"buttonBeadParas",FUN_ZIGZAG_POS1));//去摆动位1 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("zigzagPos2"),"buttonBeadParas",FUN_ZIGZAG_POS2));//去摆动位2 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("autoChange oneShut"),"buttonActionParas",FUN_AUTO_CHANGE_ONE_SHUT));//自动换一个梭 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("installFirst bobbin"),"buttonBottomDetect",FUN_INSTALL_FIRST_BOBBIN));//安装第一个梭壳 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom plateToHead"),"buttonCoilParas",FUN_SHUT_FROM_PLATE_TO_HEAD));//将旋梭从梭盘拿到机头 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutFrom headToPlate"),"buttonCoilParas",FUN_SHUT_FROM_HEAD_TO_PLATE));//将旋梭从机头拿到梭盘 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto takePlate"),"buttonHeadEmb",FUN_SHUT_INTO_TAKE_PLATE));//进入更换梭盘状态 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shutInto indxSta"),"buttonHardwareConfig",FUN_SHUT_INTO_INDX_STA));//进入缝纫状态 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("N/S Proofread"),"buttonAutoParas",FUN_MAINSHAFT_ADJUST));//针梭校对 +// m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Set anchor"),"buttonSetAnchorPoint",FUN_SETANCHORPOINT));//定定位点 +// m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back anchor"),"buttonBackAnchorPoint",FUN_BACKANCHORPOINT));//回定位点 +// m_allShortCutList.append(makeAShortCutItem(0,index++,tr("ypbMove"),"buttonManualChangeColor",FUN_YPB_MOVE));//手动拉料 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Set start "),"buttonSetEmbPoint",FUN_SETSTARTPOINT));//定起始点 + m_allShortCutList.append(makeAShortCutItem(0, index++, tr("Back start"),"buttonBackEmbPoint",FUN_BACKSTARTPOINT));//回起始点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetOffsetPoint"),"buttonSetAnchorPoint",FUN_SETOFFSETPOINT));// 定偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backOffsetPoint"),"buttonBackOffsetPoint",FUN_BACKOFFSETPOINT));// 回偏移点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backWorkPoint"),"buttonBackEmbPoint",FUN_BACKWORKPOINT));// 回工作点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("SetFeedPoint"),"buttonSetAnchorPoint",FUN_SETFEEDINGPOINT));// 定上料点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("backFeedPoint"),"buttonBackAnchorPoint",FUN_BACKFEEDINGPOINT));// 回上料点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("Back FeedtPoint"),"buttonBackStopPoint",FUN_GOTO_FEEDT));// 回穿线点 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("CountReset"),"buttonCommonFunction",FUN_COUNTRESET));//底线计数清零 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("FeedState"),"buttonCommonFunction",FUN_SHUT_FEED_STATE));//进入送料状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("TakeState"),"buttonCommonFunction",FUN_SHUT_BACK_STATE));//进入收料状态 + m_allShortCutList.append(makeAShortCutItem(0,index++,tr("shuttleline"),"buttonCommonFunction",FUN_SHUIILE_LINE));//梭芯底线显示 + +} + +void ThickWiringMac::initAssistList() +{ + m_allAssistList.clear(); + + m_allAssistList.append(makeAAssistItem(0,0x0001,tr("Signal"),"buttonSensor",ASSIST_SENSOR));//传感器信号 + m_allAssistList.append(makeAAssistItem(0,0x0002,tr("Action"),"buttonControlAction",ASSIST_CONTROLACTION));//控制动作 + m_allAssistList.append(makeAAssistItem(0,0x0003,tr("HMIUpgrade"),"buttonHMIUpgrade",ASSIST_HMIUPGRADE));//界面升级 + m_allAssistList.append(makeAAssistItem(0,0x0004,tr("MCUpgrade"),"buttonMCUpgrade",ASSIST_MCUPGRADE));//主控升级 + m_allAssistList.append(makeAAssistItem(0,0x0006,tr("ParaImport"),"buttonParaImport",ASSIST_PARAIMPORT));//参数导入 + m_allAssistList.append(makeAAssistItem(0,0x0007,tr("ParaExport"),"buttonParaExport",ASSIST_PARAEXPORT));//参数导出 + m_allAssistList.append(makeAAssistItem(0,0x0008,tr("SoftwareSet"),"buttonSoftwareSet",ASSIST_SOFTWARESET));//软件设置 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("Authorization"),"buttonSoftwareAuthor",ASSIST_AUTHORIZATION));//软件授权 + m_allAssistList.append(makeAAssistItem(0,0x0009,tr("WIFI"),"buttonWIFI",ASSIST_WIFI));//WIFI + m_allAssistList.append(makeAAssistItem(0,0x000A,tr("Network"),"buttonNetworkManage",ASSIST_NETWORK));//网络管理 + m_allAssistList.append(makeAAssistItem(0,0x000C,tr("Time"),"buttonTimeSet",ASSIST_TIMESET));//时间设置 + m_allAssistList.append(makeAAssistItem(0,0x000F,tr("Version"),"buttonVersionInfo",ASSIST_MCVERSION));//版本信息 + m_allAssistList.append(makeAAssistItem(0,0x0014,tr("Root"),"buttonRoot",ASSIST_ROOT));//超级用户 + m_allAssistList.append(makeAAssistItem(0,0x0015,tr("HMIreturn"),"buttonActionSet",ASSIST_HMIBACKUPSUPGRADE));//界面还原 + +} + +void ThickWiringMac::initPatternSetList() +{ + m_allPatternSetList.clear(); + + m_allPatternSetList.append(makeAPatternSetItem(0,0x0001,tr("Para"),"buttonPatternPara",PATTERNSET_PATTERNPARA));//文件参数 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0002,tr("Select"),"buttonPatternSelect",PATTERNSET_PATTERNSELECT));//文件选择 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0004,tr("Import"),"buttonPatternImport",PATTERNSET_PATTERNIMPORT));//文件导入 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0005,tr("Export"),"buttonPatternExport",PATTERNSET_PATTERNEXPORT));//文件导出 + m_allPatternSetList.append(makeAPatternSetItem(0,0x0006,tr("Delete"),"buttonPatternDelete",PATTERNSET_PATTERNDELETE));//文件删除 + +} + +void ThickWiringMac::initParaSetList() +{ + m_allParaSetList.clear(); + + m_allParaSetList.append(makeAParaSetItem(0,0x0001,tr("OperatPara"),"buttonPositionParas",PARASET_SETTING));//设置参数 //操作参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0002,tr("ActionSet"),"buttonActionParas",PARASET_ACTION));//动作参数 //动作设定 + m_allParaSetList.append(makeAParaSetItem(0,0x0003,tr("SpeedPara"),"buttonSpeedParas",PARASET_SPEED));//速度参数 //速度控制参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0004,tr("LimitPara"),"buttonDetectParas",PARASET_POSITION));// 位置参数 //限位参数 + m_allParaSetList.append(makeAParaSetItem(0,0x0005,tr("MCPara"),"buttonSettingParas",PARASET_DETECT));//设置参数 //机器参数 +} + +#define DSS_BIT1 0x01 // idx1 +#define DSS_BIT2 0x02 // idx2 +#define DSS_BIT3 0x04 // idx3 +#define DSS_BIT4 0x08 // idx4 +#define DSS_BIT5 0x10 // idx5 +#define DSS_BIT6 0x20 // idx6 +#define DSS_BIT7 0x40 // idx7 +#define DSS_BIT8 0x80 // idx8 + +#define DSS2_WIRE_SENSOR 0x0101 +#define DSS2_ND_HIGH DSS_BIT1 //针高位 +#define DSS2_ND_CUSP DSS_BIT2 // 针低位 +#define DSS2_HK_CUSP DSS_BIT3 // 梭尖位 +#define DSS2_HK_STOP DSS_BIT4 // 梭零位 + +void ThickWiringMac::initSensorList() +{ + + m_tempSensorList.append(makeASensorItem(0x0080, 0, tr("Needle parking spaces")));//针停车位 + m_tempSensorList.append(makeASensorItem(0x0030, 0, tr("Rotate the zero position on the nose")));//机头上旋转零位 + m_tempSensorList.append(makeASensorItem(0x0170, 0, tr("Wire breakage detection")));//断线检测 + m_tempSensorList.append(makeASensorItem(0x024D, 0, tr("Resistance wire discharge detection")));//电阻丝出料检测 + m_tempSensorList.append(makeASensorItem(0x0020, 0, "X " + strZeroPosition));//X零位 + m_tempSensorList.append(makeASensorItem(0x0020, 1, tr("Y zero position")));//Y零位 + m_tempSensorList.append(makeASensorItem(0x0021, 0, tr("X deceleration")));//X降速 + m_tempSensorList.append(makeASensorItem(0x0021, 1, "Y " + strDeceleration));//Y降速 + m_tempSensorList.append(makeASensorItem(0x0022, 0, tr("X negative limit")));//X负限位 + m_tempSensorList.append(makeASensorItem(0x0022, 1, tr("Y negative limit")));//Y负限位 + m_tempSensorList.append(makeASensorItem(0x0023, 0, "X " + strPositiveLimit));//X正限位 + m_tempSensorList.append(makeASensorItem(0x0023, 1, "Y " + strPositiveLimit));//Y正限位 + m_tempSensorList.append(makeASensorItem(0x0088, 0, tr("Shuttle parking space")));//梭停车位 + m_tempSensorList.append(makeASensorItem(0x0241, 2, tr("Pull and press material") + (" 1 ")+tr("high position")));//拉料压料1高位 + m_tempSensorList.append(makeASensorItem(0x0241, 0, tr("Pull and press material") + (" 2 ")+tr("high position")));//拉料压料2高位 + + m_tempSensorList.append(makeASensorItem(0x0000, 0, strStartButton));//启动按钮 + m_tempSensorList.append(makeASensorItem(0x0001, 0, strPauseButton));//暂停按钮 + m_tempSensorList.append(makeASensorItem(0x0002, 0, tr("Click the button")));//点按按钮 + m_tempSensorList.append(makeASensorItem(0x0007, 0, strPressDetection));//气压检测 + m_tempSensorList.append(makeASensorItem(0x0240, 2, tr("Clamp tension detection")));//夹布拉紧检测 + m_tempSensorList.append(makeASensorItem(0x0240, 4, tr("Cloth opening detection")));//夹布打开检测 + m_tempSensorList.append(makeASensorItem(0x0240, 6, tr("High level of feed pressure")));//进料压料高位 + + m_tempSensorList.append(makeASensorItem(0x0241, 2, tr("High level of material pulling and pressing")));//拉料压料高位 + m_tempSensorList.append(makeASensorItem(0x024C, 0, tr("High level one material storage ")));//储料1高位(电阻丝料架) + m_tempSensorList.append(makeASensorItem(0x024C, 1, tr("Middle level one material storage ")));//储料1中位(电阻丝料架) + m_tempSensorList.append(makeASensorItem(0x024C, 2, tr("Low level one material storage ")));//储料1低位(电阻丝料架) + m_tempSensorList.append(makeASensorItem(0x024C, 3, tr("Machine head discharge high position ")));//机头放料高位 + m_tempSensorList.append(makeASensorItem(0x024C, 4, tr("Machine head discharge low position ")));//机头放料低位 + m_tempSensorList.append(makeASensorItem(0x0103, 1, tr("Wire tie alarm")));//扎线报警 + m_tempSensorList.append(makeASensorItem(0x0040, 0, tr("Head high position")));//机头高位 + m_tempSensorList.append(makeASensorItem(0x0042, 0, tr("Head low position ")));//机头低位 + m_tempSensorList.append(makeASensorItem(0x02B0, 0, tr("Shuttle in position detection")));//梭在位检测 + m_tempSensorList.append(makeASensorItem(0x02B0, 2, tr("Shuttle changing rotating extension position")));//换梭旋转伸出位 + m_tempSensorList.append(makeASensorItem(0x02B0, 3, tr("Shuttle rotation and retraction position")));//换梭旋转收回位 + m_tempSensorList.append(makeASensorItem(0x02B0, 4, tr("Shuttle changing push extension position")));//换梭推动伸出位 + m_tempSensorList.append(makeASensorItem(0x02B0, 5, tr("Shuttle changing and pushing to retract position")));//换梭推动收回位 + m_tempSensorList.append(makeASensorItem(0x02B0, 6, tr("Shuttle changing swing extension position")));//换梭摆动伸出位 + m_tempSensorList.append(makeASensorItem(0x02B0, 7, tr("Shuttle changing swing retraction position")));//换梭摆动收回位 + m_tempSensorList.append(makeASensorItem(0x0037, 0, tr("Head down rotation zero position")));//机头下旋转零位 + + m_tempSensorList.append(makeASensorItem(0x024C, 5, tr("High level two material storage ")));//储料2高位(电阻丝料架) + m_tempSensorList.append(makeASensorItem(0x024C, 6, tr("Middle level two material storage ")));//储料2中位(电阻丝料架) + m_tempSensorList.append(makeASensorItem(0x024C, 7, tr("Low level two material storage ")));//储料2低位(电阻丝料架) + + m_tempSensorList.append(makeASensorItem(DSS2_WIRE_SENSOR, DSS_BIT1, tr("Needle high position"))); //针高位 + m_tempSensorList.append(makeASensorItem(DSS2_WIRE_SENSOR, DSS_BIT2, tr("Needle low position"))); // 针低位 + m_tempSensorList.append(makeASensorItem(DSS2_WIRE_SENSOR, DSS_BIT3, tr("Shuttle tip position"))); // 梭尖位 + m_tempSensorList.append(makeASensorItem(DSS2_WIRE_SENSOR, DSS_BIT4, tr("Shuttle zero position"))); // 梭零位 + + //将机型所需的传感器列表替换到传感器整体列表中 + for(int i = 0; i < m_tempSensorList.size(); i++) + { + int byteaddr = m_tempSensorList[i].m_byte_offset; + int bitaddr = m_tempSensorList[i].m_bit_offset; + QString str = m_tempSensorList[i].m_name; + int type = m_tempSensorList[i].m_type; + + int idx = byteaddr*8+bitaddr; + if(idx < m_allSensorList.size()) + { + m_allSensorList[idx].m_name = str; + m_allSensorList[idx].m_type = type; + } + } +} + +#define ERR_INPUT_TIMEOUT 0x004B // 进料超时 + +void ThickWiringMac::initErrorCodeAndStateList() +{ + m_allErrorCodeAndStateList.clear(); + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MV_PARA,"0x0015" + tr("Motion parameter error"))); // 运动参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MC_PARA,"0x0016"+ tr("Machine parameter error"))); // 机器参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_SYNC,"0x0052" + tr("Needle shuttle not synchronized"))); // 针梭不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_RO_NOT_SYNC,"0x0053" + tr("Rotation asynchronous"))); // 旋转不同步 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_NEEDLE_NOT_HIGH,"0x005A" + tr("Needle not in high position"))); // 机针不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_LIFT_TIMEOUT,"0x005F" + tr("Head lifting timeout"))); // 机头升降超时 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_POSI,"0x0023 X " + tr("forward limit"))); // X正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_X_LIT_NEGA,"0x0024 X " + tr("reverse limit"))); // X反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_POSI,"0x0025 Y " + tr("forward limit"))); // Y正向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_Y_LIT_NEGA,"0x0026 Y " + tr("reverse limit"))); // Y反向限位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_OUT_RANGE,"0x0022" + tr("Target position out of range"))); // 目标位置越界 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_COOR_SYSTM,"0x0021" + tr("Coordinate system error"))); // 坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_IN_PARA,"0x0017" + tr("Input parameter error"))); // 输入参数错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_HIGH,"0x0055" + tr("Machine head not in high position"))); // 机头不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_NOT_ZERO,"0x0050" + tr("Spindle not in zero position"))); // 主轴不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HK_NOT_ZERO,"0x0051" + tr("Rotary shuttle not in zero position"))); // 旋梭不在零位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_ROT_COOR_SYSTM,"0x00CB" + tr("Rotating motor coordinate system error"))); // 旋转电机坐标系统错误 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEEDPRESS_NOT_HIGH,"0x0D20" + tr("Feed pressure not at high level"))); // 进料压料不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_FEEDPRESS_NOT_LOW,"0x0D21" + tr("Feed pressure not in low position"))); // 进料压料不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULLPRESS_NOT_HIGH,"0x0D22" + tr("Pulling and pressing materials are not at a high level"))); // 拉料压料不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PULLPRESS_NOT_LOW,"0x0D23" + tr("Pulling and pressing materials are not in the low position"))); // 拉料压料不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLAMPCLOTH_NOT_TIGHTEN,"0x0D24" + tr("The cloth clip is not in the tension position"))); // 夹布不在拉紧位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLAMPCLOTH_NOT_LOOSEN,"0x0D25" + tr("The cloth clip is not in the relaxed position"))); // 夹布不在放松位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLAMPCLOTH_NOT_OPEN,"0x0D26" + tr("The cloth clip is not in the open position"))); // 夹布不在打开位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CLAMPCLOTH_NOT_CLOSE,"0x0D27" + tr("The cloth clip is not in the closed position"))); // 夹布不在关闭位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PEN_NOT_HIGH,"0x0D28" + tr("Brush not in high position"))); // 画笔不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_PEN_NOT_LOW,"0x0D29" + tr("Brush not in low position"))); // 画笔不在低位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UCUT_NOT_HIGH,"0x0D2A" + tr("The upper scissors are not in high position"))); // 上剪刀不在高位 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_UCUT_NOT_LOW,"0x0D2B" + tr("The upper scissors are not in the low position"))); // 上剪刀不在低位 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_SWAY,"0x0219" + tr("Abnormal shuttle changing swing device"))); // 换梭摆动装置异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_PUSH,"0x021A" + tr("Abnormal shuttle changing pushing device"))); // 换梭推动装置异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_SPIN,"0x0230" + tr("Shuttle changing rotating device"))); // 换梭旋转装置 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_DPUSH,"0x0231" + tr("Shuttle changing buckle line expansion device"))); // 换梭扣线伸缩装置 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_WIRE_ALARM,"0x00C9" + tr("Wire tie alarm"))); // 扎线报警 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_CHB_SHUT,"0x021C" + tr("Shuttle shell detection abnormality"))); // 梭壳检测异常 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_HEAD_NOT_SAFE,"0x0060" + tr("The nose is not in a safe area"))); // 机头不在安全区域 + + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_INSTALLMENT_OK,"0x0300" + tr("Password set successfully"))); // 密码设置成功 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_INSTALLMENT_FAIL,"0x0301" + tr("Password setting failed"))); // 密码设置失败 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_MS_COOR_SYSTM,"0x00CF" + tr("Spindle coordinate system error"))); // 主轴坐标系统错误 + m_allErrorCodeAndStateList.append(makeAErrorStateItem(ERR_INPUT_TIMEOUT,"0x004B" + tr("Feed timeout"))); // 进料超时 + + +} diff --git a/mctype/patternsingleboard/function/thickwiringmac.h b/mctype/patternsingleboard/function/thickwiringmac.h new file mode 100644 index 0000000..2f0e06e --- /dev/null +++ b/mctype/patternsingleboard/function/thickwiringmac.h @@ -0,0 +1,39 @@ +#ifndef THICKWIRINGMAC_H +#define THICKWIRINGMAC_H + +#include "mctype/machinetypefun.h" + +/** + * @brief 粗线布线机 + */ + +class ThickWiringMac : public MachineTypeFun +{ + Q_OBJECT +public: + ThickWiringMac(); + virtual ~ThickWiringMac(); + +public: + void initNinebtn1234(); + void initFileInfoLabel(); + +private: + void initPatternsParasList();//花样参数 + void initMcParasList();//主控机器参数 + void initWkParasList();//主控工作参数 + +private: + void initOutCtrlList();//控制动作 + void initShortCutList();//快捷动作 + void initAssistList();//辅助功能 + void initPatternSetList();//文件设置 + void initParaSetList();//参数设置 + +private: + void initSensorList();//初始化传感器列表 + void initErrorCodeAndStateList();//初始化错误代码和状态列表 + +}; + +#endif // THICKWIRINGMAC_H diff --git a/mctype/patternsingleboard/mainUI/mainwidget.cpp b/mctype/patternsingleboard/mainUI/mainwidget.cpp new file mode 100644 index 0000000..888d50e --- /dev/null +++ b/mctype/patternsingleboard/mainUI/mainwidget.cpp @@ -0,0 +1,6097 @@ +#include "mainwidget.h" +#include "ui_mainwidget.h" + +#define INTERFACE_SHORTCUT 1 //快捷功能界面 +#define INTERFACE_ACCESS 2 //辅助功能界面 + +#ifdef Q_OS_WIN +#include +#endif +MainWidget::MainWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::MainWidget), + m_pPatternSelectWi(NULL), + m_pParameterSetDlg(NULL), + m_pPatternManageWi(NULL), + m_pPatternEditWi(NULL), + m_pLineGenerWi(NULL), + m_pPatternNeedleWi(NULL), + m_pSensorInputWi(NULL), + m_pControlActionWi(NULL), + m_pMainWidgetFunction(NULL), + m_initflag(0), + m_timoutflag(0), + m_pTimer(NULL), + m_pConTimer(NULL), + m_conFlag(0), + m_linkSta(0), + m_whetherShowFlag(1) +{ + ui->setupUi(this); + + setWindowFlags (Qt::Widget | + Qt::Window | + Qt::FramelessWindowHint | // 无边框窗口 + // Qt::WindowStaysOnTopHint | // 顶层窗口 + Qt::Widget); + + + setFocusPolicy(Qt::NoFocus); + + mousePressX = 0; + mousePressY = 0; + mouseReleaseX = 0; + mouseReleaseY = 0; + + this->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + initialize(); + + showWorkSpeed(QString("2400"));//初始化数码管的速度是0 + ui->labelSpeed->hide(); + + m_nineBtnShowFlag = true; +} + +MainWidget::~MainWidget() +{ + if(m_pTimer != NULL) + { + delete m_pTimer; + } + + if(m_pConTimer != NULL) + { + delete m_pConTimer; + } + + if(m_pMinTimer != NULL) + { + delete m_pMinTimer; + } + + if(m_pWifiConTimer != NULL) + { + delete m_pWifiConTimer; + } + + if(m_pRefreshVer != NULL) + { + delete m_pRefreshVer; + } + + if(m_pPatternSelectWi != NULL) + { + delete m_pPatternSelectWi; + } + + if(m_pParameterSetDlg != NULL) + { + delete m_pParameterSetDlg; + } + + if(m_pSensorInputWi != NULL) + { + delete m_pSensorInputWi; + } + + if(m_pControlActionWi != NULL) + { + delete m_pControlActionWi; + } + + if(m_pPatternEditWi != NULL) + { + delete m_pPatternEditWi; + } + + if(m_pLineGenerWi != NULL) + { + delete m_pLineGenerWi; + } + + if(m_pPatternNeedleWi != NULL) + { + delete m_pPatternNeedleWi; + } + + if(m_pMainWidgetFunction != NULL) + { + delete m_pMainWidgetFunction; + } + if(m_pScanComThread != NULL) + { + // m_pScanComThread->wait(); + m_pScanComThread->quit(); + m_pScanComThread->deleteLater(); + } + if(m_pScanComPort != NULL) + m_pScanComPort->deleteLater(); + + delete ui; +} + +void MainWidget::initialize() +{ + m_pScanComThread = NULL; + m_pScanComPort = NULL; + + memset(&m_expara, 0, sizeof(FileExecPara)); + m_setControlStyle.setUiName(this->objectName()); + + hideMenuFrame(); + + //主界面按钮选中 + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); + + ui->frameForwardBack->setVisible(false); + clearFileInfo();//清除文件信息 + + ui->labelWorkState->setVisible(true); //正常工作/模拟工作 + ui->labelEnableWorkState->setVisible(false);//允许工作/禁止工作 + + memset(&m_mcStatus,0,sizeof(MCStatus)); + + //定时器 + m_pTimer = new QTimer(this); + m_pTimer->setInterval(1000); // 设置定时间隔1秒 + connect(m_pTimer, SIGNAL(timeout()), this, SLOT(onOneSecondTimer())); + + //定时器 + m_pConTimer = new QTimer(this); + m_pConTimer->setInterval(5000); // 设置定时间隔5秒 + connect(m_pConTimer, SIGNAL(timeout()), this, SLOT(onFiveSecondTimer())); + + //定时器 + m_pWifiConTimer = new QTimer(this); + m_pWifiConTimer->setInterval(100000); // 设置定时间隔10分钟 + connect(m_pWifiConTimer, SIGNAL(timeout()), this, SLOT(onTenMiniteTimer())); + + //测试花样刷新的定时器 + m_pRefreshPatternTimer = new QTimer(this); + m_pRefreshPatternTimer->setInterval(300); // 设置时间 + connect(m_pRefreshPatternTimer, SIGNAL(timeout()), this, SLOT(onRefreshPatternTimer())); + + //一分钟定时任务,记录当前系统时间,用于上电时计算关机时间 + m_pMinTimer = new QTimer(this); + m_pMinTimer->setInterval(60000); // 设置定时间隔60秒 + connect(m_pMinTimer, SIGNAL(timeout()), this, SLOT(onOneMinTimer())); + + m_pRefreshVer = new QTimer(this); + m_pRefreshVer->setInterval(1000); + connect(m_pRefreshVer, SIGNAL(timeout()), this, SLOT(onRefreshVer())); + m_pRefreshVer->start(); + + m_curFilePath.clear(); + m_imageZoom = 0;//花样图片缩放值 + m_imageMoveX = 0;//花样图片平移值X + m_imageMoveY = 0;//花样图片平移值Y + m_curDatIdx = 0;//当前针数索引 + m_curPages = 1; // 当前页 + m_itemPerPage = 24;//快捷功能和辅助功能界面各24个按钮 + m_curRpm = -1; + m_workStatus = 0; + m_oldWorkStatus = 0; + m_forwardBackNeedleIdx = 0;//前进回退时的针数索引 + m_ifHMIDecrypt = 1; + m_connectMode = USE_TCP_COMM; + + m_speedLevel = 2;//速度默认等于2 + m_errorCode = 0;//错误代码 +} + +//初始化窗体 +void MainWidget::initAllWindows(s16 ifHMIDecrypt,s16 connectMode) +{ + //int size = sizeof(MCStatus); + m_connectMode = connectMode; + m_ifHMIDecrypt = ifHMIDecrypt; + if (m_initflag <= 1) + { + connect(g_pCurEmbData,SIGNAL(siDrawNeedleIdx(int)),this,SLOT(slotChangeProgressBar(int))); + m_initflag = 2; + sendInitString(QString(tr("Init windows...")));//初始化窗体... + initControl();//初始化界面控件 + initQuickFunBtn();//初始化快捷功能中的快捷按钮 + initAssisitBtn();//初始化辅助功能中的辅助功能按钮 + initPatternSetBtn();//初始化花样设置功能中的功能按钮 + initParaSetBtn();//初始化参数设置功能中的功能按钮 + + m_pMainWidgetFunction = new MainWidgetFunction();//主界面功能函数对象 + m_pMainWidgetFunction->setErrorCodeAndStateList(m_errorCodeAndStateItemList); + connect(m_pMainWidgetFunction,SIGNAL(siSetButtonUserLogo(int)), this, SLOT(slotSetButtonRootLogo(int))); + connect(m_pMainWidgetFunction,SIGNAL(siClearPatternBreakLineNum()),this,SLOT(slotClearPatternBreakLineNum())); + connect(m_pMainWidgetFunction,SIGNAL(siDebugState()),this,SLOT(slotDebugState())); //调试模式改变字体颜色 + connect(m_pMainWidgetFunction,SIGNAL(siClearPattern()), this, SLOT(slotIfFileExist()));//花样总清后,清除当前所选花版路径//两个信号用一个槽 + connect(m_pMainWidgetFunction,SIGNAL(siClearPatternFcg()), this, SLOT(slotClearPatternFcg()));//花样fcg总清后,清除当前所选花版路径 + connect(m_pMainWidgetFunction,SIGNAL(siShowPercentage(int)),this,SLOT(slotShowPercentage(int))); + connect(m_pMainWidgetFunction,SIGNAL(siWifiState(bool)),this,SLOT(slotRefreshWifiIcon(bool))); + + //connect(m_pMainWidgetFunction, SIGNAL(siRecieveLotDat()),this,SLOT(slotLotDat()));//测试物联网用 + connect(g_pMachine, SIGNAL(siDataFilePos(DataFilePos)), + this, SLOT(slotResetAnchorPos(DataFilePos)));// 定位点改变 + + m_pPatternSelectWi = new PatternSelectWidget(this); + m_pPatternSelectWi->hide(); + connect(m_pPatternSelectWi, SIGNAL(siSelectPattern(QString,s16)), this, SLOT(slotShowPatternPara(QString,s16))); + connect(m_pPatternSelectWi, SIGNAL(siPatternEdit(QString)), this, SLOT(slotShowPatternEdit(QString))); + + m_pPatternManageWi = new PatternManageWidget(this); + connect(m_pPatternManageWi, SIGNAL(siDeletePattern()), this, SLOT(slotIfFileExist())); + connect(m_pPatternManageWi, SIGNAL(siReplacePattrn(QString)), this, SLOT(slotReplacePattrn(QString))); + connect(m_pPatternManageWi, SIGNAL(siSelectPattern(QString,s16)), this, SLOT(slotShowPatternPara(QString,s16))); + + m_pPatternEditWi = new PatternEditWidget(this); + connect(m_pPatternEditWi,SIGNAL(siEditPattern()),this,SLOT(slotEditPattern())); + connect(m_pPatternEditWi,SIGNAL(siRemoveOldPng()),m_pPatternSelectWi,SLOT(createCurDirPatterns())); + connect(m_pPatternEditWi,SIGNAL(siEditFinish(s16)),this,SLOT(slotEditPatternFinish(s16))); + m_pPatternEditWi->hide(); + + m_pLineGenerWi = new LineGenerWidget(this); + m_pLineGenerWi->hide(); + connect(m_pLineGenerWi,SIGNAL(siNeedleLayoutPreview(QByteArray&)),this,SLOT(slotTempNeedleLayoutPreview(QByteArray&))); + + m_pPatternNeedleWi = new PatternNeedleLayoutWidget(this); + connect(m_pPatternNeedleWi,SIGNAL(siPatternNeedlePreview()),this,SLOT(slotPatternNeedlePreview())); + m_pPatternNeedleWi->hide(); + + m_pLineGenerWi->setPatternNeedleWi(m_pPatternNeedleWi); + + m_pParameterSetDlg->hide(); + connect(m_pParameterSetDlg,SIGNAL(siUserLogin(s16)),m_pMainWidgetFunction,SLOT(slotUserLogin(s16))); + connect(g_pMachine, SIGNAL(siParaChange(int, int)), + m_pParameterSetDlg, SLOT(paraChange(int, int)));// 参数改变 + + connect(m_pParameterSetDlg,SIGNAL(siHMIDecrypt(QString)),m_pMainWidgetFunction,SLOT(slotHMIDecrypt(QString))); + connect(m_pParameterSetDlg,SIGNAL(siExit()),m_pMainWidgetFunction,SLOT(slotExitApp()));//超级用户退出程序 + connect(m_pParameterSetDlg,SIGNAL(siChangePassword()),m_pMainWidgetFunction,SLOT(slotChangePassword()));//超级用户修改一级密码 + connect(m_pParameterSetDlg,SIGNAL(siDeleteIni()),m_pMainWidgetFunction,SLOT(slotDeleteIni()));//删除执行目录下的config.ini文件 + connect(m_pParameterSetDlg,SIGNAL(siImportCSV()),m_pMainWidgetFunction,SLOT(slotImportCSV())); + connect(m_pParameterSetDlg,SIGNAL(siDeleteCSV()),m_pMainWidgetFunction,SLOT(slotDeleteCSV())); + connect(m_pParameterSetDlg,SIGNAL(siResetCSV()),m_pMainWidgetFunction,SLOT(slotResetCSV())); + connect(m_pParameterSetDlg,SIGNAL(siPatternClear()),m_pMainWidgetFunction,SLOT(slotPatternClear()));//超级用户花样总清 + connect(m_pParameterSetDlg,SIGNAL(siDebugMode()),m_pMainWidgetFunction,SLOT(slotDebugMode()));//超级用户界面调试模式 + + connect(m_pMainWidgetFunction,SIGNAL(siAfterDeleteFileid()),this,SLOT(slotClearPatternFcg()));//超级用户删除花样fcg影响fileid的数据之后 + + m_pPatternManageWi->hide(); + + m_pSensorInputWi->hide(); + m_pControlActionWi->hide(); + connect(this, SIGNAL(siSpeed(int)),m_pControlActionWi,SLOT(slotSpeed(int))); //手动换挡 + + QTimer timer; + connect(&timer, SIGNAL(timeout()), this, SLOT(slotWaitTimout())); + timer.start(1000); + + m_timoutflag = 0; + do + { + QCoreApplication::processEvents(QEventLoop::AllEvents); + }while(m_timoutflag == 0); + timer.stop(); + + sendInitString(QString(tr("Init communication...")));//初始化通讯... + + connect(g_pMachine, SIGNAL(siSensorEnBitmap(SensorsBitmap)), + m_pSensorInputWi, SLOT(slotRefSensorBitmap(SensorsBitmap)));//传感信号有效位图更新信号 + connect(g_pMachine, SIGNAL(siSensorChange(SensorsBitmap)), + m_pSensorInputWi , SLOT(slotRefSensorsDat(SensorsBitmap)));//传感信号更新 + + //显示报错信息 + connect(g_pMachine, SIGNAL(siStatusChange(int)), this, SLOT(slotMachineStatus(int))); + + // 等待通讯结束.... + timer.start(1000); + m_timoutflag = 0; + do + { + QCoreApplication::processEvents(QEventLoop::AllEvents); + }while(m_timoutflag == 0); + timer.stop(); + + refConnectUi(-1);//刷新连接 + + m_pTimer->start();//1秒检查一次连接状态 + m_pConTimer->start();//5秒检查一次连接是否断开,若不需要检测与下位机的心跳包时注释掉此行代码 + //m_pMinTimer->start();//1分钟记录一次当前系统时间 + //m_pMainWidgetFunction->setShutDownTime();//开启计算关机时间 + + //窗体初始化完成后自动加载文件并显示、发送 + m_curFilePath = g_pSettings->readFromIniFile("Pattern/name").toString(); + slotShowPatternPara(m_curFilePath,-1);//不显示花样设置窗体,直接加载花样参数 + + //扫码器 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING) + { + m_pScanComThread = new QThread(this); + m_pScanComPort = new ComPort(); + m_pScanComPort->setComPortName("/dev/ttyS2"); + + m_pScanComPort->moveToThread(m_pScanComThread); + connect(m_pScanComThread, SIGNAL(started()), m_pScanComPort, SLOT(initComm())); + connect(m_pScanComThread, SIGNAL(finished()), m_pScanComPort, SLOT(deleteLater())); // 退出删除对象 + connect(m_pScanComPort, SIGNAL(siReceiveData(QByteArray)), this, SLOT(slotReceScanData(QByteArray))); + + m_pScanComThread->start(); + } + + if(g_emMacType == MACHINE_GLASSFIBRE || g_emMacType == MACHINE_CUTTINGWALK) + { + //文件服务器 + m_pTcpServer = QSharedPointer(new MyTcpServer(this)); //挂在父对象树中 + m_pTcpServerThread = QSharedPointer(new QThread(this)); //挂在父对象树中 + m_pTcpServer.data()->moveToThread(m_pTcpServerThread.data()); + connect(m_pTcpServerThread.data(), SIGNAL(finished()), m_pTcpServer.data(), SLOT(deleteLater())); // 退出删除对象 + //文件传输完成 + connect(m_pTcpServer.data(),SIGNAL(recvFileSuccess(QString)), this, SLOT(slotTcpRecvFile(QString))); + + // 监听特定的端口 如果后续想改端口可以写到配置文件 + if (!m_pTcpServer.data()->listen(QHostAddress::Any, 8081)) { + qDebug() << "FileTrans Server could not start!"; + } else { + qDebug() << "FileTrans Server started!"; + } + + //刀压采集 显示 + m_pKnifeGapParaDlg = QSharedPointer(new KnifeGapParaDialog); + m_pKnifeGapParaDlg.data()->setMainTitle(tr("Display collected data"));//显示采集数据 + m_pKnifeGapParaDlg.data()->setSubTitle(""); + m_pKnifeGapParaDlg.data()->setTypeLogo(m_setControlStyle.getTopStyleSheet("DisplayCollectedData")); + connect(g_pMachine, SIGNAL(siParaChange(int, int)), + m_pKnifeGapParaDlg.data(), SLOT(recvData(int, int)));// 参数改变 + } + + s16 wifi = g_pSettings->readFromIniFile("HMI/wifi").toInt();//是否有wifi + if(wifi == 1) + { + onTenMiniteTimer(); + ui->buttonWifi->setVisible(true); + m_pWifiConTimer->start(); + } + else + { + ui->buttonWifi->setVisible(false); + } + } + connect(g_pMachine, SIGNAL(siDebugInfo()), this, SLOT(slotDebugInfo())); +} + +//不同机型不同的窗体设置 +void MainWidget::initMcTypeWindows() +{ + m_pParameterSetDlg = new ParameterSetDialog(this); + m_pControlActionWi = new ControlActionWidget(this); + m_pSensorInputWi = new SensorInputWidget(this); + + m_quickItemList.clear(); + m_assistItemList.clear(); + m_patternSetItemList.clear(); + m_paraSetItemList.clear(); + + MachineTypeFun * curMachineType = NULL; + int waterMark = g_pSettings->readFromIniFile("HMI/waterMark").toInt();//是否带水印 + Q_UNUSED(waterMark); + + setLabelTitleText(g_emMacType);//根据机型显示主界面标题 + + switch (g_emMacType) { + case MACHINE_HIGHSPEEDSINGLEQUI: //单针绗缝机 + curMachineType = new HighSingleQui(); + break; + case MACHINE_FIVEHEADPRECISIONSEWING: //五头精密缝 + curMachineType = new FiveHeadPrecisionSewing(); + break; + + case MACHINE_CLOTHINGMAC: // 服装机 + curMachineType = new ClothingMac(); + break; + + case MACHINE_MULTINEEDLEROTARY: // 多针旋梭 + curMachineType = new MultiNeedleRotary(); + break; + + case MACHINE_THICK_WIRING: //粗线布线机 + curMachineType = new ThickWiringMac(); + break; + + case MACHINE_FLYSHUTTLE: //飞梭机 + curMachineType = new FlyShuttle(); + break; + + case MACHINE_GLASSFIBRE: + curMachineType = new GlassFibreMac(); + break; + + case MACHINE_CUTTINGWALK: + curMachineType = new CuttingWalk(); + break; + + case MACHINE_DOUBLE_LAYERED: //双层绗缝机 + curMachineType = new DoubleLayeredMac(); + break; + + case MACHINE_DLQSCHE_BOARD: //双层绗缝调度主板 + curMachineType = new DLQScheBoard(); + break; + + case MACHINE_SINGLE_MUTIL_NEEDLE: //单排多针旋梭 + curMachineType = new SingleMutilNeedleMac(); + break; + case MACHINE_DOUBLE_BEDSHEETS: //单排多针旋梭 + curMachineType = new DoubleSidedBedSheets(); + break; + case MACHINE_L2000_MULTI: //L2000多针机 + curMachineType = new L2000MultiMac(); + break; + case MACHINE_FULLYAUTOMATIC: //全自动绗缝机 + curMachineType = new FullyAutoMatic(); + break; + + case MACHINE_PkgFourTestBoard: //包四边机测试板 + curMachineType = new PkgFourSidedTestBoardMac(); + break; + + case MACHINE_AutoDoubleDoor: //全自动双龙门单机头 + curMachineType = new AutoDoubleDoorMac(); + break; + + case MACHINE_DOUBLEHEADQUI: //双头组合绗缝机 + curMachineType = new DoubleHeadCombQui(); + break; + + case MACHINE_FOURHEADQUI://四头绗缝机 + curMachineType = new FourHeadCombQui(); + break; + default: + break; + } + + //初始化快捷按钮列表要在初始化控件前 + m_quickItemList = curMachineType->getShortCutListByFilter(); + m_assistItemList = curMachineType->getAssistListByFilter(); + m_patternSetItemList = curMachineType->getPatternSetListByFilter(); + m_paraSetItemList = curMachineType->getParaSetListByFilter(); + m_pControlActionWi->addItemList(curMachineType->getOutCtrlListByFilter()); + //添加机器参数和工作参数 + m_pParameterSetDlg->addParaItem(curMachineType->getParasListByMcSel()); + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_MACH|PARA_TYPE_WORK); + m_pSensorInputWi->addSensorItems(curMachineType->getSensorList()); + m_pSensorInputWi->addTempSensorItems(curMachineType->getTempSensorList()); + m_nineBtn = curMachineType->getNinebtn(); + m_fileInfo = curMachineType->getFileInfoMSG(); + m_errorCodeAndStateItemList.clear(); + m_errorCodeAndStateItemList = curMachineType->getErrorCodeAndStateList(); + if(curMachineType != NULL) + { + delete curMachineType; + } +} + +void MainWidget::setLabelTitleText(MachineType type) +{ + int i = g_pSettings->readFromIniFile("HMI/waterMark").toInt(); + QString str; + if(i) + { + str += tr("GOA");//再登高 + } + switch (type) + { + + case MACHINE_CUTTINGWALK: //边走边裁 + ui->labelTitle->setText(str + " " + tr("Slicing Control System"));//切割控制系统 + break; + default: + ui->labelTitle->setText(str + " " + tr("Quilting Control System"));//绗缝控制系统 + break; + } +} + +//初始化快捷功能中的快捷按钮 +void MainWidget::initQuickFunBtn() +{ + for(int i = 0; i < m_quickBtnList.size(); i++) + { + if(i < m_quickItemList.size()) + { + m_quickBtnList[i]->setVisible(true); + m_quickLabelList[i]->setVisible(true); + + QString name = m_quickItemList[i].m_name; + m_quickLabelList[i]->setText(name); + + QString topImageName = m_quickItemList[i].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_quickBtnList[i]->setTopImage(btnStyle); + + int enumFun = m_quickItemList[i].m_enumFunction; + if(enumFun == FUN_FORWARDORBACK ||//快进快退 + enumFun == FUN_SETSTARTPOINT ||//定起始点 + enumFun == FUN_BACKSTARTPOINT ||//回起始点 + enumFun == FUN_NULL ||//无功能 + enumFun == FUN_CHECKFRAME //边框检查 + ) + { + if(m_curFilePath.length() <= 0)//未选择文件时快进快退等按钮不可用 + { + m_quickBtnList[i]->setEnabled(false); + } + } + } + else + { + m_quickBtnList[i]->setVisible(false); + m_quickLabelList[i]->setVisible(false); + } + } +} + +//初始化辅助功能中的辅助按钮 +void MainWidget::initAssisitBtn() +{ + for(int i = 0; i < m_assistBtnList.size(); i++) + { + if(i < m_assistItemList.size()) + { + m_assistBtnList[i]->setVisible(true); + m_assistLabelList[i]->setVisible(true); + + QString name = m_assistItemList[i].m_name; + m_assistLabelList[i]->setText(name); + + QString topImageName = m_assistItemList[i].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_assistBtnList[i]->setTopImage(btnStyle); + } + else + { + m_assistBtnList[i]->setVisible(false); + m_assistLabelList[i]->setVisible(false); + } + } +} + +//初始化花样设置功能中的花样设置按钮 +void MainWidget::initPatternSetBtn() +{ + for(int i = 0; i < m_patternSetBtnList.size(); i++) + { + if(i < m_patternSetItemList.size()) + { + m_patternSetBtnList[i]->setVisible(true); + m_patternSetLabelList[i]->setVisible(true); + + QString name = m_patternSetItemList[i].m_name; + m_patternSetLabelList[i]->setText(name); + + QString topImageName = m_patternSetItemList[i].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_patternSetBtnList[i]->setTopImage(btnStyle); + + //无花样时花样参数、花样色序、参数 + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNPARA || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNEDIT || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_NEEDLEPREVIEW) + { + m_patternSetBtnList[i]->setEnabled(false); + } + } + else + { + m_patternSetBtnList[i]->setVisible(false); + m_patternSetLabelList[i]->setVisible(false); + + } + } +} + +//初始化参数设置功能中的参数设置按钮 +void MainWidget::initParaSetBtn() +{ + for(int i = 0; i < m_paraSetBtnList.size(); i++) + { + if(i < m_paraSetItemList.size()) + { + m_paraSetBtnList[i]->setVisible(true); + m_paraSetLabelList[i]->setVisible(true); + + QString name = m_paraSetItemList[i].m_name; + m_paraSetLabelList[i]->setText(name); + + QString topImageName = m_paraSetItemList[i].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_paraSetBtnList[i]->setTopImage(btnStyle); + } + else + { + m_paraSetBtnList[i]->setVisible(false); + m_paraSetLabelList[i]->setVisible(false); + } + } +} + +void MainWidget::initPatternInfo(int beginX, int beginY, int width, int height) +{ + ui->lab_FileName->setVisible(false); + ui->lab_FileName_2->setVisible(false); + ui->lab_Index->setVisible(false); + ui->lab_Index_2->setVisible(false); + ui->lab_StartPoint->setVisible(false); + ui->lab_StartPoint_2->setVisible(false); + ui->lab_Locate->setVisible(false); + ui->lab_Locate_2->setVisible(false); + ui->lab_RangeX->setVisible(false); + ui->lab_Range_21->setVisible(false); + ui->lab_RangeY->setVisible(false); + ui->lab_Range_22->setVisible(false); + ui->lab_Position->setVisible(false); + ui->lab_Position_2->setVisible(false); + ui->lab_Production->setVisible(false); + ui->lab_Production_2->setVisible(false); + ui->lab_Schedule->setVisible(false); + ui->lab_Schedule_2->setVisible(false); + ui->lab_Head2_Position->setVisible(false); + ui->lab_Head2_PositionVal->setVisible(false); + ui->lab_Head2_StartPoint->setVisible(false); + ui->lab_Head2_StartPointVal->setVisible(false); + + QListIterator iter(m_fileInfo); + while (iter.hasNext()) { + PATTERNINFO item = iter.next(); + // 处理 key 和 value + if(item == FileName){ + ui->lab_FileName->setVisible(true); + ui->lab_FileName_2->setVisible(true); + ui->lab_FileName->setGeometry(beginX,beginY,width,height); + ui->lab_FileName_2->setGeometry(beginX,beginY,width,height); + } + else if(item == Index){ + ui->lab_Index->setVisible(true); + ui->lab_Index_2->setVisible(true); + ui->lab_Index->setGeometry(beginX,beginY,width,height); + ui->lab_Index_2->setGeometry(beginX,beginY,width,height); + } + else if(item == BeginPoint){ + ui->lab_StartPoint->setVisible(true); + ui->lab_StartPoint_2->setVisible(true); + ui->lab_StartPoint->setGeometry(beginX,beginY,width,height); + ui->lab_StartPoint_2->setGeometry(beginX,beginY,width,height); + } + else if(item == BeginPoint2){ + ui->lab_Head2_StartPoint->setVisible(true); + ui->lab_Head2_StartPointVal->setVisible(true); + ui->lab_Head2_StartPoint->setGeometry(beginX,beginY,width,height); + ui->lab_Head2_StartPointVal->setGeometry(beginX,beginY,width,height); + } + else if(item == Schedule){ + ui->lab_Schedule->setVisible(true); + ui->lab_Schedule_2->setVisible(true); + ui->lab_Schedule->setGeometry(beginX,beginY,width,height); + ui->lab_Schedule_2->setGeometry(beginX,beginY,width,height); + } + else if(item == LocalPoint){ + ui->lab_Locate->setVisible(true); + ui->lab_Locate_2->setVisible(true); + ui->lab_Locate->setGeometry(beginX,beginY,width,height); + ui->lab_Locate_2->setGeometry(beginX,beginY,width,height); + } + else if(item == RangeX){ + ui->lab_RangeX->setVisible(true); + ui->lab_Range_21->setVisible(true); + ui->lab_RangeX->setGeometry(beginX,beginY,width,height); + ui->lab_Range_21->setGeometry(beginX,beginY,width,height); + } + else if(item == RangeY){ + ui->lab_RangeY->setVisible(true); + ui->lab_Range_22->setVisible(true); + ui->lab_RangeY->setGeometry(beginX,beginY,width,height); + ui->lab_Range_22->setGeometry(beginX,beginY,width,height); + } + else if(item == Position){ + ui->lab_Position->setVisible(true); + ui->lab_Position_2->setVisible(true); + ui->lab_Position->setGeometry(beginX,beginY,width,height); + ui->lab_Position_2->setGeometry(beginX,beginY,width,height); + } + else if(item == Position2){ + ui->lab_Head2_Position->setVisible(true); + ui->lab_Head2_PositionVal->setVisible(true); + ui->lab_Head2_Position->setGeometry(beginX,beginY,width,height); + ui->lab_Head2_PositionVal->setGeometry(beginX,beginY,width,height); + } + else if(item == Production){ + ui->lab_Production->setVisible(true); + ui->lab_Production_2->setVisible(true); + ui->lab_Production->setGeometry(beginX,beginY,width,height); + ui->lab_Production_2->setGeometry(beginX,beginY,width,height); + } + else if(item == ZCoor){ + ui->lab_Locate->setVisible(true); + ui->lab_Locate_2->setVisible(true); + ui->lab_Locate->setGeometry(beginX,beginY,width,height); + ui->lab_Locate_2->setGeometry(beginX,beginY,width,height); + } + beginY += height; + } +} + +void MainWidget::setFrameNineBtnStyle() +{ + switch (m_speedLevel) + { + case 1: + ui->buttonNineBtnMiddle->setTopImage(m_setControlStyle.getTopStyleSheet("frameNineBtnMiddle_1")); + break; + case 2: + ui->buttonNineBtnMiddle->setTopImage(m_setControlStyle.getTopStyleSheet("frameNineBtnMiddle_2")); + break; + case 3: + ui->buttonNineBtnMiddle->setTopImage(m_setControlStyle.getTopStyleSheet("frameNineBtnMiddle_3")); + break; + default: + ui->buttonNineBtnMiddle->setTopImage(m_setControlStyle.getTopStyleSheet("frameNineBtnMiddle1")); + break; + } +} + +//清除文件信息 +void MainWidget::clearFileInfo() +{ + ui->lab_FileName_2->setText(""); + ui->lab_Index_2->setText("0/0"); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->lab_StartPoint_2->setText("0,0"); + ui->lab_Head2_StartPointVal->setText("0,0"); + } + else + { + ui->lab_StartPoint_2->setText("0/0"); + } + ui->lab_Locate_2->setText("0/0"); + ui->lab_Range_21->setText("0/0"); + ui->lab_Range_22->setText("0/0"); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->lab_Position_2->setText("0/0"); + ui->lab_Head2_PositionVal->setText("0/0"); + } + else + { + ui->lab_Position_2->setText("0/0"); + } + ui->lab_Production_2->setText("0"); + ui->lab_Schedule_2->setText("0%"); +} + +//初始化窗体控件,包括位置、尺寸、样式 +void MainWidget::initControl() +{ + ui->buttonShortCutPgDn->setVisible(false); + ui->buttonShortCutPgUp->setVisible(false); + ui->labelShortCutPage->setVisible(false); + ui->buttonAssistPgDn->setVisible(false); + ui->buttonAssistPgUp->setVisible(false); + ui->labelAssistPage->setVisible(false); + + m_quickBtnList.clear(); + m_quickBtnList.append(ui->buttonQuick1); + m_quickBtnList.append(ui->buttonQuick2); + m_quickBtnList.append(ui->buttonQuick3); + m_quickBtnList.append(ui->buttonQuick4); + m_quickBtnList.append(ui->buttonQuick5); + m_quickBtnList.append(ui->buttonQuick6); + m_quickBtnList.append(ui->buttonQuick7); + m_quickBtnList.append(ui->buttonQuick8); + m_quickBtnList.append(ui->buttonQuick9); + m_quickBtnList.append(ui->buttonQuick10); + m_quickBtnList.append(ui->buttonQuick11); + m_quickBtnList.append(ui->buttonQuick12); + m_quickBtnList.append(ui->buttonQuick13); + m_quickBtnList.append(ui->buttonQuick14); + m_quickBtnList.append(ui->buttonQuick15); + m_quickBtnList.append(ui->buttonQuick16); + m_quickBtnList.append(ui->buttonQuick17); + m_quickBtnList.append(ui->buttonQuick18); + m_quickBtnList.append(ui->buttonQuick19); + m_quickBtnList.append(ui->buttonQuick20); + m_quickBtnList.append(ui->buttonQuick21); + m_quickBtnList.append(ui->buttonQuick22); + m_quickBtnList.append(ui->buttonQuick23); + m_quickBtnList.append(ui->buttonQuick24); + + ui->buttonQuick25->setVisible(false); + ui->buttonQuick26->setVisible(false); + ui->buttonQuick27->setVisible(false); + ui->buttonQuick28->setVisible(false); + + for(int i = 0; i < m_quickBtnList.size(); i++) + { + connect(m_quickBtnList.at(i), + SIGNAL(clicked()), + this, + SLOT(slotQuickBtnClick()) + ); + } + + m_quickLabelList.clear(); + m_quickLabelList.append(ui->labelQuick1); + m_quickLabelList.append(ui->labelQuick2); + m_quickLabelList.append(ui->labelQuick3); + m_quickLabelList.append(ui->labelQuick4); + m_quickLabelList.append(ui->labelQuick5); + m_quickLabelList.append(ui->labelQuick6); + m_quickLabelList.append(ui->labelQuick7); + m_quickLabelList.append(ui->labelQuick8); + m_quickLabelList.append(ui->labelQuick9); + m_quickLabelList.append(ui->labelQuick10); + m_quickLabelList.append(ui->labelQuick11); + m_quickLabelList.append(ui->labelQuick12); + m_quickLabelList.append(ui->labelQuick13); + m_quickLabelList.append(ui->labelQuick14); + m_quickLabelList.append(ui->labelQuick15); + m_quickLabelList.append(ui->labelQuick16); + m_quickLabelList.append(ui->labelQuick17); + m_quickLabelList.append(ui->labelQuick18); + m_quickLabelList.append(ui->labelQuick19); + m_quickLabelList.append(ui->labelQuick20); + m_quickLabelList.append(ui->labelQuick21); + m_quickLabelList.append(ui->labelQuick22); + m_quickLabelList.append(ui->labelQuick23); + m_quickLabelList.append(ui->labelQuick24); + + ui->labelQuick25->setVisible(false); + ui->labelQuick26->setVisible(false); + ui->labelQuick27->setVisible(false); + ui->labelQuick28->setVisible(false); + + m_assistBtnList.clear(); + m_assistBtnList.append(ui->buttonAssist1); + m_assistBtnList.append(ui->buttonAssist2); + m_assistBtnList.append(ui->buttonAssist3); + m_assistBtnList.append(ui->buttonAssist4); + m_assistBtnList.append(ui->buttonAssist5); + m_assistBtnList.append(ui->buttonAssist6); + m_assistBtnList.append(ui->buttonAssist7); + m_assistBtnList.append(ui->buttonAssist8); + m_assistBtnList.append(ui->buttonAssist9); + m_assistBtnList.append(ui->buttonAssist10); + m_assistBtnList.append(ui->buttonAssist11); + m_assistBtnList.append(ui->buttonAssist12); + m_assistBtnList.append(ui->buttonAssist13); + m_assistBtnList.append(ui->buttonAssist14); + m_assistBtnList.append(ui->buttonAssist15); + m_assistBtnList.append(ui->buttonAssist16); + m_assistBtnList.append(ui->buttonAssist17); + m_assistBtnList.append(ui->buttonAssist18); + m_assistBtnList.append(ui->buttonAssist19); + m_assistBtnList.append(ui->buttonAssist20); + m_assistBtnList.append(ui->buttonAssist21); + m_assistBtnList.append(ui->buttonAssist22); + m_assistBtnList.append(ui->buttonAssist23); + m_assistBtnList.append(ui->buttonAssist24); + + ui->buttonAssist25->setVisible(false); + ui->buttonAssist26->setVisible(false); + ui->buttonAssist27->setVisible(false); + ui->buttonAssist28->setVisible(false); + + for(int i = 0; i < m_assistBtnList.size(); i++) + { + connect(m_assistBtnList.at(i), + SIGNAL(clicked()), + this, + SLOT(slotAssistBtnClick()) + ); + } + + m_assistLabelList.clear(); + m_assistLabelList.append(ui->labelAssist1); + m_assistLabelList.append(ui->labelAssist2); + m_assistLabelList.append(ui->labelAssist3); + m_assistLabelList.append(ui->labelAssist4); + m_assistLabelList.append(ui->labelAssist5); + m_assistLabelList.append(ui->labelAssist6); + m_assistLabelList.append(ui->labelAssist7); + m_assistLabelList.append(ui->labelAssist8); + m_assistLabelList.append(ui->labelAssist9); + m_assistLabelList.append(ui->labelAssist10); + m_assistLabelList.append(ui->labelAssist11); + m_assistLabelList.append(ui->labelAssist12); + m_assistLabelList.append(ui->labelAssist13); + m_assistLabelList.append(ui->labelAssist14); + m_assistLabelList.append(ui->labelAssist15); + m_assistLabelList.append(ui->labelAssist16); + m_assistLabelList.append(ui->labelAssist17); + m_assistLabelList.append(ui->labelAssist18); + m_assistLabelList.append(ui->labelAssist19); + m_assistLabelList.append(ui->labelAssist20); + m_assistLabelList.append(ui->labelAssist21); + m_assistLabelList.append(ui->labelAssist22); + m_assistLabelList.append(ui->labelAssist23); + m_assistLabelList.append(ui->labelAssist24); + + ui->labelAssist25->setVisible(false); + ui->labelAssist26->setVisible(false); + ui->labelAssist27->setVisible(false); + ui->labelAssist28->setVisible(false); + + m_patternSetBtnList.clear(); + m_patternSetBtnList.append(ui->buttonPatternSet1); + m_patternSetBtnList.append(ui->buttonPatternSet2); + m_patternSetBtnList.append(ui->buttonPatternSet3); + m_patternSetBtnList.append(ui->buttonPatternSet4); + m_patternSetBtnList.append(ui->buttonPatternSet5); + m_patternSetBtnList.append(ui->buttonPatternSet6); + m_patternSetBtnList.append(ui->buttonPatternSet7); + m_patternSetBtnList.append(ui->buttonPatternSet8); + m_patternSetBtnList.append(ui->buttonPatternSet9); + m_patternSetBtnList.append(ui->buttonPatternSet10); + m_patternSetBtnList.append(ui->buttonPatternSet11); + m_patternSetBtnList.append(ui->buttonPatternSet12); + m_patternSetBtnList.append(ui->buttonPatternSet13); + m_patternSetBtnList.append(ui->buttonPatternSet14); + + for(int i = 0; i < m_patternSetBtnList.size(); i++) + { + connect(m_patternSetBtnList.at(i), + SIGNAL(clicked()), + this, + SLOT(slotPatternSetBtnClick()) + ); + } + + m_patternSetLabelList.append(ui->labelPatternSet1); + m_patternSetLabelList.append(ui->labelPatternSet2); + m_patternSetLabelList.append(ui->labelPatternSet3); + m_patternSetLabelList.append(ui->labelPatternSet4); + m_patternSetLabelList.append(ui->labelPatternSet5); + m_patternSetLabelList.append(ui->labelPatternSet6); + m_patternSetLabelList.append(ui->labelPatternSet7); + m_patternSetLabelList.append(ui->labelPatternSet8); + m_patternSetLabelList.append(ui->labelPatternSet9); + m_patternSetLabelList.append(ui->labelPatternSet10); + m_patternSetLabelList.append(ui->labelPatternSet11); + m_patternSetLabelList.append(ui->labelPatternSet12); + m_patternSetLabelList.append(ui->labelPatternSet13); + m_patternSetLabelList.append(ui->labelPatternSet14); + + m_paraSetBtnList.clear(); + m_paraSetBtnList.append(ui->buttonParaType1); + m_paraSetBtnList.append(ui->buttonParaType2); + m_paraSetBtnList.append(ui->buttonParaType3); + m_paraSetBtnList.append(ui->buttonParaType4); + m_paraSetBtnList.append(ui->buttonParaType5); + m_paraSetBtnList.append(ui->buttonParaType6); + m_paraSetBtnList.append(ui->buttonParaType7); + m_paraSetBtnList.append(ui->buttonParaType8); + m_paraSetBtnList.append(ui->buttonParaType9); + m_paraSetBtnList.append(ui->buttonParaType10); + m_paraSetBtnList.append(ui->buttonParaType11); + m_paraSetBtnList.append(ui->buttonParaType12); + m_paraSetBtnList.append(ui->buttonParaType13); + m_paraSetBtnList.append(ui->buttonParaType14); + + for(int i = 0; i < m_paraSetBtnList.size(); i++) + { + connect(m_paraSetBtnList.at(i), + SIGNAL(clicked()), + this, + SLOT(slotParaTypeBtnClick()) + ); + } + + m_paraSetLabelList.append(ui->labelParaType1); + m_paraSetLabelList.append(ui->labelParaType2); + m_paraSetLabelList.append(ui->labelParaType3); + m_paraSetLabelList.append(ui->labelParaType4); + m_paraSetLabelList.append(ui->labelParaType5); + m_paraSetLabelList.append(ui->labelParaType6); + m_paraSetLabelList.append(ui->labelParaType7); + m_paraSetLabelList.append(ui->labelParaType8); + m_paraSetLabelList.append(ui->labelParaType9); + m_paraSetLabelList.append(ui->labelParaType10); + m_paraSetLabelList.append(ui->labelParaType11); + m_paraSetLabelList.append(ui->labelParaType12); + m_paraSetLabelList.append(ui->labelParaType13); + m_paraSetLabelList.append(ui->labelParaType14); + + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void MainWidget::initResolution() +{ +#define TITLE_HEIGHT (24) // 标题栏高度 +#define STATE_HEIGHT (36) // 状态栏高度 + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + //字体设置,双头组合字体小一号,因为右上角信息会显示不全 + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + setViewFont(fontSize_M_DoubleHead()); + } + else + { + setViewFont(fontSize_M()); + } + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + {// 标题栏 + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameUp->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,TITLE_HEIGHT*factoryY); + ui->buttonMove->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,TITLE_HEIGHT*factoryY); + ui->buttonMove->setEnabled(false); + ui->labelTitle->setGeometry(GLB_EDGE_WIGHT*factoryX,(TITLE_HEIGHT - GLB_EDGE_WIGHT)/2*factoryY, + (GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,TITLE_HEIGHT*factoryY); + + ui->labelHMIVersion->setGeometry(GLB_EDGE_WIGHT*factoryX,(TITLE_HEIGHT - GLB_EDGE_WIGHT)/2*factoryY, + (GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,TITLE_HEIGHT*factoryY); + + //最小化按钮 关闭按钮 +#ifdef Q_OS_WIN + QPushButton *pBtnMini = new QPushButton(this); + pBtnMini->setGeometry((740 - TITLE_HEIGHT)*factoryX , 0, TITLE_HEIGHT*factoryX, TITLE_HEIGHT*factoryY); + pBtnMini->setStyleSheet(m_setControlStyle.getStyleSheet("btnMini")); + + QPushButton *pBtnClose = new QPushButton(this); + pBtnClose->setGeometry(740*factoryX , 0, TITLE_HEIGHT*factoryX, TITLE_HEIGHT*factoryY); + pBtnClose->setStyleSheet(m_setControlStyle.getStyleSheet("btnClose")); + + connect(pBtnClose, SIGNAL(clicked(bool)), this, SLOT(close())); + connect(pBtnMini, SIGNAL(clicked(bool)), this, SLOT(showMinimized())); +#endif + } + + {//下方状态栏 + ui->frameDown->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-STATE_HEIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,STATE_HEIGHT*factoryY); + + ui->labelScreenshot->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,STATE_HEIGHT*factoryY);//截屏 + ui->labelState->setGeometry(GLB_EDGE_WIGHT*factoryX,0*factoryY,(GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,STATE_HEIGHT*factoryY); + ui->labelTime->setGeometry(GLB_EDGE_WIGHT*factoryX,0*factoryY,(GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,STATE_HEIGHT*factoryY);//时间 + + ui->progressBar->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_WIGHT-2)*factoryY,(GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,2*factoryY); // 进度条 + ui->labelWorkState->setGeometry(540*factoryX,0*factoryY,100*factoryX,STATE_HEIGHT*factoryY);//模拟工作 + ui->labelEnableWorkState->setGeometry(680*factoryX,GLB_BAS_WIGHT*factoryY,GLB_SICON_SIZE*factoryX,GLB_SICON_SIZE*factoryY);//显示工作状态 + ui->buttonConnect->setGeometry(720*factoryX,GLB_BAS_WIGHT*factoryY,GLB_SICON_SIZE*factoryX,GLB_SICON_SIZE*factoryY);//链接状态 + ui->buttonUser->setGeometry(740*factoryX,GLB_BAS_WIGHT*factoryY,GLB_SICON_SIZE*factoryX,GLB_SICON_SIZE*factoryY);//用户 + ui->buttonWifi->setGeometry(700*factoryX,GLB_BAS_WIGHT*factoryY,GLB_SICON_SIZE*factoryX,GLB_SICON_SIZE*factoryY); + } + + {//左侧主按钮 + ui->frameMainFunction->setGeometry(0*factoryX,(TITLE_HEIGHT + GLB_BAS_WIGHT)*factoryY, + (GLB_EDGE_WIGHT+ GLB_LICON_SIZE+GLB_BAS_WIGHT)*factoryX, + (GLB_SCR_HEIGHT - TITLE_HEIGHT-STATE_HEIGHT-GLB_BAS_WIGHT*2)*factoryY);// x坐标 y坐标 宽高 + + ui->buttonPatternSet->setGeometry(GLB_EDGE_WIGHT*factoryX,0*factoryY, + GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY);//花样设定按钮 + ui->buttonParaSet->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_LICON_SIZE+ GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*1*factoryY, + GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY);//参数设定按钮 + ui->buttonShortcutFunction->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_LICON_SIZE+ GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*2*factoryY, + GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY);//快捷功能按钮 + ui->buttonAccessFunction->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_LICON_SIZE+ GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*3*factoryY, + GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY);//辅助功能按钮 + ui->buttonMainMenu->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_LICON_SIZE+ GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*4*factoryY, + GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY);//主界面按钮 + + ui->labelPatternSet->setGeometry(GLB_BAS_WIGHT*factoryX,(GLB_LICON_SIZE + GLB_ICON_TEXT)*factoryY, + ((GLB_EDGE_WIGHT-GLB_BAS_WIGHT)*2 + GLB_LICON_SIZE)*factoryX,GLB_TEXT_HEIGHT*factoryY);//花样设定文本框 + ui->labelParaSet->setGeometry(GLB_BAS_WIGHT*factoryX,((GLB_LICON_SIZE + GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*1+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY, + ((GLB_EDGE_WIGHT-GLB_BAS_WIGHT)*2 + GLB_LICON_SIZE)*factoryX,GLB_TEXT_HEIGHT*factoryY);//参数设定文本框 + ui->labelShortcutFunction->setGeometry(GLB_BAS_WIGHT*factoryX,((GLB_LICON_SIZE + GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*2+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY, + ((GLB_EDGE_WIGHT-GLB_BAS_WIGHT)*2 + GLB_LICON_SIZE)*factoryX,GLB_TEXT_HEIGHT*factoryY);//快捷功能文本框 + ui->labelAccessFunction->setGeometry(GLB_BAS_WIGHT*factoryX,((GLB_LICON_SIZE + GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*3+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY, + ((GLB_EDGE_WIGHT-GLB_BAS_WIGHT)*2 + GLB_LICON_SIZE)*factoryX,GLB_TEXT_HEIGHT*factoryY);//辅助功能文本框 + ui->labelMainMenu->setGeometry(GLB_BAS_WIGHT*factoryX,((GLB_LICON_SIZE + GLB_TEXT_HEIGHT + GLB_BAS_WIGHT*2)*4+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY, + ((GLB_EDGE_WIGHT-GLB_BAS_WIGHT)*2 + GLB_LICON_SIZE)*factoryX,GLB_TEXT_HEIGHT*factoryY);//主界面文本框 + } + + + {//花样显示区域 +#define FRAME_LEFT (102) // 小窗口 +#define FRAME_TOP (36) +#define FRAME_WIGHT (654) +#define FRAME_HEIGHT (512) + +#define H_MAX_NUM (6) // 横向最大图标数量 +#define V_MAX_NUM (4) // 纵向最大图标数量 + +#define ICON_LEFT ((FRAME_WIGHT - GLB_LICON_SIZE * H_MAX_NUM)/(H_MAX_NUM+1)) // 图标左侧间距 +#define ICON_TOP ((FRAME_HEIGHT - GLB_EDGE_WIGHT - (GLB_LICON_SIZE+GLB_TEXT_HEIGHT*2+GLB_BAS_WIGHT) * V_MAX_NUM)/(V_MAX_NUM+1)) // 图标上侧间距 +#define ICON_HEIGHT (GLB_LICON_SIZE+GLB_TEXT_HEIGHT*2+GLB_BAS_WIGHT+ICON_TOP) // 图标高度 + + int hNum,vNum; + + ui->frameMenuBack->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY);//二级菜单的白色背景显示不齐 -rq + + ui->framePatternView->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY); + ui->labelPatternView->setGeometry(GLB_BAS_WIGHT*factoryX,GLB_BAS_WIGHT*factoryY,(FRAME_WIGHT-GLB_BAS_WIGHT*2)*factoryX,(FRAME_HEIGHT-GLB_BAS_WIGHT*2)*factoryY); //灰色花样图 + + {//花样设置 + ui->framePatternSet->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY); + hNum = 6;//每行6个 + vNum = 2;//总共2行 + for(int i = 0; i < vNum; i++) + { + for(int j = 0; j < hNum; j++) + { + m_patternSetBtnList[i*hNum+j]->setGeometry((ICON_LEFT+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,(ICON_TOP+ICON_HEIGHT*i)*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + m_patternSetLabelList[i*hNum+j]->setGeometry((ICON_LEFT*2/3+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,((ICON_TOP+ICON_HEIGHT*i)+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY,(GLB_LICON_SIZE+ICON_LEFT*2/3)*factoryX,GLB_TEXT_HEIGHT*3*factoryY); + } + } + } + + {//参数设置 + ui->frameParaSet->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY); + hNum = 6;//每行6个 + vNum = 2;//总共2行 + for(int i = 0; i < vNum; i++) + { + for(int j = 0; j < hNum; j++) + { + m_paraSetBtnList[i*hNum+j]->setGeometry((ICON_LEFT+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,(ICON_TOP+ICON_HEIGHT*i)*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + m_paraSetLabelList[i*hNum+j]->setGeometry((ICON_LEFT*2/3+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,((ICON_TOP+ICON_HEIGHT*i)+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY,(GLB_LICON_SIZE+ICON_LEFT*2/3)*factoryX,GLB_TEXT_HEIGHT*3*factoryY); + } + } + } + + {//快捷功能 + hNum = 6;//每行6个 + vNum = 4;//总共4行 + ui->frameShortcutFunction->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY);//(108,36,707,513) + for(int i = 0; i < vNum; i++) + { + for(int j = 0; j < hNum; j++) + { + m_quickBtnList[i*hNum+j]->setGeometry((ICON_LEFT+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,(ICON_TOP+ICON_HEIGHT*i)*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + m_quickLabelList[i*hNum+j]->setGeometry((ICON_LEFT*2/3+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,((ICON_TOP+ICON_HEIGHT*i)+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY,(GLB_LICON_SIZE+ICON_LEFT*2/3)*factoryX,GLB_TEXT_HEIGHT*3*factoryY); + } + } + ui->buttonShortCutPgUp->setGeometry(426*factoryX,465*factoryY,80*factoryX,30*factoryY); + ui->buttonShortCutPgDn->setGeometry(536*factoryX,465*factoryY,80*factoryX,30*factoryY); + ui->labelShortCutPage->setGeometry(326*factoryX,465*factoryY,80*factoryX,30*factoryY); + ui->buttonAssistPgUp->setGeometry(426*factoryX,465*factoryY,80*factoryX,30*factoryY); + ui->buttonAssistPgDn->setGeometry(536*factoryX,465*factoryY,80*factoryX,30*factoryY); + ui->labelAssistPage->setGeometry(326*factoryX,465*factoryY,80*factoryX,30*factoryY); + } + + {//辅助功能 + if(g_emTheme == theme2) + { + ui->frameAccessFunction->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,1004*factoryX,FRAME_HEIGHT*factoryY); + hNum = 7;//每行7个 + vNum = 3;//总共3行 最多6x4=24个 + for(int i = 0; i < vNum; i++) + { + for(int j = 0; j < hNum; j++) + { + m_assistLabelList[i*hNum+j]->setWordWrap(true); + m_assistBtnList[i*hNum+j]->setGeometry((40+120*j)*factoryX,(24+120*i)*factoryY,58*factoryX,58*factoryY); + m_assistLabelList[i*hNum+j]->setGeometry((8+120*j)*factoryX,(88+120*i)*factoryY,120*factoryX,100*factoryY); + + } + } + } + else + { + ui->frameAccessFunction->setGeometry(FRAME_LEFT*factoryX,FRAME_TOP*factoryY,FRAME_WIGHT*factoryX,FRAME_HEIGHT*factoryY); + hNum = 6;//每行6个 + vNum = 4;//总共4行 + for(int i = 0; i < vNum; i++) + { + for(int j = 0; j < hNum; j++) + { + m_assistBtnList[i*hNum+j]->setGeometry((ICON_LEFT+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,(ICON_TOP+ICON_HEIGHT*i)*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + m_assistLabelList[i*hNum+j]->setGeometry((ICON_LEFT*2/3+(ICON_LEFT+GLB_LICON_SIZE)*j)*factoryX,((ICON_TOP+ICON_HEIGHT*i)+(GLB_LICON_SIZE + GLB_ICON_TEXT))*factoryY,(GLB_LICON_SIZE+ICON_LEFT*2/3)*factoryX,GLB_TEXT_HEIGHT*3*factoryY);//字体显示不全 -rq + } + } + } + } + } + + {//右上方花样信息 +#define INFO_LEFT (772) +#define INFO_TOP (36) +#define INFO_WIGHT (235) +#define INFO_HEIGHT (262) + + if(g_emTheme == theme2 && m_nineBtnShowFlag == true) + { + ui->frameEmbInfo->setGeometry(647*factoryX,36*factoryY,360*factoryX,512*factoryY); + initPatternInfo(12*factoryX, 12*factoryY, (311)*factoryX, (32)*factoryY); + } + else + { + ui->frameEmbInfo->setGeometry(INFO_LEFT*factoryX,INFO_TOP*factoryY,INFO_WIGHT*factoryX,INFO_HEIGHT*factoryY); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + initPatternInfo(GLB_BAS_WIGHT*factoryX, 6*factoryY, (INFO_WIGHT-GLB_BAS_WIGHT*2)*factoryX, (GLB_TEXT_HEIGHT+6)*factoryY); + } + else + { + initPatternInfo(GLB_BAS_WIGHT*factoryX, GLB_BAS_WIGHT*factoryY, (INFO_WIGHT-GLB_BAS_WIGHT*2)*factoryX, (GLB_TEXT_HEIGHT+GLB_BAS_WIGHT)*factoryY); + } + m_nineBtnShowFlag = true; + } + } + + {//九宫格 +#define NINE_LEFT (772) +#define NINE_TOP (312) +#define NINE_WIGHT (235) +#define NINE_HEIGHT (235) + +#define NINE_BUT_SIZE (70) // 九宫格按尺寸 +#define NINE_BAS_WIGHT ((NINE_WIGHT - NINE_BUT_SIZE*3) /2) + +#define LED_W (42) // 数码管宽 +#define LED_H (56) // 数码管高 + + ui->frameFunctionBtn->setGeometry(NINE_LEFT*factoryX, + NINE_TOP*factoryY, + NINE_WIGHT*factoryX, + NINE_HEIGHT*factoryY);// x y w h + + ui->frameSpeed->setGeometry(0*factoryX,0*factoryY, + NINE_WIGHT*factoryX, + NINE_HEIGHT*factoryY); + + ui->labelSpeed->setGeometry(4*factoryX,4*factoryY, + (NINE_WIGHT-8)*factoryX, + (NINE_BUT_SIZE-4)*factoryY);//显示机器运行速度的数字的数码管 + + int ledL = (NINE_WIGHT-(LED_W*4))/2; + int ledT = (NINE_BUT_SIZE-LED_H)/2; + + ui->labelSpeed1->setGeometry(ledL*factoryX,ledT*factoryY,LED_W*factoryX,LED_H*factoryY); + ui->labelSpeed2->setGeometry((ledL+LED_W)*factoryX,ledT*factoryY,LED_W*factoryX,LED_H*factoryY); + ui->labelSpeed3->setGeometry((ledL+LED_W*2)*factoryX,ledT*factoryY,LED_W*factoryX,LED_H*factoryY); + ui->labelSpeed4->setGeometry((ledL+LED_W*3)*factoryX,ledT*factoryY,LED_W*factoryX,LED_H*factoryY); + + ui->buttonSpeedDec->setGeometry(4*factoryX,(NINE_BAS_WIGHT + NINE_BUT_SIZE)*factoryY, + ((NINE_WIGHT - NINE_BAS_WIGHT)/2-8)*factoryX, + (NINE_BUT_SIZE-NINE_BAS_WIGHT)*factoryY); + + ui->buttonSpeedAdd->setGeometry(((NINE_WIGHT - NINE_BAS_WIGHT)/2 + NINE_BAS_WIGHT + 4)*factoryX, + (NINE_BAS_WIGHT + NINE_BUT_SIZE)*factoryY, + ((NINE_WIGHT - NINE_BAS_WIGHT)/2-8)*factoryX, + (NINE_BUT_SIZE-NINE_BAS_WIGHT)*factoryY); + + ui->buttonStartStop->setGeometry(4*factoryX, + (NINE_BAS_WIGHT + NINE_BUT_SIZE*2)*factoryY, + (NINE_WIGHT-8)*factoryX, + (NINE_BUT_SIZE+NINE_BAS_WIGHT)*factoryY); + + ui->frameSpeed->hide(); + ui->labelSpeed->hide(); + ui->labelSpeed1->hide(); + ui->labelSpeed2->hide(); + ui->labelSpeed3->hide(); + ui->labelSpeed4->hide(); + ui->buttonSpeedAdd->hide(); + ui->buttonSpeedDec->hide(); + ui->buttonStartStop->hide(); + + if(g_emTheme == theme2 && m_nineBtnShowFlag == true) + { + ui->frameNineBtn->setGeometry(20*factoryX,20*factoryY,472*factoryX,472*factoryY); + ui->buttonNineBtn1->setGeometry(0*factoryX,0*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtnUp->setGeometry(164*factoryX,0*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtn2->setGeometry(328*factoryX,0*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtnLeft->setGeometry(0*factoryX,164*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtnMiddle->setGeometry(164*factoryX,164*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtnRight->setGeometry(328*factoryX,164*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtn3->setGeometry(0*factoryX,328*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtnDown->setGeometry(164*factoryX,328*factoryY,140*factoryX,140*factoryY); + ui->buttonNineBtn4->setGeometry(328*factoryX,328*factoryY,140*factoryX,140*factoryY); + } + else + { +#define GAP_X (NINE_BUT_SIZE + NINE_BAS_WIGHT) +#define GAP_Y (NINE_BUT_SIZE + NINE_BAS_WIGHT) + ui->frameNineBtn->setGeometry(0*factoryX,0*factoryY,236*factoryX,236*factoryY); + ui->buttonNineBtn1->setGeometry(0*factoryX,0*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtnUp->setGeometry(GAP_X*factoryX,0*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtn2->setGeometry(GAP_X*2*factoryX,0*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtnLeft->setGeometry(0*factoryX,GAP_Y*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtnMiddle->setGeometry(GAP_X*factoryX,GAP_Y*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtnRight->setGeometry(GAP_X*2*factoryX,GAP_Y*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtn3->setGeometry(0*factoryX,GAP_Y*2*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtnDown->setGeometry(GAP_X*factoryX,GAP_Y*2*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + ui->buttonNineBtn4->setGeometry(GAP_X*2*factoryX,GAP_Y*2*factoryY,NINE_BUT_SIZE*factoryX,NINE_BUT_SIZE*factoryY); + m_nineBtnShowFlag = true; + } + } + + {//快进回退 +#define JUMP_LEFT (772) // 小窗口 +#define JUMP_TOP (36) +#define JUMP_WIGHT (235) +#define JUMP_HEIGHT (512) + + ui->frameForwardBack->setGeometry(JUMP_LEFT*factoryX,JUMP_TOP*factoryY,JUMP_WIGHT*factoryX,JUMP_HEIGHT*factoryY); + ui->frameForwardBackBack->setGeometry(0*factoryX,0*factoryY,JUMP_WIGHT*factoryX,JUMP_HEIGHT*factoryY); + ui->labelForwardBackTitle->setGeometry(20*factoryX,8*factoryY,(JUMP_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + + ui->labelNeedleIdx->setGeometry(20*factoryX,42*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelNeedleCurAndTotal->setGeometry(42*factoryX,42*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelAngle->setGeometry(124*factoryX,42*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelAngleValue->setGeometry(146*factoryX,42*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->labelDx->setGeometry(20*factoryX,62*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelDxValue->setGeometry(42*factoryX,62*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelDy->setGeometry(124*factoryX,62*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelDyValue->setGeometry(146*factoryX,62*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->labelAx->setGeometry(20*factoryX,84*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelAxValue->setGeometry(42*factoryX,84*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelAy->setGeometry(124*factoryX,84*factoryY,20*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelAyValue->setGeometry(146*factoryX,84*factoryY,80*factoryX,GLB_TEXT_HEIGHT*factoryY); + +#define JUMP_BUTFAR_HEIGHT (420) // 按钮区域高度 +#define JUMP_BUTFAR_TOP (JUMP_HEIGHT-JUMP_BUTFAR_HEIGHT) + +#define JUMP_BUT_WIGHT GLB_MBUT_WIGHT +#define JUMP_BUT_HEIGHT GLB_MBUT_HEIGHT + +#define JUMP_BUT_GAP_X ((JUMP_WIGHT - JUMP_BUT_WIGHT*2)/3) +#define JUMP_BUT_GAP_Y ((JUMP_BUTFAR_HEIGHT - JUMP_BUT_HEIGHT*8)/10) + + ui->buttonNeedleBegin->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*0+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleEnd->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*0+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonNeedleDec1->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*1+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleAdd1->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*1+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonNeedleDec10->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*2+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleAdd10->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*2+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonNeedleDec100->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*3+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleAdd100->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*3+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonNeedleDec1000->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*4+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleAdd1000->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*4+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonNeedleDec10000->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*5+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonNeedleAdd10000->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*5+20)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + + ui->buttonForwardBackOk->setGeometry(JUMP_BUT_GAP_X*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*7)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + ui->buttonForwardBackCancel->setGeometry((JUMP_BUT_GAP_X*2+JUMP_BUT_WIGHT)*factoryX,(JUMP_BUTFAR_TOP+JUMP_BUT_GAP_Y+JUMP_BUT_GAP_Y+(JUMP_BUT_GAP_Y+JUMP_BUT_HEIGHT)*7)*factoryY, + JUMP_BUT_WIGHT*factoryX,JUMP_BUT_HEIGHT*factoryY); + } +} + +//初始化窗体控件样式 +void MainWidget::initControlStyle() +{ + //上状态栏时间 + ui->labelTime->setStyleSheet(titleTextColour()); + ui->labelTime->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + ui->buttonWifi->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonWifi->objectName()+"Unconnect")); + + //背景透明 + ui->frameUp->setStyleSheet(transparentStyle()); + ui->frameMainFunction->setStyleSheet(transparentStyle()); + ui->frameAccessFunction->setStyleSheet(transparentStyle()); + ui->framePatternSet->setStyleSheet(transparentStyle()); + ui->frameShortcutFunction->setStyleSheet(transparentStyle()); + ui->frameParaSet->setStyleSheet(transparentStyle()); + ui->frameDown->setStyleSheet(transparentStyle()); + ui->frameEmbInfo->setStyleSheet(darkgrayStyle()); + + ui->framePatternView->setStyleSheet(ashenStyle()); + ui->frameFunctionBtn->setStyleSheet(transparentStyle()); + QString style = "background-color: rgb(246, 242, 239);outline:none;border:0px;border-radius:" + borderRadius() + "px;"; + ui->frameMenuBack->setStyleSheet(style); + + //设置控件图标 + //背景图 + int waterMark = g_pSettings->readFromIniFile("HMI/waterMark").toInt();//是否带水印 + QString backGroundImgPath; + if(waterMark == 1) + { + backGroundImgPath = m_setControlStyle.getBorderImageStyleSheet(this->objectName()); + } + else if(waterMark == 0) + { + backGroundImgPath = m_setControlStyle.getBorderImageStyleSheet(this->objectName() + "_NoWaterMark"); + } + + ui->frameBack->setStyleSheet(backGroundImgPath); + if(g_emDebugMode == debugMode) + { + ui->labelTitle->setText(tr("Debugging mode"));//调试模式!! + ui->labelTitle->setStyleSheet(warnTextColour()); + } + else + { + if(waterMark==1)//带logo + { + ui->labelTitle->setStyleSheet(titleTextColour()); + } + else + { + ui->labelTitle->setStyleSheet(titleTextColour()); + } + } + + //获得绘制区域的背景图,用于embdata绘制刷新图形时的背景 + int x = ui->labelPatternView->x() + ui->framePatternView->x(); + int y = ui->labelPatternView->y() + ui->framePatternView->y(); + QImage MainWidgetPix; + MainWidgetPix.load(getBackImagePath(waterMark));//主界面背景图 + if(g_emResolut == resolution0804) + { + x +=15; + } + + //从主界面背景图截取等于labelPatternView的背景图 + m_embBackPix = QPixmap(ui->labelPatternView->width(),ui->labelPatternView->height()); + m_embBackPix = QPixmap::fromImage(MainWidgetPix.copy(x,y,m_embBackPix.width(),m_embBackPix.height())); + + //状态图标 + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName()+"Unconnected")); + ui->buttonUser->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonUser->objectName())); + + //主功能键图标 + ui->labelMainMenu->setStyleSheet(mainIconTextColour()); + ui->labelPatternSet->setStyleSheet(mainIconTextColour()); + ui->labelAccessFunction->setStyleSheet(mainIconTextColour()); + ui->labelParaSet->setStyleSheet(mainIconTextColour()); + ui->labelShortcutFunction->setStyleSheet(mainIconTextColour()); + + //ui->buttonMainMenu->setCheckedBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonMainMenu->parent()->objectName())); + ui->buttonMainMenu->setStyleSheet(mainIconStyle()); + ui->buttonMainMenu->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonMainMenu->objectName())); + ui->buttonPatternSet->setStyleSheet(mainIconStyle()); + ui->buttonPatternSet->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonPatternSet->objectName())); + ui->buttonAccessFunction->setStyleSheet(mainIconStyle()); + ui->buttonAccessFunction->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonAccessFunction->objectName())); + ui->buttonParaSet->setStyleSheet(mainIconStyle()); + ui->buttonParaSet->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonParaSet->objectName())); + ui->buttonShortcutFunction->setStyleSheet(mainIconStyle()); + ui->buttonShortcutFunction->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonShortcutFunction->objectName())); + + //速度加减图标 + ui->labelSpeed->setStyleSheet(m_setControlStyle.getStyleSheet("labelSpeed")); + ui->buttonStartStop->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonStartStop->objectName())); + ui->buttonStartStop->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonStartStop->objectName())); + ui->buttonSpeedAdd->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonSpeedAdd->objectName())); + ui->buttonSpeedAdd->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonSpeedAdd->objectName())); + ui->buttonSpeedDec->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonSpeedDec->parent()->objectName())); + ui->buttonSpeedDec->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonSpeedDec->objectName())); + ui->buttonSpeedDec->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonSpeedDec->objectName())); + + //信息 + ui->lab_FileName->setText(tr("File")); //文件 + ui->lab_Index->setText(tr("Idx")); //索引 + ui->lab_Schedule->setText(tr("Sched")); //进度 + ui->lab_StartPoint->setText(tr("StartPos")); // 起始点 + ui->lab_Head2_StartPoint->setText(tr("StartPos")+"2"); // 起始点2 + ui->lab_Locate->setText(tr("LocPos")); // 定位点 + ui->lab_RangeX->setText(tr("RG-X")); // 范围 + ui->lab_RangeY->setText(tr("RG-Y")); // 范围 + ui->lab_Position->setText(tr("Pos")); //位置 + ui->lab_Head2_Position->setText(tr("Pos")+"2"); //位置2 + ui->lab_Production->setText(tr("Prod")); //产量 + ui->lab_FileName->setAlignment(Qt::AlignLeft); + ui->lab_Index->setAlignment(Qt::AlignLeft); + ui->lab_StartPoint->setAlignment(Qt::AlignLeft); + ui->lab_Head2_StartPoint->setAlignment(Qt::AlignLeft); + ui->lab_Locate->setAlignment(Qt::AlignLeft); + ui->lab_RangeX->setAlignment(Qt::AlignLeft); + ui->lab_RangeY->setAlignment(Qt::AlignLeft); + ui->lab_Position->setAlignment(Qt::AlignLeft); + ui->lab_Head2_Position->setAlignment(Qt::AlignLeft); + ui->lab_Production->setAlignment(Qt::AlignLeft); + ui->lab_Schedule->setAlignment(Qt::AlignLeft); + ui->lab_FileName_2->setAlignment(Qt::AlignRight); + ui->lab_Index_2->setAlignment(Qt::AlignRight); + ui->lab_StartPoint_2->setAlignment(Qt::AlignRight); + ui->lab_Head2_StartPointVal->setAlignment(Qt::AlignRight); + ui->lab_Locate_2->setAlignment(Qt::AlignRight); + ui->lab_Range_21->setAlignment(Qt::AlignRight); + ui->lab_Range_22->setAlignment(Qt::AlignRight); + ui->lab_Position_2->setAlignment(Qt::AlignRight); + ui->lab_Head2_PositionVal->setAlignment(Qt::AlignRight); + ui->lab_Production_2->setAlignment(Qt::AlignRight); + ui->lab_Schedule_2->setAlignment(Qt::AlignRight); + + ui->lab_FileName->setStyleSheet(stateTextColour()); + ui->lab_Index->setStyleSheet(stateTextColour()); + ui->lab_StartPoint->setStyleSheet(stateTextColour()); + ui->lab_Head2_StartPoint->setStyleSheet(stateTextColour()); + ui->lab_Locate->setStyleSheet(stateTextColour()); + ui->lab_RangeX->setStyleSheet(stateTextColour()); + ui->lab_RangeY->setStyleSheet(stateTextColour()); + ui->lab_Position->setStyleSheet(stateTextColour()); + ui->lab_Head2_Position->setStyleSheet(stateTextColour()); + ui->lab_Production->setStyleSheet(stateTextColour()); + ui->lab_FileName_2->setStyleSheet(stateTextColour()); + ui->lab_Index_2->setStyleSheet(stateTextColour()); + ui->lab_StartPoint_2->setStyleSheet(stateTextColour()); + ui->lab_Head2_StartPointVal->setStyleSheet(stateTextColour()); + ui->lab_Locate_2->setStyleSheet(stateTextColour()); + ui->lab_Range_21->setStyleSheet(stateTextColour()); + ui->lab_Range_22->setStyleSheet(stateTextColour()); + ui->lab_Position_2->setStyleSheet(stateTextColour()); + ui->lab_Head2_PositionVal->setStyleSheet(stateTextColour()); + ui->lab_Production_2->setStyleSheet(stateTextColour()); + ui->lab_Schedule->setStyleSheet(stateTextColour()); + ui->lab_Schedule_2->setStyleSheet(stateTextColour()); + + //九宫格图标 + ui->buttonNineBtnUp->setBottomImage(m_setControlStyle.getBottomStyleSheet("buttonNineBtn")); + ui->buttonNineBtnDown->setBottomImage(m_setControlStyle.getBottomStyleSheet("buttonNineBtn")); + ui->buttonNineBtnLeft->setBottomImage(m_setControlStyle.getBottomStyleSheet("buttonNineBtn")); + ui->buttonNineBtnMiddle->setBottomImage(m_setControlStyle.getBottomStyleSheet("buttonNineBtn")); + ui->buttonNineBtnRight->setBottomImage(m_setControlStyle.getBottomStyleSheet("buttonNineBtn")); + + ui->buttonNineBtnUp->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonNineBtnUp->objectName())); + ui->buttonNineBtnDown->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonNineBtnDown->objectName())); + ui->buttonNineBtnLeft->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonNineBtnLeft->objectName())); + ui->buttonNineBtnMiddle->setTopImage(m_setControlStyle.getTopStyleSheet("frameNineBtnMiddle_2"));//默认速度等级为2 + ui->buttonNineBtnRight->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonNineBtnRight->objectName())); + + ui->buttonNineBtn1->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonNineBtn1->parent()->objectName())); + ui->buttonNineBtn2->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonNineBtn2->parent()->objectName())); + ui->buttonNineBtn3->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonNineBtn3->parent()->objectName())); + ui->buttonNineBtn4->setBottomImage(m_setControlStyle.getBottomStyleSheet(ui->buttonNineBtn4->parent()->objectName())); + + ui->buttonNineBtn1->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(1).m_topImageName)); + ui->buttonNineBtn2->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(2).m_topImageName)); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->buttonNineBtn3->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(3).m_topImageName+"1")); + } + else + { + ui->buttonNineBtn3->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(3).m_topImageName)); + } + ui->buttonNineBtn4->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(4).m_topImageName)); + + //快进快退 + ui->frameForwardBack->setStyleSheet(transparentStyle()); + QString frameForwardBackBackImgPath = m_setControlStyle.getStyleSheet(ui->frameForwardBackBack->objectName()); + + ui->frameForwardBackBack->setStyleSheet(frameForwardBackBackImgPath); + ui->labelForwardBackTitle->setStyleSheet(titleTextColour()); + ui->labelForwardBackTitle->setFont(fontSize_L()); + ui->labelNeedleIdx->setStyleSheet(titleTextColour()); + ui->labelNeedleCurAndTotal->setStyleSheet(titleTextColour()); + ui->labelAngle->setStyleSheet(titleTextColour()); + ui->labelAngleValue->setStyleSheet(titleTextColour()); + ui->labelDx->setStyleSheet(titleTextColour()); + ui->labelDxValue->setStyleSheet(titleTextColour()); + ui->labelDy->setStyleSheet(titleTextColour()); + ui->labelDyValue->setStyleSheet(titleTextColour()); + ui->labelAx->setStyleSheet(titleTextColour()); + ui->labelAxValue->setStyleSheet(titleTextColour()); + ui->labelAy->setStyleSheet(titleTextColour()); + ui->labelAyValue->setStyleSheet(titleTextColour()); + ui->buttonNeedleBegin->setStyleSheet(numButtonStyle()); + ui->buttonNeedleEnd->setStyleSheet(numButtonStyle()); + ui->buttonNeedleAdd1->setStyleSheet(numButtonStyle()); + ui->buttonNeedleDec10000->setStyleSheet(numButtonStyle()); + ui->buttonNeedleAdd10->setStyleSheet(numButtonStyle()); + ui->buttonNeedleAdd100->setStyleSheet(numButtonStyle()); + ui->buttonNeedleAdd1000->setStyleSheet(numButtonStyle()); + ui->buttonNeedleAdd10000->setStyleSheet(numButtonStyle()); + ui->buttonNeedleDec1->setStyleSheet(numButtonStyle()); + ui->buttonNeedleDec10->setStyleSheet(numButtonStyle()); + ui->buttonNeedleDec100->setStyleSheet(numButtonStyle()); + ui->buttonNeedleDec1000->setStyleSheet(numButtonStyle()); + + ui->buttonForwardBackOk->setStyleSheet(confirmIconStyle()); + ui->buttonForwardBackCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->frameNineBtn->setStyleSheet(transparentStyle()); + ui->buttonNineBtnUp->setDirectionButtonStyle(); + ui->buttonNineBtnDown->setDirectionButtonStyle(); + ui->buttonNineBtnMiddle->setDirectionButtonStyle(); + ui->buttonNineBtnLeft->setDirectionButtonStyle(); + ui->buttonNineBtnRight->setDirectionButtonStyle(); + ui->buttonNineBtn1->setDirectionButtonStyle(); + ui->buttonNineBtn2->setDirectionButtonStyle(); + ui->buttonNineBtn3->setDirectionButtonStyle(); + ui->buttonNineBtn4->setDirectionButtonStyle(); + ui->buttonForwardBackOk->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonForwardBackOk->objectName()),4); + ui->buttonForwardBackCancel->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonForwardBackCancel->objectName()),4); + }else + { + ui->buttonForwardBackOk->setTopImage(m_setControlStyle.getSharedTopStyleSheet("buttonOk"),0,0,0,0); + ui->buttonForwardBackCancel->setTopImage(m_setControlStyle.getSharedTopStyleSheet("buttonCancel"),0,0,0,0); + } + + //花样设置功能图标 + for(int i = 0; i < m_patternSetLabelList.size(); i++) + { + m_patternSetLabelList[i]->setWordWrap(true); + m_patternSetLabelList[i]->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + //底图相同 + m_patternSetBtnList[i]->setStyleSheet(classIconStyle()); + } + + //参数设置功能图标 + for(int i = 0; i < m_paraSetLabelList.size(); i++) + { + m_paraSetLabelList[i]->setWordWrap(true); + m_paraSetLabelList[i]->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + //底图相同 + m_paraSetBtnList[i]->setStyleSheet(classIconStyle()); + } + + //快捷功能图标 + for(int i = 0; i < m_quickLabelList.size(); i++) + { + m_quickLabelList[i]->setWordWrap(true); + m_quickLabelList[i]->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + //28个快捷按钮的底图相同 + m_quickBtnList[i]->setStyleSheet(classIconStyle()); + } + + //辅助功能图标 + for(int i = 0; i < m_assistLabelList.size(); i++) + { + m_assistLabelList[i]->setWordWrap(true); + m_assistLabelList[i]->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + //28个快捷按钮的底图相同 + m_assistBtnList[i]->setStyleSheet(classIconStyle()); + } + + ui->buttonShortCutPgUp->setStyleSheet(flippingStyle()); + ui->buttonShortCutPgDn->setStyleSheet(flippingStyle()); + ui->buttonShortCutPgUp->setFont(fontSize_M()); + ui->buttonShortCutPgDn->setFont(fontSize_M()); + + ui->buttonAssistPgUp->setStyleSheet(flippingStyle()); + ui->buttonAssistPgDn->setStyleSheet(flippingStyle()); + ui->buttonAssistPgUp->setFont(fontSize_M()); + ui->buttonAssistPgDn->setFont(fontSize_M()); + + ui->labelAssistPage->setFont(fontSize_S()); + ui->labelShortCutPage->setFont(fontSize_S()); + + //下方状态及版本 + ui->progressBar->setStyleSheet(progressStyle()); + ui->progressBar->setValue(0); + ui->labelState->setStyleSheet(titleTextColour()); + ui->labelState->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); + ui->labelWorkState->setFont(fontSize_M()); + ui->labelWorkState->setStyleSheet(titleTextColour()); + ui->labelWorkState->setAlignment(Qt::AlignCenter); + ui->labelHMIVersion->setStyleSheet(titleTextColour()); + +} + +//获取背景图的加载路径 +QString MainWidget::getBackImagePath(s16 waterMark) +{ + //<分辨率><主题><窗体名称><图片名称> + QString path = ":/images/"; + + //分辨率 + QString str; + str.clear(); + switch (g_emResolut) + { + case resolution1910: + str = "_1910_logo.png"; + break; + case resolution1006: + str = "_1006_logo.png"; + break; + case resolution0804: + str = "_1006_logo.png"; + break; + default: + break; + } + + path += this->objectName() + "/" + this->objectName(); + if(waterMark == 0)//无水印 + { + path += "_NoWaterMark" + str; + } + else + { + path += str; + } + + //qDebug()< "9") + { + return; + } + } + + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + //ui->labelScreenshot->setStyleSheet(setControlStyle.getStyleSheet("labelScreenshot")); + + if(speedsize == 1)//如果是一位数 + {//4显示 + ui->labelSpeed1->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed2->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed3->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + QString getnum; + getnum = speed.mid(0,1); + QString str_label_3 = "Speed" + getnum; + ui->labelSpeed4->setStyleSheet(setControlStyle.getStyleSheet(str_label_3)); + + } + else if (speedsize == 2)//如果是2位 + {//3,4显示 + ui->labelSpeed1->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed2->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + QString getnum; + getnum = speed.mid(0,1); //十位 + QString str_label_2 = "Speed" + getnum; + ui->labelSpeed3->setStyleSheet(setControlStyle.getStyleSheet(str_label_2)); + + getnum = speed.mid(1,1); //个位 + QString str_label_3 = "Speed" + getnum; + ui->labelSpeed4->setStyleSheet(setControlStyle.getStyleSheet(str_label_3)); + } + else if (speedsize == 3) + { + ui->labelSpeed1->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + + QString getnum; + getnum = speed.mid(0,1); //百位 + QString str_label_2 = "Speed" + getnum; + ui->labelSpeed2->setStyleSheet(setControlStyle.getStyleSheet(str_label_2)); + + getnum = speed.mid(1,1); //十位 + QString str_label_3 = "Speed" + getnum; + ui->labelSpeed3->setStyleSheet(setControlStyle.getStyleSheet(str_label_3)); + + getnum = speed.mid(2,1); //个位 + QString str_label_4 = "Speed" + getnum; + ui->labelSpeed4->setStyleSheet(setControlStyle.getStyleSheet(str_label_4)); + + } + else if (speedsize == 4)//如果是4位数 + { + QString getnum; + + getnum = speed.mid(0,1); //百位 + QString str_label_1 = "Speed" + getnum; + ui->labelSpeed1->setStyleSheet(setControlStyle.getStyleSheet(str_label_1)); + + getnum = speed.mid(1,1); //百位 + QString str_label_2 = "Speed" + getnum; + ui->labelSpeed2->setStyleSheet(setControlStyle.getStyleSheet(str_label_2)); + + getnum = speed.mid(2,1); //十位 + QString str_label_3 = "Speed" + getnum; + ui->labelSpeed3->setStyleSheet(setControlStyle.getStyleSheet(str_label_3)); + + getnum = speed.mid(3,1); //个位 + QString str_label_4 = "Speed" + getnum; + ui->labelSpeed4->setStyleSheet(setControlStyle.getStyleSheet(str_label_4)); + } + else + { + ui->labelSpeed1->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed2->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed3->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + ui->labelSpeed4->setStyleSheet(setControlStyle.getStyleSheet("SpeedShut")); + } +} + +void MainWidget::setViewFont(QFont font) +{ + //字体设置 + ui->labelTime->setFont(font); + ui->labelMainMenu->setFont(font); + ui->labelPatternSet->setFont(font); + ui->labelAccessFunction->setFont(font); + ui->labelParaSet->setFont(font); + ui->labelShortcutFunction->setFont(font); + ui->lab_FileName_2->setFont(font); + ui->lab_Index_2->setFont(font); + ui->lab_StartPoint_2->setFont(font); + ui->lab_Head2_StartPointVal->setFont(font); + ui->lab_Locate_2->setFont(font); + ui->lab_Range_21->setFont(font); + ui->lab_Range_22->setFont(font); + ui->lab_Position_2->setFont(font); + ui->lab_Schedule->setFont(font); + ui->lab_Schedule_2->setFont(font); + ui->lab_Production_2->setFont(font); + ui->lab_FileName->setFont(font); + ui->lab_Index->setFont(font); + ui->lab_StartPoint->setFont(font); + ui->lab_Head2_StartPoint->setFont(font); + ui->lab_Locate->setFont(font); + ui->lab_RangeX->setFont(font); + ui->lab_RangeY->setFont(font); + ui->lab_Position->setFont(font); + ui->lab_Head2_Position->setFont(font); + ui->lab_Head2_PositionVal->setFont(font); + ui->lab_Production->setFont(font); + ui->labelForwardBackTitle->setFont(font); + ui->labelNeedleIdx->setFont(font); + ui->labelNeedleCurAndTotal->setFont(font); + ui->labelAngle->setFont(font); + ui->labelAngleValue->setFont(font); + ui->labelDx->setFont(font); + ui->labelDxValue->setFont(font); + ui->labelDy->setFont(font); + ui->labelDyValue->setFont(font); + ui->labelAx->setFont(font); + ui->labelAxValue->setFont(font); + ui->labelAy->setFont(font); + ui->labelAyValue->setFont(font); + ui->labelTitle->setFont(font); + //快捷功能图标 + for(int i = 0; i < m_quickLabelList.size(); i++) + { + m_quickLabelList[i]->setFont(font); + m_quickLabelList[i]->setStyleSheet(classIconTextColour()); + } + + //辅助功能图标 + for(int i = 0; i < m_assistLabelList.size(); i++) + { + m_assistLabelList[i]->setFont(font); + m_assistLabelList[i]->setStyleSheet(classIconTextColour()); + } + + //花样设置功能图标 + for(int i = 0; i < m_patternSetLabelList.size(); i++) + { + m_patternSetLabelList[i]->setFont(font); + m_patternSetLabelList[i]->setStyleSheet(classIconTextColour()); + } + + //参数设置功能图标 + for(int i = 0; i < m_paraSetLabelList.size(); i++) + { + m_paraSetLabelList[i]->setFont(font); + m_paraSetLabelList[i]->setStyleSheet(classIconTextColour()); + } + ui->labelState->setFont(font); + ui->labelHMIVersion->setFont(font); +} + +void MainWidget::refreshPageUi(s16 type) +{ + if(m_itemPerPage <= 0)//界面每页按钮数 + { + return; + } + + //----------- + int itemNum, pageNums; + itemNum = pageNums = 0; + + if(type == INTERFACE_SHORTCUT) + { + itemNum = m_quickItemList.size();//快捷功能列表 + } + else if(type == INTERFACE_ACCESS) + { + itemNum = m_assistItemList.size();//辅助功能列表 + } + + pageNums = (itemNum+m_itemPerPage-1) / m_itemPerPage;//计算总页数 + + if (m_curPages > pageNums) // 当前页 + { + m_curPages = pageNums; + } + if (m_curPages <= 1) + { + m_curPages = 1; + } + + // 刷新文本和图标 + int i, itemidx; + itemidx = (m_curPages-1) * m_itemPerPage; + for (i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) //itemNum 从绣花参数一共有的按钮功能,可以是28+个 + { + if(type == INTERFACE_SHORTCUT) + { + QString name = m_quickItemList[itemidx].m_name; + m_quickLabelList[i]->setText(name); + m_quickLabelList.at(i)->show();//名称 + + QString topImageName = m_quickItemList[itemidx].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_quickBtnList[i]->setTopImage(btnStyle); + m_quickBtnList.at(i)->show(); + } + else if(type == INTERFACE_ACCESS) + { + QString name = m_assistItemList[itemidx].m_name; + m_assistLabelList[i]->setText(name); + m_assistLabelList.at(i)->show();//名称 + + QString topImageName = m_assistItemList[itemidx].m_topImageName; + //加载按钮顶图图标 + QString btnStyle = m_setControlStyle.getTopStyleSheet(topImageName); + m_assistBtnList[i]->setTopImage(btnStyle); + m_assistBtnList.at(i)->show(); + } + } + else + { + if(type == INTERFACE_SHORTCUT) + { + m_quickBtnList.at(i)->hide();//按钮 + m_quickLabelList.at(i)->hide();//名称 + } + else if(type == INTERFACE_ACCESS) + { + m_assistBtnList.at(i)->hide();//按钮 + m_assistLabelList.at(i)->hide();//名称 + } + } + itemidx++; + } + + // 刷新按钮 + if (m_curPages <= 1) + { + if(type == INTERFACE_SHORTCUT) + { + ui->buttonShortCutPgUp->setEnabled(false); + } + else if(type == INTERFACE_ACCESS) + { + ui->buttonAssistPgUp->setEnabled(false); + } + } + else + { + if(type == INTERFACE_SHORTCUT) + { + ui->buttonShortCutPgUp->setEnabled(true);//上一页按钮显示 + } + else if(type == INTERFACE_ACCESS) + { + ui->buttonAssistPgUp->setEnabled(true); + } + } + if (m_curPages >= pageNums)//当前页大于等于总页数 + { + if(type == INTERFACE_SHORTCUT) + { + ui->buttonShortCutPgDn->setEnabled(false); + } + else if(type == INTERFACE_ACCESS) + { + ui->buttonAssistPgDn->setEnabled(false); + } + } + else + { + if(type == INTERFACE_SHORTCUT) + { + ui->buttonShortCutPgDn->setEnabled(true); + } + else if(type == INTERFACE_ACCESS) + { + ui->buttonAssistPgDn->setEnabled(true); + } + } + + if(pageNums == 0) + { + m_curPages = 0; + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(pageNums);//页数: + if(type == INTERFACE_SHORTCUT) + { + ui->labelShortCutPage->setText(str); + } + else if(type == INTERFACE_ACCESS) + { + ui->labelAssistPage->setText(str); + } +} + +//发送初始化字符串 +void MainWidget::sendInitString(QString str) +{ + Qt::Alignment alignment = Qt::AlignHCenter|Qt::AlignBottom; // 设置一个格式 + emit(siSendLoadingMessage(str, alignment, Qt::red)); +} + +//刷新连接状态(1秒) +void MainWidget::refConnectUi(int alive) +{ + alive = 0; + refConnectUi(g_pMachine, m_linkSta, alive); +} + +//刷新连接状态 +void MainWidget::refConnectUi(Machine *pMachine, int &linkSta, int alive) +{ + if(m_ifHMIDecrypt == 0) + { + return; + } + + if(m_connectMode == USE_SERIAL_COMM)//串口连接方式 + { + if(linkSta != pMachine->isConnected()) + { + linkSta = pMachine->isConnected(); + if(linkSta == Connected) + { + if (pMachine != NULL) + { + //连接后获取机器信息,用于获得剩余可用时间,小于5天主动提示用户 + //此条语句需放在前面 + pMachine->getInfoFromMachine(); + + pMachine->getSensorEnBmpFromMachine();//读取传感器信号 + pMachine->getParasFromMachine();//获取参数 + m_pMinTimer->start();//1分钟记录一次当前系统时间 ,连接成功以后开启计时器,记录时间 -rq + m_pMainWidgetFunction->setShutDownTime();//计算关机时间 + + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName())); + ui->labelState->setText(tr("Connected"));//状态:已连接 + } + } + else + { + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName()+"Unconnected")); + ui->labelState->setText(tr("Not connected"));//状态:未连接 + } + } + } + else + { + if (pMachine != NULL) + { + if (linkSta != pMachine->isConnected() || + pMachine->isConnected() == Connectting || + alive == -1) + { + if (alive == -1) + { + linkSta = 0; + } + else + { + linkSta = pMachine->isConnected();//获取连接状态 + } + + if (linkSta == Connectting)//连接中... + { + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName()+"Connecting")); + ui->labelState->setText(tr("Connnecting..."));//状态:连接中... + } + else if (linkSta == Connected)//已连接 + { + //连接后获取机器信息,用于获得剩余可用时间,小于5天主动提示用户 + //此条语句需放在前面 + pMachine->getInfoFromMachine(); + + pMachine->getSensorEnBmpFromMachine();//读取传感器信号 + pMachine->getParasFromMachine();//获取参数 + m_pMinTimer->start();//1分钟记录一次当前系统时间 ,连接成功以后开启计时器,记录时间 -rq + m_pMainWidgetFunction->setShutDownTime();//计算关机时间 + + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName())); + ui->labelState->setText(tr("Connected"));//状态:已连接 + + /*** + 界面启动时也会发送最后绣作的花样文件, + 连接成功后也会发送,但连接速度快,此时ds数据可能还没转换完成, + 所以连接成功后发送文件可能不成功,只是界面加载时会发送文件, + 因此二者不会重复发送文件;若断开连接再连接时此段代码会发送文件, + 界面加载部分不会发送; + ***/ + QByteArray ds16dat = g_pCurEmbData->getDsDat();//获得ds16数据 + //如果当前所选文件路径不为空与ds16数据不为空时 + if(m_curFilePath.length() > 0 && ds16dat.size() > 0) + { + //m_pMainWidgetFunction->sendPatternData(m_curFilePath);//发送花样数据 + //设置为按进度执行模式 + //g_pCurEmbData->setExecIndex(m_curDatIdx); // 设置进度 + } + } + else//未连接 + { + ui->buttonConnect->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonConnect->objectName()+"Unconnected")); + ui->labelState->setText(tr("Not connected"));//状态:未连接 + } + } + } + } +} + +//隐藏菜单栏(frame) +void MainWidget::hideMenuFrame() +{ + ui->frameMenuBack->setVisible(false); + ui->framePatternView->setVisible(false); + ui->framePatternSet->setVisible(false); + ui->frameParaSet->setVisible(false); + ui->frameAccessFunction->setVisible(false); + ui->frameShortcutFunction->setVisible(false); + + //设置按钮为非选中状态 + ui->buttonPatternSet->setChecked(false); + ui->buttonPatternSet->setCheckable(false); + ui->buttonAccessFunction->setChecked(false); + ui->buttonAccessFunction->setCheckable(false); + ui->buttonParaSet->setChecked(false); + ui->buttonParaSet->setCheckable(false); + ui->buttonShortcutFunction->setChecked(false); + ui->buttonShortcutFunction->setCheckable(false); + ui->buttonMainMenu->setChecked(false); + ui->buttonMainMenu->setCheckable(false); +} + +//根据文件格式不同显示不同花样参数 +void MainWidget::showDiffPara(QString ext,s16 setFlag) +{ + if(setFlag == 0) + { + s16 widthFlag = 0; + s16 heightFlag = 0; + + memset((char*)&m_patternSetPara,0,sizeof(PatternSetPara));//初始化结构体所有成员变量为0 + //得到花样参数 + if(ext == "DST") + { + //绣花花样参数-花样设置参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_PATTERN,PATTERNPARA_SORT_DSTR); + + DstHead *head = new DstHead; + memset((char*)head,0,sizeof(DstHead)); + DataFileDst dst; + dst.initFile(m_curFilePath); + DstHead *rhead = dst.getDstHead(); + memcpy((char*)head,(char*)rhead,sizeof(DstHead)); + + dst.getBeginXYAndAnchorXY(head->startX,head->startY,head->anchorX,head->anchorY); + + if(g_emMacType==MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)//对飞梭机进行判断是否花样文件起终点x是否一致 + { + dst.convertDataToAbs(); + QByteArray testAry = dst.getEmbAbsData(); + xDataWhetherSame(testAry); + } + + // if(g_emMacType==MACHINE_THICK_WIRING)//对粗线布线机的"旋转角度调整"赋值 + // { + // m_patternSetPara.rotation = head->rotation; + // } + m_patternSetPara.rotateStyle = head->rotateStyle; + m_patternSetPara.rotateAngle = head->rotateAngle; + m_patternSetPara.scanX = head->scanX; + m_patternSetPara.scanY = head->scanY; + m_patternSetPara.left = head->left; + m_patternSetPara.front = head->front; + m_patternSetPara.reinMode = head->reinMode; + m_patternSetPara.reinNeedles = head->reinNeedles; + m_patternSetPara.reinNum = head->reinNum; + m_patternSetPara.normalStep = head->normalStep; + m_patternSetPara.angleCorrOffset = head->angleCorrOffset; + m_patternSetPara.angleCorrPosX = head->angleCorrPosX; + m_patternSetPara.angleCorrPosY = head->angleCorrPosY; + m_patternSetPara.angleCorrNegX = head->angleCorrNegX; + m_patternSetPara.angleCorrNegY = head->angleCorrNegY; + m_patternSetPara.startX = head->startX; + m_patternSetPara.startY = head->startY; + m_patternSetPara.anchorX = head->anchorX; + m_patternSetPara.anchorY = head->anchorY; + + if(m_patternSetPara.scanX == 0 || m_patternSetPara.scanY == 0) + { + dst.convertDataToAbs(); + if(m_patternSetPara.scanX == 0) + { + m_patternSetPara.scanX = dst.getMaxX() - dst.getMinX(); + } + if(m_patternSetPara.scanY == 0) + { + m_patternSetPara.scanY = dst.getMaxY() - dst.getMinY(); + } + } + } + else if(ext == "DSR") + { + //绣花花样参数-花样设置参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_PATTERN,PATTERNPARA_SORT_DSTR); + + DsrHead *head = new DsrHead; + memset((char*)head,0,sizeof(DsrHead)); + DataFileDsr dsr; + dsr.initFile(m_curFilePath); + DsrHead *rhead = dsr.getDsrHead(); + memcpy((char*)head,(char*)rhead,sizeof(DsrHead)); + + dsr.getBeginXYAndAnchorXY(*(int*)&head->startX,*(int*)&head->startY,*(int*)&head->anchorX,*(int*)&head->anchorY); //coco 屏蔽粗线布线机 + + if(g_emMacType==MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)//对飞梭机进行判断是否花样文件起终点x是否一致 + { + dsr.convertDataToEmbAbs(); + QByteArray testAry = dsr.getEmbAbsData(); + xDataWhetherSame(testAry); + } + + //if(g_emMacType==MACHINE_THICK_WIRING)//对粗线布线机的"旋转角度调整"赋值 + //{ + // m_patternSetPara.rotation = head->rotation; + //} + m_patternSetPara.rotateStyle = head->rotateStyle; + m_patternSetPara.rotateAngle = head->rotateAngle; + m_patternSetPara.scanX = head->scanX; + m_patternSetPara.scanY = head->scanY; + m_patternSetPara.left = head->left; + m_patternSetPara.front = head->front; + m_patternSetPara.reinMode = head->reinMode; + m_patternSetPara.reinNeedles = head->reinNeedles; + m_patternSetPara.reinNum = head->reinNum; + m_patternSetPara.normalStep = head->normalStep; + m_patternSetPara.angleCorrOffset = head->angleCorrOffset; + m_patternSetPara.angleCorrPosX = head->angleCorrPosX; + m_patternSetPara.angleCorrPosY = head->angleCorrPosY; + m_patternSetPara.angleCorrNegX = head->angleCorrNegX; + m_patternSetPara.angleCorrNegY = head->angleCorrNegY; + m_patternSetPara.startX = head->startX; + m_patternSetPara.startY = head->startY; + m_patternSetPara.anchorX = head->anchorX; + m_patternSetPara.anchorY = head->anchorY; + m_patternSetPara.bisect = head->bisect; + m_patternSetPara.oftNeedleSize = head->oftNeedleSize; + + if(m_patternSetPara.scanX == 0 || m_patternSetPara.scanY == 0) + { + dsr.getDsrMinMax(); + if(m_patternSetPara.scanX == 0) + { + m_patternSetPara.scanX = dsr.getDsrMaxX() - dsr.getDsrMinX(); + } + if(m_patternSetPara.scanY == 0) + { + m_patternSetPara.scanY = dsr.getDsrMaxY() - dsr.getDsrMinY(); + } + } + } + else if(ext == "QUI") + { + //花样参数-花样设置参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_PATTERN,PATTERNPARA_SORT_QUI); + + QuiFileHead *head = new QuiFileHead; + memset((char*)head,0,sizeof(QuiFileHead)); + DataFileQui qui; + qui.initFile(m_curFilePath); + QuiFileHead *rhead = qui.getQuiHead(); + memcpy((char*)head,(char*)rhead,sizeof(QuiFileHead)); + + if(g_emMacType==MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)//对飞梭机进行判断是否花样文件起终点x是否一致 + { + qui.convertDataToEmbAbs(); + QByteArray testAry = qui.getEmbAbsData(); + xDataWhetherSame(testAry); + } + + m_patternSetPara.rotateStyle = head->rotateStyle; + m_patternSetPara.rotateAngle = head->rotateAngle; + int value = g_pSettings->readFromIniFile("HMI/splitStep").toInt(); + if(value == 1)//分割针步 + { + m_patternSetPara.normalStep = head->setNormalStep; + } + else + { + m_patternSetPara.normalStep = head->normalStep; + } + m_patternSetPara.lolaComp = head->rollaYUpDn; + m_patternSetPara.lolaCompXNeg = head->rollaYUpDnXNeg; + m_patternSetPara.lolaCompXZero = head->rollaYUpDnXZero; + m_patternSetPara.reinMode = head->reinMode; + m_patternSetPara.reinNeedles = head->reinNeedles; + m_patternSetPara.reinNum = head->reinNum; + m_patternSetPara.angleCorrOffset = head->angleCorrOffset; + m_patternSetPara.angleCorrPosX = head->angleCorrPosX; + m_patternSetPara.angleCorrNegX = head->angleCorrNegX; + m_patternSetPara.angleCorrPosY = head->angleCorrPosY; + m_patternSetPara.angleCorrNegY = head->angleCorrNegY; + m_patternSetPara.left = head->left*100;//因为存储为两字节,所以存储时除以100了,所以这乘以100 + m_patternSetPara.front = head->front*100; + m_patternSetPara.scanX = head->scanX; + m_patternSetPara.scanY = head->scanY; + m_patternSetPara.startX = head->startX; + m_patternSetPara.startY = head->startY; + m_patternSetPara.uniScale = head->uniScale; + + qui.getQuiMinMax(); + int width = qui.getDatMaxX() - qui.getDatMinX(); + int height = qui.getDatMaxY() - qui.getDatMinY(); + + if(m_patternSetPara.scanX == 0 || m_patternSetPara.scanY == 0) + { + if(m_patternSetPara.scanX == 0) + { + m_patternSetPara.scanX = qui.getDatMaxX() - qui.getDatMinX(); + } + if(m_patternSetPara.scanY == 0) + { + m_patternSetPara.scanY = qui.getDatMaxY() - qui.getDatMinY(); + } + } + + //一条竖线 + if(width == 0) + { + m_patternSetPara.scanX = 0; + widthFlag = 1; + } + + //一条横线 + if(height == 0) + { + m_patternSetPara.scanY = 0; + heightFlag = 1; + } + } + else if(ext == "QUIX") + { + //绣花花样参数-花样设置参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_PATTERN,PATTERNPARA_SORT_QUI); + + QuixFileHead *head = NULL; + DataFileQuix quix; + quix.initFile(m_curFilePath); + + head = quix.getQuixHead(); + if(head == NULL) + { + head = new QuixFileHead(); + memset((char*)head,0,sizeof(QuixFileHead)); + } + + if(g_emMacType==MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)//对飞梭机进行判断是否花样文件起终点x是否一致 + { + quix.convertDataToEmbAbs(); + QByteArray testAry = quix.getEmbAbsData(); + xDataWhetherSame(testAry); + } + + m_patternSetPara.rotateStyle = head->rotateStyle; + m_patternSetPara.rotateAngle = head->rotateAngle; + int value = g_pSettings->readFromIniFile("HMI/splitStep").toInt(); + if(value == 1)//分割针步 + { + m_patternSetPara.normalStep = head->setNormalStep; + } + else + { + m_patternSetPara.normalStep = head->normalStep; + } + m_patternSetPara.lolaComp = head->rollaComp; + m_patternSetPara.reinMode = head->reinMode; + m_patternSetPara.reinNeedles = head->reinNeedles; + m_patternSetPara.reinNum = head->reinNum; + m_patternSetPara.angleCorrOffset = head->angleCorrOffset; + m_patternSetPara.angleCorrPosX = head->angleCorrPosX; + m_patternSetPara.angleCorrNegX = head->angleCorrNegX; + m_patternSetPara.angleCorrPosY = head->angleCorrPosY; + m_patternSetPara.angleCorrNegY = head->angleCorrNegY; + m_patternSetPara.left = head->left; + m_patternSetPara.front = head->front; + m_patternSetPara.scanX = head->scanX; + m_patternSetPara.scanY = head->scanY; + m_patternSetPara.oftNeedleSize = head->oftNeedleSize; + + if(m_patternSetPara.scanX == 0 || m_patternSetPara.scanY == 0) + { + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + quix.doubleHeadConvertDataToEmbAbs(); + } + else + { + quix.getQuixMinMax(); + } + + if(m_patternSetPara.scanX == 0) + { + m_patternSetPara.scanX = quix.getDatMaxX() - quix.getDatMinX(); + } + if(m_patternSetPara.scanY == 0) + { + m_patternSetPara.scanY = quix.getDatMaxY() - quix.getDatMinY(); + } + } + } + else if(ext == "PLT") + { + //平板切割算法参数设置 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_PATTERN,PATTERNPARA_SORT_PLT); + //if(g_emMacType == MACHINE_MILLMAC) + //{ + // ImportHPGL importHPGL; + // + // if (importHPGL.IsSecretFile(m_curFilePath) == true) + // { + // // 文件路径 + // QDir apppath(qApp->applicationDirPath()); + // QString strSecretFile = apppath.path() + apppath.separator() + "Secret.plt"; + // + // importHPGL.BitMapDtat(m_curFilePath,strSecretFile); + // importHPGL.IniPara(); + // importHPGL.ReadSecretFile(strSecretFile); + // } + // else + // { + // importHPGL.IniPara(); + // importHPGL.Read(m_curFilePath); + // } + + //{ + // PLT_Head head = importHPGL.getPltHead(); + // m_patternSetPara.pressureHigh2 = head.pressureHigh2; + // m_patternSetPara.pressureHigh3 = head.pressureHigh3; + // m_patternSetPara.pressureHigh4 = head.pressureHigh4; + // m_patternSetPara.pressureHigh5 = head.pressureHigh5; + // m_patternSetPara.pressureHigh6 = head.pressureHigh6; + // m_patternSetPara.pressureHigh7 = head.pressureHigh7; + // m_patternSetPara.pressureHigh8 = head.pressureHigh8; + // m_patternSetPara.pressureHigh9 = head.pressureHigh9; + // m_patternSetPara.anchorX = head.anchorX; + // m_patternSetPara.anchorY = head.anchorY; + //} + } + + //if(g_emMacType==MACHINE_THICK_WIRING)//对粗线布线机的"旋转角度调整"赋值 + //{ + // m_pParameterSetDlg->setItemValue(SET_ROTATIONANGLE, m_patternSetPara.rotation); //旋转角度调整 + //} + + //if(g_emMacType==MACHINE_MILLMAC)//对铣切机的"刀压补偿"赋值和起始点赋值 + //{ + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH2, m_patternSetPara.pressureHigh2); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH3, m_patternSetPara.pressureHigh3); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH5, m_patternSetPara.pressureHigh5); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH6, m_patternSetPara.pressureHigh6); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH7, m_patternSetPara.pressureHigh7); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH8, m_patternSetPara.pressureHigh8); + // m_pParameterSetDlg->setItemValue(SET_PRESSUREH9, m_patternSetPara.pressureHigh9); + //} + + m_pParameterSetDlg->setItemValue(SET_ROTATESTYLE, m_patternSetPara.rotateStyle); //旋转式样 + m_pParameterSetDlg->setItemValue(SET_ROTATEANGLE, m_patternSetPara.rotateAngle); //旋转角度 + m_pParameterSetDlg->setItemValue(SET_SETSTEPSIZE, m_patternSetPara.normalStep); //针步大小 + m_pParameterSetDlg->setItemValue(SET_LOLACOMP, m_patternSetPara.lolaComp); //罗拉补偿 + m_pParameterSetDlg->setItemValue(SET_LOLACOMPXNEG, m_patternSetPara.lolaCompXNeg); //罗拉补偿 + m_pParameterSetDlg->setItemValue(SET_LOLACOMPXZERO, m_patternSetPara.lolaCompXZero); //罗拉补偿 + m_pParameterSetDlg->setItemValue(SET_REINMODE, m_patternSetPara.reinMode); //加固方式 + m_pParameterSetDlg->setItemValue(SET_REINNEEDLE, m_patternSetPara.reinNeedles); //加固针数 + m_pParameterSetDlg->setItemValue(SET_REINNUM, m_patternSetPara.reinNum); //加固次数 + m_pParameterSetDlg->setItemValue(SET_ANGLECORROFFSET, m_patternSetPara.angleCorrOffset); //角度修正量 + m_pParameterSetDlg->setItemValue(SET_ANGLECORRPOSX, m_patternSetPara.angleCorrPosX); //角度修正量X正 + m_pParameterSetDlg->setItemValue(SET_ANGLECORRNEGX, m_patternSetPara.angleCorrNegX); //角度修正量X负 + m_pParameterSetDlg->setItemValue(SET_ANGLECORRPOSY, m_patternSetPara.angleCorrPosY); //角度修正量Y正 + m_pParameterSetDlg->setItemValue(SET_ANGLECORRNEGY, m_patternSetPara.angleCorrNegY); //角度修正量Y负 + m_pParameterSetDlg->setItemValue(SET_SETLEFT, (m_patternSetPara.left)/10); //左边 + m_pParameterSetDlg->setItemValue(SET_SETFRONT, (m_patternSetPara.front)/10); //前边 + m_pParameterSetDlg->setItemValue(SET_SCANX, m_patternSetPara.scanX, widthFlag); //缩放x,widthFlag等于1为一条竖线 + m_pParameterSetDlg->setItemValue(SET_SCANY, m_patternSetPara.scanY, heightFlag); //缩放y,heightFlag等于1为一条横线 + m_pParameterSetDlg->setItemValue(SET_ANCHORX, m_patternSetPara.anchorX); //定位点X + m_pParameterSetDlg->setItemValue(SET_ANCHORY, m_patternSetPara.anchorY); //定位点Y + m_pParameterSetDlg->setItemValue(SET_STARTX, m_patternSetPara.startX); //起始点X + m_pParameterSetDlg->setItemValue(SET_STARTY, m_patternSetPara.startY); //起始点Y + m_pParameterSetDlg->setItemValue(SET_BISECT, m_patternSetPara.bisect); //平分参数 + m_pParameterSetDlg->setItemValue(SET_OFTNEEDLE, m_patternSetPara.oftNeedleSize); //去除的最小偏移针步大小 + m_pParameterSetDlg->setItemValue(SET_EQUAL, m_patternSetPara.uniScale);//等比缩放 + } + else if(setFlag != 0) + { + m_patternSetPara.rotateStyle = m_pParameterSetDlg->getItemValue(SET_ROTATESTYLE); //旋转式样 + m_patternSetPara.rotateAngle = m_pParameterSetDlg->getItemValue(SET_ROTATEANGLE); //旋转角度 + m_patternSetPara.normalStep = m_pParameterSetDlg->getItemValue(SET_SETSTEPSIZE); //针步大小 + m_patternSetPara.lolaComp = m_pParameterSetDlg->getItemValue(SET_LOLACOMP); //罗拉补偿 + m_patternSetPara.lolaCompXNeg = m_pParameterSetDlg->getItemValue(SET_LOLACOMPXNEG); //罗拉补偿 + m_patternSetPara.lolaCompXZero = m_pParameterSetDlg->getItemValue(SET_LOLACOMPXZERO); //罗拉补偿 + m_patternSetPara.reinMode = m_pParameterSetDlg->getItemValue(SET_REINMODE); //加固方式 + m_patternSetPara.reinNeedles = m_pParameterSetDlg->getItemValue(SET_REINNEEDLE); //加固针数 + m_patternSetPara.reinNum = m_pParameterSetDlg->getItemValue(SET_REINNUM); //加固次数 + m_patternSetPara.angleCorrOffset = m_pParameterSetDlg->getItemValue(SET_ANGLECORROFFSET); //角度修正量 + m_patternSetPara.angleCorrPosX = m_pParameterSetDlg->getItemValue(SET_ANGLECORRPOSX); //角度修正x正 + m_patternSetPara.angleCorrNegX = m_pParameterSetDlg->getItemValue(SET_ANGLECORRNEGX); //角度修正x负 + m_patternSetPara.angleCorrPosY = m_pParameterSetDlg->getItemValue(SET_ANGLECORRPOSY); //角度修正y正 + m_patternSetPara.angleCorrNegY = m_pParameterSetDlg->getItemValue(SET_ANGLECORRNEGY); //角度修正y负 + m_patternSetPara.left = (m_pParameterSetDlg->getItemValue(SET_SETLEFT))*10; //左边 + m_patternSetPara.front = (m_pParameterSetDlg->getItemValue(SET_SETFRONT))*10; //前边 + m_patternSetPara.scanX = m_pParameterSetDlg->getItemValue(SET_SCANX); //缩放x + m_patternSetPara.scanY = m_pParameterSetDlg->getItemValue(SET_SCANY); //缩放y + m_patternSetPara.anchorX = m_pParameterSetDlg->getItemValue(SET_ANCHORX); //定位点X + m_patternSetPara.anchorY = m_pParameterSetDlg->getItemValue(SET_ANCHORY); //定位点Y + m_patternSetPara.startX = m_pParameterSetDlg->getItemValue(SET_STARTX); //起始点X + m_patternSetPara.startY = m_pParameterSetDlg->getItemValue(SET_STARTY); //起始点Y + m_patternSetPara.bisect = m_pParameterSetDlg->getItemValue(SET_BISECT); //平分参数 + m_patternSetPara.oftNeedleSize = m_pParameterSetDlg->getItemValue(SET_OFTNEEDLE); //去除的最小偏移针步大小 + m_patternSetPara.uniScale = m_pParameterSetDlg->getItemValue(SET_EQUAL);//等比缩放 + } +} + +//飞梭机,调用下方函数对x坐标数据进行判断,是否弹窗提示 +void MainWidget::xDataWhetherSame(QByteArray testAry) +{ + if(!EmbData::checkFirstEndNeedle(testAry)) + { + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_OK); + promptDlg.setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("The selected file does not meet the specifications");//选择的文件不符合规格 + promptDlg.setContentStr(str); + promptDlg.exec(); + m_whetherShowFlag=0; + } +} + +//计算起始点和定位点并设置 +void MainWidget::calPointsAndSet() +{ + //计算起始点和定位点,并把定位点和起始点更新到ds16数据中 + //花版的定位点为绝对坐标数据点,起始点为相对于定位点的相对坐标点,第一针为相对于起始点的坐标点 + //有的花版起始点有偏移量,第一针偏移量为0,有的花版起始点偏移量为0,第一针有偏移量 + //所以ds16文件头定位点坐标就是花版中的定位点,起始点坐标为花版中的定位点坐标+起始点坐标+第一针的坐标,同时ds16数据的第一针坐标偏移应置为0 + + if(g_emMacType == MACHINE_CUTTINGWALK) + { + int x = 0; + int y = 0; + + //读取配置文件上次切割点位置坐标 + x = g_pSettings->readFromIniFile("FlatPanel/AnchorPointX").toInt(); + y = g_pSettings->readFromIniFile("FlatPanel/AnchorPointY").toInt(); + + m_pMainWidgetFunction->funSetAnchorPointForCut(m_curFilePath,x,y,-1); + int begX = g_pCurEmbData->getBeginX(); + int begY = g_pCurEmbData->getBeginY(); + m_patternSetPara.startX = begX; + m_patternSetPara.startY = begY; + } + if(g_emMacType == MACHINE_THICK_WIRING || g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING) + { + m_pMainWidgetFunction->funSetStartPoint(m_curFilePath,m_patternSetPara.startX,m_patternSetPara.startY, false,false); + } + else + { + if(g_emMacType != MACHINE_CUTTINGWALK) + { + m_pMainWidgetFunction->funSetLeftFrontPoint(m_curFilePath,m_patternSetPara.left,m_patternSetPara.front, false,false); + } + } +} + +void MainWidget::calPointsAndSetDoubleCombQui() +{ + m_pMainWidgetFunction->funSetLeftFrontPointDoubleHead(m_curFilePath,m_patternSetPara.left,m_patternSetPara.front, 0, false,false); + + int begX = g_pCurEmbData->getBeginX(); + int begY = g_pCurEmbData->getBeginY(); + m_patternSetPara.startX = begX; + m_patternSetPara.startY = begY; +} + +s16 MainWidget::appendDiffAbsData(QString ext) +{ + //添加一个花样文件 + if(ext == "DST")//dst文件 + { + DataFileDst dst; + dst.initFile(m_curFilePath); + dst.convertDataToAbs(m_patternSetPara.scanX*10,m_patternSetPara.scanY*10); + + //将花样参数配置写回到源文件中 + DstHead *head = dst.getDstHead(); + + if(head == NULL){return -1;} + + // head->rotation = m_patternSetPara.rotation;//bingo + head->rotateStyle = m_patternSetPara.rotateStyle; + head->rotateAngle = m_patternSetPara.rotateAngle; + head->scanX = m_patternSetPara.scanX; + head->scanY = m_patternSetPara.scanY; + head->left = m_patternSetPara.left; + head->front = m_patternSetPara.front; + head->startX = m_patternSetPara.startX; + head->startY = m_patternSetPara.startY; + head->reinMode = m_patternSetPara.reinMode; + head->reinNeedles = m_patternSetPara.reinNeedles; + head->reinNum = m_patternSetPara.reinNum; + head->normalStep = m_patternSetPara.normalStep; + head->angleCorrOffset = m_patternSetPara.angleCorrOffset; + head->angleCorrPosX = m_patternSetPara.angleCorrPosX; + head->angleCorrPosY = m_patternSetPara.angleCorrPosY; + head->angleCorrNegX = m_patternSetPara.angleCorrNegX; + head->angleCorrNegY = m_patternSetPara.angleCorrNegY; + + dst.writePatternParaToFile(head); + g_pCurEmbData->setAbsDat(dst.getEmbAbsData()); + m_patternSetPara.normalStep *= 10; + } + else if(ext == "DSR")//dsr文件 + { + DataFileDsr dsr; + dsr.initFile(m_curFilePath); + dsr.convertDataToEmbAbs(m_patternSetPara.scanX*10,m_patternSetPara.scanY*10);//转换为绝对数据(中间数据) + + //将花样参数配置写回到源文件中 + DsrHead *head = dsr.getDsrHead(); + if(head == NULL){return -1;} + + // head->rotation = m_patternSetPara.rotation;//bingo + head->rotateStyle = m_patternSetPara.rotateStyle; + head->rotateAngle = m_patternSetPara.rotateAngle; + head->scanX = m_patternSetPara.scanX; + head->scanY = m_patternSetPara.scanY; + head->left = m_patternSetPara.left; + head->front = m_patternSetPara.front; + head->startX = m_patternSetPara.startX; + head->startY = m_patternSetPara.startY; + head->reinMode = m_patternSetPara.reinMode; + head->reinNeedles = m_patternSetPara.reinNeedles; + head->reinNum = m_patternSetPara.reinNum; + head->normalStep = m_patternSetPara.normalStep; + head->angleCorrOffset = m_patternSetPara.angleCorrOffset; + head->angleCorrPosX = m_patternSetPara.angleCorrPosX; + head->angleCorrPosY = m_patternSetPara.angleCorrPosY; + head->angleCorrNegX = m_patternSetPara.angleCorrNegX; + head->angleCorrNegY = m_patternSetPara.angleCorrNegY; + head->bisect = m_patternSetPara.bisect; + head->oftNeedleSize = m_patternSetPara.oftNeedleSize; + qDebug()<<"pattern:"<startX = m_patternSetPara.startX; + // head->startY = m_patternSetPara.startY; + // head->anchorX = m_patternSetPara.anchorX; + // head->anchorY = m_patternSetPara.anchorY; + + dsr.writePatternParaToFile(head); + m_patternSetPara.normalStep *= 10; + g_pCurEmbData->setAbsDat(dsr.getEmbAbsData()); //得到转换后的绝对坐标数据 + } + else if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(m_curFilePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuiFileHead *head = qui.getQuiHead(); + //int sizee = sizeof(QuiFileHead); + if(head == NULL){return -1;} + + head->rotateStyle = m_patternSetPara.rotateStyle; + head->rotateAngle = m_patternSetPara.rotateAngle; + //head->normalStep = m_patternSetPara.normalStep; + head->rollaYUpDn = m_patternSetPara.lolaComp; + head->rollaYUpDnXNeg = m_patternSetPara.lolaCompXNeg; + head->rollaYUpDnXZero = m_patternSetPara.lolaCompXZero; + head->reinMode = m_patternSetPara.reinMode; + head->reinNeedles = m_patternSetPara.reinNeedles; + head->reinNum = m_patternSetPara.reinNum; + head->angleCorrOffset = m_patternSetPara.angleCorrOffset; + head->angleCorrPosX = m_patternSetPara.angleCorrPosX; + head->angleCorrPosY = m_patternSetPara.angleCorrPosY; + head->angleCorrNegX = m_patternSetPara.angleCorrNegX; + head->angleCorrNegY = m_patternSetPara.angleCorrNegY; + head->left = m_patternSetPara.left; + head->front = m_patternSetPara.front; + head->scanX = m_patternSetPara.scanX; + head->scanY = m_patternSetPara.scanY; + head->startX = m_patternSetPara.startX; + head->startY = m_patternSetPara.startY; + head->setNormalStep = m_patternSetPara.normalStep; + head->uniScale = m_patternSetPara.uniScale; + + qui.writePatternParaToFile(head); + + qui.convertDataToEmbAbs();//转换为绝对数据(中间数据) + g_pCurEmbData->setAbsDat(qui.getEmbAbsData());//得到转换后的绝对坐标数据 + + m_patternSetPara.normalStep *= 10; + } + else if(ext == "QUIX") + { + DataFileQuix quix; + quix.initFile(m_curFilePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuixFileHead *head = quix.getQuixHead(); + //int sizee = sizeof(QuixFileHead); + if(head == NULL){return -1;} + + head->rotateStyle = m_patternSetPara.rotateStyle; + head->rotateAngle = m_patternSetPara.rotateAngle; + //head->normalStep = m_patternSetPara.normalStep; + head->rollaComp = m_patternSetPara.lolaComp; + head->reinMode = m_patternSetPara.reinMode; + head->reinNeedles = m_patternSetPara.reinNeedles; + head->reinNum = m_patternSetPara.reinNum; + head->angleCorrOffset = m_patternSetPara.angleCorrOffset; + head->angleCorrPosX = m_patternSetPara.angleCorrPosX; + head->angleCorrPosY = m_patternSetPara.angleCorrPosY; + head->angleCorrNegX = m_patternSetPara.angleCorrNegX; + head->angleCorrNegY = m_patternSetPara.angleCorrNegY; + head->left = m_patternSetPara.left; + head->front = m_patternSetPara.front; + head->scanX = m_patternSetPara.scanX; + head->scanY = m_patternSetPara.scanY; + head->oftNeedleSize = m_patternSetPara.oftNeedleSize; + head->setNormalStep = m_patternSetPara.normalStep; + + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + quix.doubleHeadConvertDataToEmbAbs();//转换为绝对数据(中间数据) + } + else + { + quix.convertDataToEmbAbs();//转换为绝对数据(中间数据) + } + g_pCurEmbData->setAbsDat(quix.getEmbAbsData());//得到转换后的绝对坐标数据 + + m_patternSetPara.normalStep *= 10; + + quix.writePatternParaToFile(head); + } + else if(ext == "PLT") + { + ImportHPGL importHPGL; + + if (importHPGL.IsSecretFile(m_curFilePath) == true) + { + // 文件路径 + QDir apppath(qApp->applicationDirPath()); + QString strSecretFile = apppath.path() + apppath.separator() + "Secret.plt"; + + importHPGL.BitMapDtat(m_curFilePath,strSecretFile); + importHPGL.IniPara(); + importHPGL.ReadSecretFile(strSecretFile); + } + else + { + importHPGL.IniPara(); + importHPGL.Read(m_curFilePath); + } + + /*if(g_emMacType == MACHINE_MILLMAC) + { + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + PLT_Head head; + memset(&head, 0, sizeof(PLT_Head)); + + g_pSettings->writeToIniFile("KNIFE/pressureHigh2",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh3",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh4",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh5",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh6",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh7",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh8",head.pressureHigh2); + g_pSettings->writeToIniFile("KNIFE/pressureHigh9",head.pressureHigh2); + + //head.pressureHigh1 = 0; + //head.pressureHigh2 = m_patternSetPara.pressureHigh2; + //head.pressureHigh3 = m_patternSetPara.pressureHigh3; + //head.pressureHigh4 = 0; + //head.pressureHigh5 = m_patternSetPara.pressureHigh5; + //head.pressureHigh6 = m_patternSetPara.pressureHigh6; + //head.pressureHigh7 = m_patternSetPara.pressureHigh7; + //head.pressureHigh8 = m_patternSetPara.pressureHigh8; + //head.pressureHigh9 = m_patternSetPara.pressureHigh9; + //head.pressureHigh10 = 0; + //head.pressureHigh11 = 0; + //head.pressureHigh12 = 0; + //head.pressureHigh13 = 0; + //head.pressureHigh14 = 0; + //head.pressureHigh15 = 0; + //head.pressureHigh16 = 0; + //head.anchorX = m_patternSetPara.anchorX; + //head.anchorY = m_patternSetPara.anchorY; + //importHPGL.setPltHead(head,m_curFilePath); + }*/ + + importHPGL.convertDataToEmbAbs();// 转换为绝对数据(中间数据) + QByteArray ary = importHPGL.getEmbAbsData(); + g_pCurEmbData->setAbsDat(ary);//得到转换后的绝对坐标数据 + } + else if(ext == "DXF") + { + } + else + { + return -1; + } + + return 0; +} + +//重置所有数据 +void MainWidget::resetAllData() +{ + m_forwardBackNeedleIdx = 0; + ui->frameForwardBack->setVisible(false); + + g_pCurEmbData->getDsDat(); + + ////粗线布线机-文件参数--旋转角度调整 + //if(g_emMacType == MACHINE_THICK_WIRING) + //{ + // g_pCurEmbData->rotationAngleAdjustment(m_patternSetPara.rotation); + //} + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI) + { + //罗拉补偿 + QByteArray ary = g_pCurEmbData->lolaComp(m_patternSetPara.lolaComp,m_patternSetPara.lolaCompXNeg,m_patternSetPara.lolaCompXZero); + if(ary.size() <= 0) + { + return; + } + + unsigned char arrayNeedle1[LAYOUTNEEDLENUM]; // 第1排排针 + memset(arrayNeedle1,0,LAYOUTNEEDLENUM); + unsigned char arrayNeedle2[LAYOUTNEEDLENUM]; // 第2排排针 + memset(arrayNeedle2,0,LAYOUTNEEDLENUM); + unsigned char arrayNeedle3[LAYOUTNEEDLENUM]; // 第3排排针 + memset(arrayNeedle3,0,LAYOUTNEEDLENUM); + unsigned int leftRightNeedleSpace = 0; // 左右针间距 + unsigned int needleLayoutSpace12 = 0; // 第1、2排针间距 + unsigned int needleLayoutSpace23 = 0; // 第2、3排针间距 + unsigned int needlesSpace = 0; // 针与针之间间距 + + if(m_curFilePath.length() <= 0) + { + return; + } + + QFileInfo file(m_curFilePath); + QString ext = file.suffix().toUpper(); + + //读取排针信息 + if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(m_curFilePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuiFileHead *head = qui.getQuiHead(); + if(head == NULL){return;} + + memcpy((char*)arrayNeedle1,(char*)head->arrayNeedle1,sizeof(arrayNeedle1)); + memcpy((char*)arrayNeedle2,(char*)head->arrayNeedle2,sizeof(arrayNeedle2)); + memcpy((char*)arrayNeedle3,(char*)head->arrayNeedle3,sizeof(arrayNeedle3)); + + leftRightNeedleSpace=head->leftRightLen; + needlesSpace=head->HStep; + needleLayoutSpace12=head->VStep12; + needleLayoutSpace23=head->VStep23; + } + else if(ext == "QUIX") + { + DataFileQuix quix; + quix.initFile(m_curFilePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuixFileHead *head = quix.getQuixHead(); + if(head == NULL){return;} + + memcpy((char*)arrayNeedle1,(char*)head->arrayNeedle1,sizeof(arrayNeedle1)); + memcpy((char*)arrayNeedle2,(char*)head->arrayNeedle2,sizeof(arrayNeedle2)); + memcpy((char*)arrayNeedle3,(char*)head->arrayNeedle3,sizeof(arrayNeedle3)); + + leftRightNeedleSpace=head->leftRightLen; + needlesSpace=head->HStep; + needleLayoutSpace12=head->VStep12; + needleLayoutSpace23=head->VStep23; + } + else if(ext == "DSR") + { + DataFileDsr dsr; + dsr.initFile(m_curFilePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + DsrHead *head = dsr.getDsrHead(); + if(head == NULL){return;} + + memcpy((char*)arrayNeedle1,(char*)head->arrayNeedle1,sizeof(arrayNeedle1)); + memcpy((char*)arrayNeedle2,(char*)head->arrayNeedle2,sizeof(arrayNeedle2)); + memcpy((char*)arrayNeedle3,(char*)head->arrayNeedle3,sizeof(arrayNeedle3)); + + leftRightNeedleSpace=head->leftRightLen; + needlesSpace=head->HStep; + needleLayoutSpace12=head->VStep12; + needleLayoutSpace23=head->VStep23; + } + + g_pCurEmbData->getOneDispDat(ary); + g_pCurEmbData->resetLayoutDispDat(arrayNeedle1,arrayNeedle2,arrayNeedle3,leftRightNeedleSpace,needlesSpace,needleLayoutSpace12,needleLayoutSpace23,0); + g_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(1); + } + else + { + g_pCurEmbData->setEmbData(g_emMacType);// ds16数据转换为画图数据 + } + + //加载图片的进度条显示 + ui->progressBar->setVisible(true); + int value = g_pCurEmbData->getStitchNums() / TENTHOUSANDNEEDLE; + ui->progressBar->setRange(1,value); + ui->progressBar->setValue(1); + + m_dispMode = EmbData::DISP_ALL_EXEC; + g_pCurEmbData->setDispMode(m_dispMode, 1); // 重新画图 + m_dispMode = EmbData::DISP_EXECING; // 设置为执行模式 + g_pCurEmbData->setDispMode(m_dispMode, 0); // 设置为按进度执行模式 + + m_curDatIdx = 0; + + ui->framePatternView->setVisible(true); + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); + + ui->lab_Index_2->setText("0/0"); + + + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->lab_StartPoint_2->setText("0,0"); + ui->lab_Head2_StartPointVal->setText("0,0"); + } + else + { + ui->lab_StartPoint_2->setText("0/0"); + } + ui->lab_Locate_2->setText("0/0"); + ui->lab_Range_21->setText("0/0"); + ui->lab_Range_22->setText("0/0"); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->lab_Position_2->setText("0/0"); + ui->lab_Head2_PositionVal->setText("0/0"); + } + else + { + ui->lab_Position_2->setText("0/0"); + } + ui->lab_Production_2->setText("0"); + ui->lab_Schedule_2->setText("0%"); + + ui->progressBar->setVisible(false); +} + +//花样选择 +void MainWidget::patternSelect() +{ + //获得花样选择的图标字符 + QString tStyle; + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNSELECT) + { + QString topImageName = m_patternSetItemList[i].m_topImageName; + //加载按钮顶图图标 + tStyle = m_setControlStyle.getTopStyleSheet(topImageName); + + break; + } + } + + m_pPatternSelectWi->setTypeLogo(tStyle); + m_pPatternSelectWi->setMainTitle(tr("Pattern selection")); + m_pPatternSelectWi->setSubTitle(tr("Pattern setting") + "> " + tr("Pattern selection") + "> "); + + m_pPatternSelectWi->createCurDirPatterns(); + m_pPatternSelectWi->show(); + + //showPatternPreview(); +} + +//显示机器运行状态中的信息 +void MainWidget::showExecInfo() +{ + // 速度 + if (m_curRpm != (int)m_mcStatus.runSpeed) // 运行速度 + { + m_curRpm = (int)m_mcStatus.runSpeed; + QString str; + str.sprintf("%d", m_curRpm); + showWorkSpeed(str); + } + + //针数索引 + u32 totalStitchNum = g_pCurEmbData->getStitchNums(); + u32 machineIndex = static_cast(m_mcStatus.dataIdx); + + //静态变量用于判断下位机发送的索引是否发生变化 + static u32 preIndex = m_curDatIdx; + + // 文件执行进度 + if(preIndex != machineIndex) + { + if (machineIndex >= totalStitchNum) + m_curDatIdx = machineIndex - 1; + else + m_curDatIdx = machineIndex; + + reSetDatIdx(m_curDatIdx); + //记录下位机索引 + preIndex = machineIndex; + } + + ui->lab_Index_2->setText(QString("%1/%2") + .arg(QString::number(m_mcStatus.dataIdx))//当前索引 + .arg(QString::number(totalStitchNum)));//总针步 + + if(totalStitchNum > 0){ //避免除零错误 + QString schedule = QString("%1%").arg(QString::number((m_mcStatus.dataIdx*100)/totalStitchNum)); + ui->lab_Schedule_2->setText(schedule); + } + + if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)//飞梭机、L2000多针机 + { + //产量,单位为毫米,转换为米,保留两位小数点 + ui->lab_Production_2->setText(QString::number(static_cast(m_mcStatus.outCounter) / 1000.0, 'f', 2)); + } + else + { + //产量 + ui->lab_Production_2->setText(QString::number(m_mcStatus.outCounter)); + } + + // 当前xy绝对坐标 + double xPos = m_mcStatus.xPos*0.01; + double x2Pos = m_mcStatus.motosPos5*0.01; + double yPos = m_mcStatus.yPos*0.01; + + QString xyStr; + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + xyStr = QString("%1/%2").arg(QString::number(xPos,'f',2)).arg(QString::number(yPos,'f',2)); + ui->lab_Position_2->setText(xyStr); + + QString xyStr2 = QString("%1/%2").arg(QString::number(x2Pos,'f',2)).arg(QString::number(yPos,'f',2)); + ui->lab_Head2_PositionVal->setText(xyStr2); + } + else + { + xyStr = QString("%1/%2").arg(QString::number(xPos,'f',2)).arg(QString::number(yPos,'f',2)); + ui->lab_Position_2->setText(xyStr); + } +} + +void MainWidget::showPatternPreview() +{ + hideMenuFrame(); + + QFile curfile(m_curFilePath); + if(m_curFilePath.length() <= 0 || + (!curfile.exists()))//未选择文件时不显示颜色和花样信息 + { + ui->framePatternView->setVisible(false); + } + else + { + ui->framePatternView->setVisible(true); + ui->labelPatternView->setVisible(true);//非预览模式绘制区域 + } + + //主界面按钮选中 + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); +} + +//设置UI界面按钮的使能 +void MainWidget::setUiBtnEnable(bool bValue) +{ + ui->frameMainFunction->setEnabled(bValue); + ui->buttonNineBtn1->setEnabled(bValue); + ui->buttonNineBtn2->setEnabled(bValue); + ui->buttonNineBtn3->setEnabled(bValue); + ui->buttonNineBtn4->setEnabled(bValue); + ui->buttonNineBtnUp->setEnabled(bValue); + ui->buttonNineBtnDown->setEnabled(bValue); + ui->buttonNineBtnLeft->setEnabled(bValue); + ui->buttonNineBtnRight->setEnabled(bValue); + ui->buttonNineBtnMiddle->setEnabled(bValue); +} + +void MainWidget::showSpeedFrame() +{ + ui->frameNineBtn->hide(); + ui->buttonNineBtn1->hide(); + ui->buttonNineBtnUp->hide(); + ui->buttonNineBtn2->hide(); + ui->buttonNineBtnLeft->hide(); + ui->buttonNineBtnMiddle->hide(); + ui->buttonNineBtnRight->hide(); + ui->buttonNineBtn3->hide(); + ui->buttonNineBtnDown->hide(); + ui->buttonNineBtn4->hide(); + //显示调速表和调速按钮 + ui->frameSpeed->show(); + + ui->labelSpeed->show();//显示机器运行速度的数字的数码管 + ui->labelSpeed1->show(); + ui->labelSpeed2->show(); + ui->labelSpeed3->show(); + ui->labelSpeed4->show(); + + if(g_emMacType != MACHINE_CUTTINGWALK) + { + ui->buttonSpeedDec->show(); + ui->buttonStartStop->show(); + ui->buttonSpeedAdd->show(); + } +} + +void MainWidget::showNineFrame() +{ + //进入到待机状态,隐藏调速表,显示方向键 + if(g_emMacType == MACHINE_THICK_WIRING) + { + ui->buttonNineBtn4->setTopImage(m_setControlStyle.getTopStyleSheet(ui->buttonNineBtn4->objectName())); + } + + ui->frameSpeed->hide(); + ui->buttonSpeedDec->hide(); + ui->buttonSpeedAdd->hide(); + ui->buttonStartStop->hide(); + ui->labelSpeed->hide(); + ui->labelSpeed1->hide(); + ui->labelSpeed2->hide(); + ui->labelSpeed3->hide(); + ui->labelSpeed4->hide(); + //显示调速表和调速按钮 + ui->frameNineBtn->show(); + ui->buttonNineBtn1->show(); + ui->buttonNineBtn2->show(); + ui->buttonNineBtn3->show(); + ui->buttonNineBtn4->show(); + ui->buttonNineBtnDown->show(); + ui->buttonNineBtnLeft->show(); + ui->buttonNineBtnMiddle->show(); + ui->buttonNineBtnRight->show(); + ui->buttonNineBtnUp->show(); +} + +void MainWidget::setNotExecing() +{ + if(m_dispMode != EmbData::DISP_EXECING)//不是执行状态,重置 + { + g_pCurEmbData->setViewInfo(m_embBackPix);//带背景图的背景 + g_pCurEmbData->setDrawMode(EmbData::DRAW_VIEW);//非预览模式 + g_pCurEmbData->setEmbData(g_emMacType);//ds16数据转换为画图数据 + + m_dispMode = EmbData::DISP_ALL_EXEC; + g_pCurEmbData->setDispMode(m_dispMode, 1); // 重新画图 + + m_dispMode = EmbData::DISP_EXECING; // 设置为执行模式 + g_pCurEmbData->setDispMode(m_dispMode, 0); // 设置为按进度执行模式 + g_pCurEmbData->setExecIndex(m_curDatIdx); // 设置进度 + + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); + } +} + +void MainWidget::reSetDatIdx(int newidx) +{ + // 文件idx信息 + QString indexStr = ui->lab_Index_2->text(); + QString newindexStr = QString("%1/%2").arg(newidx).arg(indexStr.right(indexStr.size() - indexStr.indexOf('/') - 1)); + ui->lab_Index_2->setText(newindexStr); + + // 更新进度显示 + g_pCurEmbData->setExecIndex(newidx); + + //更新绘制针步 + QPixmap& patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); +} + +//前进回退 +void MainWidget::funForwardOrBack() +{ + //显示主界面 + hideMenuFrame(); + setUiBtnEnable(false); + showPatternPreview(); + m_forwardBackNeedleIdx = m_curDatIdx; + + g_pCurEmbData->setExecIndex(m_forwardBackNeedleIdx);// 更新进度显示 + + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); + + int totalStitchNum = g_pCurEmbData->getStitchNums(); + QString strNeedle; + strNeedle.sprintf("%d / %d",m_forwardBackNeedleIdx,totalStitchNum); + ui->labelNeedleCurAndTotal->setText(strNeedle); + + int posx, posy, cidx, dr, ar, dx, dy; + posx = posy = cidx = dr = ar = dx = dy = 0; + g_pCurEmbData->getPosInfoFromNeedleIdx(m_forwardBackNeedleIdx, posx, posy, cidx, dr, ar, dx, dy); + + //当前针的相对角度和绝对角度 + //将弧度值转换为角度值 + double sar = (double)ar/10000.0*180.0/PI; + sar = 180.0 - sar; + if(fabs(sar) < 0.01) + { + sar = 0; + } + double sdr = (double)dr/10000.0*180.0/PI; + sdr *= -1; + if(fabs(sdr) < 0.01) + { + sdr = 0; + } + + QString strAngle = QString("%1/%2").arg(sdr,0,'f',1).arg(sar,0,'f',1); + ui->labelAngleValue->setText(strAngle); + + QString strDx = QString("%1").arg(dx/100.0,0,'f',2); + ui->labelDxValue->setText(strDx); + + QString strDy = QString("%1").arg(dy/100.0,0,'f',2); + ui->labelDyValue->setText(strDy); + + QString strAx = QString("%1").arg(posx/100.0,0,'f',2); + ui->labelAxValue->setText(strAx); + + QString strAy = QString("%1").arg(posy/100.0,0,'f',2); + ui->labelAyValue->setText(strAy); + + ui->frameForwardBack->setVisible(true); + ui->frameForwardBack->raise(); +} + +void MainWidget::addOrDecNeedleIdx(int &idx) +{ + if( g_pMachine == NULL || 0 ) + { + return; + } + + if(idx < 0) + { + idx = 0; + } + + int totalStitchNum = g_pCurEmbData->getStitchNums();//总针数 + if(idx > totalStitchNum) + { + idx = totalStitchNum; + } + + memset(&m_expara,0,sizeof(FileExecPara)); + + int posx, posy, cidx, dr, ar, dx, dy; + posx = posy = cidx = dr = ar = dx = dy = 0; + g_pCurEmbData->getPosInfoFromNeedleIdx(idx, posx, posy, cidx, dr, ar, dx, dy); + + m_expara.newIdx = idx; + m_expara.newXPos = posx; + m_expara.newYPos = posy; + m_expara.newRPos = 0; + + QString strNeedle; + strNeedle.sprintf("%d / %d",idx,totalStitchNum); + ui->labelNeedleCurAndTotal->setText(strNeedle); + + //当前针的相对角度和绝对角度 + //将弧度值转换为角度值 + double sar = (double)ar/10000.0*180.0/PI; + sar = 180.0 - sar; + if(fabs(sar) < 0.01) + { + sar = 0; + } + double sdr = (double)dr/10000.0*180.0/PI; + sdr *= -1; + if(fabs(sdr) < 0.01) + { + sdr = 0; + } + + QString strAngle = QString("%1/%2").arg(sdr,0,'f',1).arg(sar,0,'f',1); + ui->labelAngleValue->setText(strAngle); + + QString strDx = QString("%1").arg(dx/100.0,0,'f',2); + ui->labelDxValue->setText(strDx); + + QString strDy = QString("%1").arg(dy/100.0,0,'f',2); + ui->labelDyValue->setText(strDy); + + QString strAx = QString("%1").arg(posx/100.0,0,'f',2); + ui->labelAxValue->setText(strAx); + + QString strAy = QString("%1").arg(posy/100.0,0,'f',2); + ui->labelAyValue->setText(strAy); + + //画执行进度图 + g_pCurEmbData->setExecIndex(idx);// 更新针数 + + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); +} + +//获取常用按钮样式 +QString MainWidget::getCommonBtnStyle(int idx) +{ + QString styleStr; + //检测快捷按钮条目 + for(int i = 0; i < m_quickItemList.size(); i++)//快捷功能中的快捷条目列表 + { + int enumFun = m_quickItemList[i].m_enumFunction; + if(idx == enumFun)//功能索引等于快捷按钮功能索引 + { + //获取顶层图标样式表 + styleStr = m_quickItemList[i].m_topImageName; + break; + } + } + + if(idx == FUN_PATTERNSELECT)//功能索引等于花样选择 + { + //获得花样选择的图标字符 + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNSELECT) + { + styleStr = m_patternSetItemList[i].m_topImageName; + break; + } + } + } + + return styleStr; +} + +void MainWidget::runCommonBtnFunction(int idx) +{ + if(m_pMainWidgetFunction == NULL) + { + return; + } + switch (idx) + { + case FUN_ALLTOZERO://全部归零 + m_pMainWidgetFunction->funAllToZero(); + break; + case FUN_SPINDLEJOG://主轴点动(平绣,毛巾) + m_pMainWidgetFunction->funSpindleJog(); + break; + case FUN_SPINDLEROTATE://主轴旋转 + //m_pMainWidgetFunction->funSpindleRotate(); + break; + case FUN_BACKWORKPOINT://回工作点 + m_pMainWidgetFunction->funBackWorkPoint(); + break; + case FUN_WORK_HEAD_SET://工作机头设置 + m_pMainWidgetFunction->funWorkHeadSet(); + break; + case FUN_CUTTINGPOINT: + m_pMainWidgetFunction->funBackToCuttringPoint(); + break; + case FUN_BACKTOORIGIN://回原点 + m_pMainWidgetFunction->funBackToOrigin(); + break; + case FUN_SETOFFSETPOINT://定偏移点 + m_pMainWidgetFunction->funSetOffsetPoint(); + break; + case FUN_BACKOFFSETPOINT://回偏移点 + m_pMainWidgetFunction->funBackOffsetPoint(); + break; + case FUN_SETSTARTPOINT://定起始点 + { + m_pMainWidgetFunction->funSetStartPoint(m_curFilePath,m_mcStatus.xPos,m_mcStatus.yPos,1); + ui->lab_StartPoint_2->setText(QString("%1/%2") + .arg(QString::number(m_mcStatus.xPos*0.01,'f',2)) + .arg(QString::number(m_mcStatus.yPos*0.01,'f',2))); + + double minX = g_pCurEmbData->getMinX() / 100.0; + double minY = g_pCurEmbData->getMinY() / 100.0; + double maxX = g_pCurEmbData->getMaxX() / 100.0; + double maxY = g_pCurEmbData->getMaxY() / 100.0; + + QString rangeX = QString("%1/%2") + .arg(QString::number(minX, 'f', 2)) + .arg(QString::number(maxX, 'f', 2)); + QString rangeY = QString("%1/%2") + .arg(QString::number(minY, 'f', 2)) + .arg(QString::number(maxY, 'f', 2)); + + ui->lab_Range_21->setText(rangeX); + ui->lab_Range_22->setText(rangeY); + } + break; + case FUN_BACKSTARTPOINT:// 回起针点 + { + m_pMainWidgetFunction-> funBackStartPoint(); + } + break; + case FUN_CHECKFRAME://边框检查 + m_pMainWidgetFunction->funBorderCheck(); + break; + case FUN_FORWARDORBACK://前进回退 + funForwardOrBack(); + break; + case FUN_SIMULATEFRAME://空走边框 + m_pMainWidgetFunction->funSimulateFrame(); + break; + case FUN_PROCESSRESET://流程复位 + m_pMainWidgetFunction->funProcessReset(); + break; + case FUN_MANUALOIL://手动加油 + m_pMainWidgetFunction->funManualOil(); + break; + case FUN_PATTERNSELECT://花样选择 + patternSelect(); + break; + case FUN_SEWAUTOCHANGESHUTTLE://自动换梭 + m_pMainWidgetFunction->funChangeOneShuttle(); + break; + case FUN_SEWBUFF://缝纫状态 + // m_pMainWidgetFunction->funSewBuff(); + break; + case FUN_SHUTTLEDISKBUFF://换梭盘状态 + // m_pMainWidgetFunction->funShuttleDiskBuff(); + break; + case FUN_BACKTHREADPOINT://回穿线点 + //m_pMainWidgetFunction->funBackThreadPoint(); + break; + case FUN_BACKZEROPOINT://回零点 + m_pMainWidgetFunction->funBackToOrigin();//回零点与回原点动作一致 + break; + case FUN_GOTO_FINISH://回结束点 + m_pMainWidgetFunction->funGotoFinish(); + break; + case FUN_SHUTTLETOHEAD://将旋梭从梭盘到机头 + // m_pMainWidgetFunction->funShuttleToHead(); + break; + case FUN_HEADTOSHUTTLE://将旋梭从机头到梭盘 + // m_pMainWidgetFunction->funHeadToShuttle(); + break; + case FUN_COUNTRESET://底线计数清零 + m_pMainWidgetFunction->funBottomLineCountReset(); + break; + case FUN_OUTPUTRESET://产量清零 + m_pMainWidgetFunction->funResetOutput(); + break; + case FUN_NEDDLEZEROPOS://对针零位 + // m_pMainWidgetFunction->funNeedleZeroPos(); + break; + case FUN_SHUTTLEZEROPOS://对梭零位 + // m_pMainWidgetFunction->funShuttleZeroPos(); + break; + case FUN_MT_ALLZ://所有主轴零位 + m_pMainWidgetFunction->funAllMtZero(); + break; + case FUN_MT_ALLG://所有主轴勾线 + m_pMainWidgetFunction->funAllMtG(); + break; + case FUN_MT_ALLM://所有主轴点动 + m_pMainWidgetFunction->funAllMtM(); + break; + case FUN_SPINDLETEST:// 所有主轴研车 + m_pMainWidgetFunction->funAllMainShaftRun(); + break; + case FUN_SIMULATED_STATUS://模拟缝纫 + m_pMainWidgetFunction->funSimulatedSewing(); + break; + case FUN_MANUAL_THREAD_CUTTING://手动剪线 + m_pMainWidgetFunction->manualThreadCutting(); + break; + case FUN_HEAD_LIFTUPDOWN://机头升降 + m_pMainWidgetFunction->headLiftUpDown(); + break; + case FUN_HEAD_LIFTING://机头上升 + m_pMainWidgetFunction->headLifting(); + break; + case FUN_HEAD_LOWERING://机头下降 + m_pMainWidgetFunction->headLowering(); + break; + case FUN_HEAD_LIFTING2://机头上升2 + m_pMainWidgetFunction->headLifting2(); + break; + case FUN_HEAD_LOWERING2://机头下降2 + m_pMainWidgetFunction->headLowering2(); + break; + case FUN_NS_RESET://缝纫针梭复位 + m_pMainWidgetFunction->sewNeedlesShuttleReset(); + break; + case FUN_GOTO_FEEDT://回穿线点 + g_pMachine->gotoFixPos(); + break; + case FUN_MAKEUP_NOHEAD:// 取消补缝 + m_pMainWidgetFunction->makeup(MAKEUP_NOHEAD); + break; + case FUN_MAKEUP_HEAD1:// 机头1补缝 + m_pMainWidgetFunction->makeup(MAKEUP_HEAD1); + break; + case FUN_MAKEUP_HEAD2:// 机头2补缝 + m_pMainWidgetFunction->makeup(MAKEUP_HEAD2); + break; + case FUN_MAKEUP_HEAD3:// 机头3补缝 + m_pMainWidgetFunction->makeup(MAKEUP_HEAD3); + break; + case FUN_MAKEUP_HEAD4:// 机头4补缝 + m_pMainWidgetFunction->makeup(MAKEUP_HEAD4); + break; + case FUN_MAKEUP_HEAD5:// 机头5补缝 + m_pMainWidgetFunction->makeup(MAKEUP_HEAD5); + break; + case ASSIST_ThCutAct1://机头1 剪线动作 + g_pMachine->motoServoCtrl(ThreadCuttingAction1, UP_OPEN_ON); + break; + case ASSIST_ThCutAct2: + g_pMachine->motoServoCtrl(ThreadCuttingAction2, UP_OPEN_ON); + break; + case ASSIST_ThCutAct3: + g_pMachine->motoServoCtrl(ThreadCuttingAction3, UP_OPEN_ON); + break; + case ASSIST_ThCutAct4: + g_pMachine->motoServoCtrl(ThreadCuttingAction4, UP_OPEN_ON); + break; + case ASSIST_ThCutAct5: + g_pMachine->motoServoCtrl(ThreadCuttingAction5, UP_OPEN_ON); + break; + case FUN_SETANCHORPOINT:// 定定位点(服装机) + m_pMainWidgetFunction->funSetAnchorPoint(m_curFilePath,m_mcStatus.xPos,m_mcStatus.yPos,1); + break; + case FUN_BACKANCHORPOINT://回定位点 + m_pMainWidgetFunction-> funBackAnchorPoint(); + break; + case FUN_CUT_SETANCHORPOINT:// 定定位点 + { + int x = m_mcStatus.xPos; + int y = m_mcStatus.yPos; + + m_pMainWidgetFunction->funSetAnchorPointForCut(m_curFilePath,x,y,1,1); + int begX = g_pCurEmbData->getBeginX(); + int begY = g_pCurEmbData->getBeginY(); + + QString startStr = QString("%1/%2").arg(QString::number(begX/100,'f',2)).arg(QString::number(begY/100,'f',2)); + ui->lab_StartPoint_2->setText(startStr); + + double minX = g_pCurEmbData->getMinX() / 100.0; + double minY = g_pCurEmbData->getMinY() / 100.0; + double maxX = g_pCurEmbData->getMaxX() / 100.0; + double maxY = g_pCurEmbData->getMaxY() / 100.0; + + QString rangeX = QString("%1/%2") + .arg(QString::number(minX, 'f', 2)) + .arg(QString::number(maxX, 'f', 2)); + QString rangeY = QString("%1/%2") + .arg(QString::number(minY, 'f', 2)) + .arg(QString::number(maxY, 'f', 2)); + + ui->lab_Range_21->setText(rangeX); + ui->lab_Range_22->setText(rangeY); + } + break; + + case FUN_BACKSHUTTLE://回换梭位 + m_pMainWidgetFunction->funBackShuttlePos(); + break; + + case FUN_NEEDLESHUTTLERESET://针梭校对 + m_pMainWidgetFunction->funNeedleShuttleReset(); + break; + + case FUN_KNIFE_COLLECT://刀压采集 + m_pMainWidgetFunction->funKnifeCollect(); + break; + + case FUN_DISPLAY_COLLECTED_DATA://显示采集数据 + g_pMachine->getParasFromMachine(DCMD_SEND_MOTO_GAINPARA); + m_pKnifeGapParaDlg.data()->show(); + break; + + case FUN_KNIFE_TEST://刀压测试 + m_pMainWidgetFunction->funKnifeTest(); + break; + + case FUN_SET_KNIFETEST_POS://设置刀压检测位置 + m_pMainWidgetFunction->funSetKnifeTestPos(); + break; + + case FUN_CROSS_CUT://横切 + m_pMainWidgetFunction->funCrossCut(); + break; + + case FUN_FAN_AREA://风机区域 + m_pMainWidgetFunction->funFanArea(); + break; + + case FUN_PEN_UP://画笔上升 + m_pMainWidgetFunction->funPenUpOrDown(OT_PEN_LIFT,0); + break; + + case FUN_PEN_DOWN://画笔下降 + m_pMainWidgetFunction->funPenUpOrDown(OT_PEN_LIFT,1); + break; + + case FUN_MS_TO_ANGLE://主轴去指定角度 + m_pMainWidgetFunction->funSpindleRotate(); + break; + + // 所有主轴研车 + case FUN_WIRE_MS_RUN: + m_pMainWidgetFunction->funAllMainShaftRun(); + break; + + //旋转电机去指定角度 + case FUN_ROT_TO_ANGLE: + m_pMainWidgetFunction->funRotateRotate(); + break; + + //自动拉料 + case FUN_AUTO_PULL: + m_pMainWidgetFunction->AutomaticMaterialPull(); + break; + + //剪底面线 + case FUN_CUT_UD: + m_pMainWidgetFunction->CutBottomLine(); + break; + + //剪电阻丝 + case FUN_CUT_WIRE: + m_pMainWidgetFunction->CutResistanceWire(); + break; + + //回拉料起始点 + case FUN_GOTO_PULLPOS: + m_pMainWidgetFunction->StartPointOfBackMaterial(); + break; + + //夹布工作状态 + case FUN_JAW_WORK: + m_pMainWidgetFunction->WorkStatusOfClamp(); + break; + + //夹布上料状态 + case FUN_JAW_FEED: + m_pMainWidgetFunction->ClothStatus(); + break; + + //去摆动位1 + case FUN_ZIGZAG_POS1: + m_pMainWidgetFunction->SwingPositionOne(); + break; + + //去摆动位2 + case FUN_ZIGZAG_POS2: + m_pMainWidgetFunction->SwingPositionTwo(); + break; + + //手动拉料 + case FUN_YPB_MOVE: + m_pMainWidgetFunction->ManualMaterial(); + break; + + //自动换一个梭 + case FUN_AUTO_CHANGE_ONE_SHUT: + m_pMainWidgetFunction->funChangeOneShuttle(); + break; + + //安装第一个梭壳 + case FUN_INSTALL_FIRST_BOBBIN: + m_pMainWidgetFunction->InstallTheFirstShuttleShell(); + break; + + //将旋梭从梭盘拿到机头 + case FUN_SHUT_FROM_PLATE_TO_HEAD: + m_pMainWidgetFunction->ShuttleFromTrayToHead(); + break; + + //将旋梭从机头拿到梭盘 + case FUN_SHUT_FROM_HEAD_TO_PLATE: + m_pMainWidgetFunction->ShuttleFromHeadToTray(); + break; + + //进入更换梭盘状态 + case FUN_SHUT_INTO_TAKE_PLATE: + m_pMainWidgetFunction->ShuttleState(); + break; + + //进入缝纫状态 + case FUN_SHUT_INTO_INDX_STA: + m_pMainWidgetFunction->SewState(); + break; + + //进入送料状态 + case FUN_SHUT_FEED_STATE: + m_pMainWidgetFunction->FeedState(); + break; + + //进入收料状态 + case FUN_SHUT_BACK_STATE: + m_pMainWidgetFunction->BackState(); + break; + + //梭芯底线显示 + case FUN_SHUIILE_LINE: + m_pMainWidgetFunction->ShuttleBottemLine(); + break; + + //启动工作 + case FUN_STARTWORK: + m_pMainWidgetFunction->funStartWork(); + break; + + //暂停工作 + case FUN_PAUSEWORK: + m_pMainWidgetFunction->funPauseWork(); + break; + + //主轴去勾线位 + case FUN_HOOKPOS: + m_pMainWidgetFunction->funHookPos(); + break; + + //主轴去停车位 + case FUN_PARKPOS: + m_pMainWidgetFunction->funParkPos(); + break; + + // 翻板到低位 + case FUN_BOARD_LOW_POSITION: + m_pMainWidgetFunction->funBoardLowPosition(); + break; + + // 翻板到中位 + case FUN_BOARD_CENTER_POSITION: + m_pMainWidgetFunction->funBoardCenterPosition(); + break; + + // 全部复位 + case FUN_RESET_ALL: + m_pMainWidgetFunction->funResetAll(); + break; + + // 一键拉料 + case FUN_ONE_PULLING: + m_pMainWidgetFunction->funOneClickMaterialPulling(); + break; + + // 一键横切 + case FUN_ONE_CROSS_CUT: + m_pMainWidgetFunction->funOneClickCrossCutting(); + break; + // 底线清空计数 + case FUN_BOTTOM_CLEARING_COUNT: + m_pMainWidgetFunction->funBottomLineClearingCount(); + break; + + case FUN_CTB_INTO_SEW_STA://进入绗缝状态 + m_pMainWidgetFunction->funSewSta(); + break; + case FUN_CTB_INTO_PULL_STA://进入拉料状态 + m_pMainWidgetFunction->funPullSta(); + break; + case FUN_CTB_ONEKEY_CROSSCUT://一键横切 + m_pMainWidgetFunction->funFullAutoCrossCutting(); + break; + case FUN_SET_WORK_HEAD://设置工作机头 九宫格 + { + if(g_pMachine != NULL) + { + static int head = 1;//1:左机头 2:右机头 3:双机头 + head += 1; + if(head > 3) + { + head = 1; + } + g_pMachine->setWorkHead(head); + ui->buttonNineBtn3->setTopImage(m_setControlStyle.getTopStyleSheet(m_nineBtn.value(3).m_topImageName+QString::number(head))); + } + } + break; + + default: + break; + } +} + +//执行辅助按钮功能 +void MainWidget::runAssistBtnFunction(int funEnum,int idx) +{ + if(m_pMainWidgetFunction == NULL) + { + return; + } + unsigned char cmd[6]{0X04,0xE4,0x04,0x00,0xFF,0x14}; //启动扫码器的指令 + QByteArray scanCmd((const char*)cmd,6); + QString topImageName = m_assistItemList[idx].m_topImageName; + //加载按钮顶图图标 + QString tStyle = m_setControlStyle.getTopStyleSheet(topImageName); + + switch (funEnum) + { + case ASSIST_SENSOR://传感器信号 + { + if (m_pSensorInputWi != NULL) + { + //注释掉此行代码,因为获取位图下位机会返回全on的状态, + //会使传感器界面闪一下,在连接后读取了一下,这里不再读取 + //g_pMachine->getSensorEnBmpFromMachine(); + g_pMachine->entrySensorScan(); + + m_pSensorInputWi->setTypeLogo(tStyle); + m_pSensorInputWi->setMainTitle(tr("Sensor signal")); + m_pSensorInputWi->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Sensor signal")); + m_pSensorInputWi->show(); + } + } + break; + + case ASSIST_CONTROLACTION://控制动作 + { + if (m_pControlActionWi != NULL) + { + m_pControlActionWi->setTypeLogo(tStyle); + m_pControlActionWi->setMainTitle(tr("Control action")); + m_pControlActionWi->setSubTitle(tr("Auxiliary Function") + " > " + tr(" Control action")); + + m_pControlActionWi->refreshUi(); + m_pControlActionWi->show(); + } + } + break; + + case ASSIST_HMIUPGRADE://界面升级 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + return; + } + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funHMIUpgrade(tStyle); + } + + } + break; + + case ASSIST_HMIBACKUPSUPGRADE://界面还原 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + return; + } + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funHMIBackupsUpgrade(tStyle); + } + + } + break; + + case ASSIST_MCUPGRADE://主控升级 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + return; + } + + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funMCUpgrade(tStyle); + } + } + break; + + + case ASSIST_PARAIMPORT://参数导入 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + { + return;//就不执行下边的代码,不显示界面 + } + } + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funImportParameter(tStyle); + } + } + break; + + case ASSIST_PARAEXPORT://参数导出 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + { + return; + } + } + g_pMachine->getInfoFromMachine(); + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funExportParameter(); + } + } + break; + + case ASSIST_SOFTWARESET://软件设置 + { + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Accessibility")); + m_pParameterSetDlg->setSubTitle(tr("Accessibility > Software setting")); + //软件设置参数 + // m_pParameterSetDlg->setItemValue(SET_THEME,g_emTheme); //主题 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_SOFTWARESET); + int language = g_pSettings->readFromIniFile("HMI/language").toInt(); + m_pParameterSetDlg->setItemValue(SET_LANGUAGE,language); //语言 + + int frontsize = g_pSettings->readFromIniFile("HMI/FrontSize").toInt(); + m_pParameterSetDlg->setItemValue(SET_FONTSIZE,frontsize); //字体大小 + + m_pParameterSetDlg->exec(); + } + break; + + case ASSIST_AUTHORIZATION://软件授权 + { + m_pMainWidgetFunction->funSoftwareAuthor(); + } + break; + + case ASSIST_NETWORK://网络管理 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + { + return; + } + } + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Accessibility")); + m_pParameterSetDlg->setSubTitle(tr("Accessibility > Network Manage")); + + //网络管理参数 + //添加相应主板数的IP参数 + m_pParameterSetDlg->setNetworkItemList(PARA_TYPE_NETWORKSET); + m_pParameterSetDlg->exec(); + } + break; + + case ASSIST_WIFI: + { + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funWIFI(tStyle); + } + } + break; + case ASSIST_TIMESET://时间设置 + { + //得到当前时间 + QDateTime time; + time = QDateTime::currentDateTime();//获取系统现在的时间 + + QString yearStr = time.currentDateTime().toString("yyyy"); + QString monthStr = time.currentDateTime().toString("MM"); + QString dayStr = time.currentDateTime().toString("dd"); + QString hourStr = time.currentDateTime().toString("hh"); + QString minuteStr = time.currentDateTime().toString("mm"); + QString secondStr = time.currentDateTime().toString("ss"); + + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Time setting")); + m_pParameterSetDlg->setSubTitle(tr("Accessibility > Time setting")); + //时间设置参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_TIMESET); + m_pParameterSetDlg->setItemValue(1,yearStr.toInt()); //年 + m_pParameterSetDlg->setItemValue(2,monthStr.toInt()); //月 + m_pParameterSetDlg->setItemValue(3,dayStr.toInt()); //日 + m_pParameterSetDlg->setItemValue(4,hourStr.toInt()); //时 + m_pParameterSetDlg->setItemValue(5,minuteStr.toInt()); //分 + m_pParameterSetDlg->setItemValue(6,secondStr.toInt()); //秒 + + m_pParameterSetDlg->exec(); + } + break; + + case ASSIST_PRODUCTSTATICS://生产统计 + { + int patternBreakLineNum = 0;//花样断线停车次数 + m_pMainWidgetFunction->funProductStatistics(tStyle,m_curFilePath,patternBreakLineNum); + } + break; + + + case ASSIST_ERRORLOG://错误日志 + { + if(g_emDebugMode == nodebugMode && g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + return; + } + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funJournalError(tStyle); + } + + } + break; + + case ASSIST_MCVERSION://N1版本信息 + { + g_pMachine->getInfoFromMachine(); + m_pMainWidgetFunction->funGetMCVersionInfo(); + } + break; + + case ASSIST_BOTTOMLINEDETECT://底线检测 + { + m_pMainWidgetFunction->funBottomDetect(); + } + break; + + case ASSIST_FACELINEDETECT://面线检测 + { + m_pMainWidgetFunction->funFaceDetect(); + } + break; + + case ASSIST_SPINDLETEST://主轴研车(试机) + { + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Spindle test")); + m_pParameterSetDlg->setSubTitle(tr("Accessibility > Spindle test")); + + //超级用户参数 + m_pParameterSetDlg->setItemList(-1,operate,PARA_TYPE_SPINDLETEST); + if(m_pParameterSetDlg->exec() == 1) + { + s32 para1 = m_pParameterSetDlg->getItemValue(1); + s32 para2 = m_pParameterSetDlg->getItemValue(2); + + if(g_pMachine != NULL) + { + g_pMachine->embSpindleTest(para1,para2); + } + } + } + break; + + case ASSIST_CHANGEASHUTTLE: //自动换一个梭 + m_pMainWidgetFunction->funChangeOneShuttle(); + break; + + case ASSIST_ROOT://超级用户 + { + if(g_emDebugMode == nodebugMode && g_emUser != root)//超级用户 + { + m_pMainWidgetFunction->slotUserLogin(root); + if(g_emUser != root)//发送登录信号后,权限如果还没改变就返回 + return; + } + + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Root")); + m_pParameterSetDlg->setSubTitle(tr("Accessibility > Root")); + //超级用户参数 + m_pParameterSetDlg->setItemList(root,PARA_TYPE_ROOT); + m_pParameterSetDlg->exec(); + } + break; + + case ASSIST_BOTTOMLINECOUNTRESET://底线计数复位 + { + if(m_pMainWidgetFunction != NULL) + { + m_pMainWidgetFunction->funBottomLineCountReset(); + } + } + break; + + case ASSIST_DEBUGINFO: //调试信息 + m_pMainWidgetFunction->funDebugInfo(); + break; + + case ASSIST_SHUTDOWN: //关机 + m_pMainWidgetFunction->funShutDown(); + break; + + case ASSIST_ScanTest: //扫码测试 + qDebug()<<"scanCmd send" << scanCmd.data(); + QMetaObject::invokeMethod(m_pScanComPort,"slotSendData",Q_ARG(QByteArray,scanCmd)); + break; + default: + break; + } +} + +//执行花样设置按钮功能 +void MainWidget::runPatternSetBtnFunction(int funEnum, int idx) +{ + if(m_pMainWidgetFunction == NULL) + { + return; + } + + QString topImageName = m_patternSetItemList[idx].m_topImageName; + //加载按钮顶图图标 + QString tStyle = m_setControlStyle.getTopStyleSheet(topImageName); + // QString bStyle = m_setControlStyle.getBottomStyleSheet(ui->buttonAssist1->parent()->objectName()); + + switch (funEnum) + { + case PATTERNSET_PATTERNSELECT://花样选择 + patternSelect(); + break; + + case PATTERNSET_PATTERNPARA://花样参数 + //showPatternPreview(); + slotShowPatternPara(m_curFilePath); + break; + + case PATTERNSET_ALGORITHMPARA://分割参数 + slotShowPara("PLT"); + break; + + case PATTERNSET_PATTERNIMPORT://花样导入 + { + m_pPatternManageWi->setTypeLogo(tStyle); + m_pPatternManageWi->setMainTitle(tr("Pattern import")); + m_pPatternManageWi->setSubTitle(tr("Pattern setting") + "> " + tr("Pattern import")); + + PatternManageWidget::MANAGE_MODE mode = PatternManageWidget::MANAGE_IMPORT; + + QSize size = m_pPatternSelectWi->getImageSize(); + m_pPatternManageWi->setImportImageSize(size); + m_pPatternManageWi->patternManage(mode); + } + break; + + case PATTERNSET_PATTERNEXPORT://花样导出 + { + m_pPatternManageWi->setTypeLogo(tStyle); + m_pPatternManageWi->setMainTitle(tr("Pattern export")); + m_pPatternManageWi->setSubTitle(tr("Pattern setting") + "> " + tr("Pattern export")); + + PatternManageWidget::MANAGE_MODE mode = PatternManageWidget::MANAGE_EXPORT; + m_pPatternManageWi->patternManage(mode); + } + break; + + case PATTERNSET_PATTERNDELETE://花样删除 + { + if(g_emUser != repair)//权限不够先登录 + { + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + { + return; + } + } + m_pPatternManageWi->setTypeLogo(tStyle); + m_pPatternManageWi->setMainTitle(tr("Pattern delete")); + m_pPatternManageWi->setSubTitle(tr("Pattern setting") + "> " + tr("Pattern delete")); + + PatternManageWidget::MANAGE_MODE mode = PatternManageWidget::MANAGE_DELETE; + m_pPatternManageWi->patternManage(mode); + } + break; + + case PATTERNSET_PATTERNEDIT://花样编辑 + { + m_pPatternEditWi->refreshView(m_curFilePath); + } + break; + + case PATTERNSET_NEEDLEPREVIEW://排针预览 + { + QByteArray ary; + ary.clear(); + ary.append(g_pCurEmbData->getAbsDat()); + m_pPatternNeedleWi->showView(m_curFilePath,ary); + } + break; + + case PATTERNSET_LINEGENER://线迹生成 + { + m_pLineGenerWi->refreshView(); + m_pPatternNeedleWi->refreshSpace(); + m_pPatternNeedleWi->on_buttonClear_clicked(); + } + break; + + default: + break; + } + +} + +//等待超时 +void MainWidget::slotWaitTimout() +{ + m_timoutflag = 1; +} + +//机器状态 +void MainWidget::slotMachineStatus(int toggle) +{ + memcpy(&m_mcStatus, &g_pMachine->getMcStatus(), sizeof(MCStatus)); + + if(m_pMainWidgetFunction != NULL) + { + //收到主控发的机器状态改变的信号,进到这个槽函数里(在MainWidgetFunction.cpp里用于读取电位器值) + m_pMainWidgetFunction->setMcStates(m_mcStatus); + } + m_conFlag = toggle; + + showExecInfo();//显示机器运行状态中的信息 + + //工作状态,工作中按钮不可按,并显示大图 + if(m_workStatus != m_mcStatus.workStatus) + { + m_workStatus = m_mcStatus.workStatus; + + if ((m_workStatus & WORK_STA_SIMULATE) == WORK_STA_SIMULATE) //模拟工作 + { + ui->labelWorkState->setStyleSheet(warnTextColour()); + ui->labelWorkState->setText(tr("Simulated working"));//模拟工作 + ui->labelWorkState->setVisible(true); + } + else //正常工作 + { + ui->labelWorkState->setStyleSheet(titleTextColour()); + ui->labelWorkState->setText(tr("Normal operation"));//正常工作 + ui->labelWorkState->setVisible(true); + } + + //开始扫码 + if((m_workStatus & WORK_STA_EN_SCAN) == WORK_STA_EN_SCAN) + { + qDebug()<< "WORK_STA_EN_SCAN true"; + unsigned char cmd[6]{0X04,0xE4,0x04,0x00,0xFF,0x14}; //启动扫码器的指令 详见文档ScanHome扫码器指令控制设置-V4.0 + QByteArray scanCmd((const char*)cmd,6); + QMetaObject::invokeMethod(m_pScanComPort,"slotSendData",Q_ARG(QByteArray,scanCmd)); + } + + //正在工作,按钮不可按 + if((m_workStatus & WORK_STA_WORKING) == WORK_STA_WORKING) + { + if(g_emMacType != MACHINE_CUTTINGWALK) + { + showSpeedFrame(); + } + setUiBtnEnable(false); + + //不是执行状态,重置 + setNotExecing(); + + if(!ui->labelPatternView->isVisible())//不是主图灰图界面 + { + hideMenuFrame(); + showPatternPreview(); + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); + } + + //如果工作中错误提示窗体显示,则自动消失 + //从非工作状态进入工作中时,如果错误提示窗体显示,则自动消失 + if ((m_oldWorkStatus & WORK_STA_WORKING) != WORK_STA_WORKING) + { + m_pMainWidgetFunction->funSetPromptDlgVisibleFalse(); + } + } + else + { + if(g_emMacType != MACHINE_CUTTINGWALK) + { + showNineFrame(); + } + setUiBtnEnable(true); + } + + if ((m_workStatus & WORK_STA_NEW_PARA) == WORK_STA_NEW_PARA) //参数更新标志 + { + if(m_pParameterSetDlg->isVisible() == true) + { + g_pMachine->getParasFromMachine();//获取参数 + g_pMachine->cleanNewParaFlag();//清除刷新参数标志 + } + } + m_oldWorkStatus = m_workStatus; + } + + //错误代码 + if (m_mcStatus.errorCode == 0) + { + m_errorCode = m_mcStatus.errorCode; + ui->labelState->setText(tr("Ready"));//状态:已就绪 + if((m_workStatus & WORK_STA_WORKING) == WORK_STA_WORKING) + { + ui->labelState->setText(tr("Working"));//状态: 工作中 + } + } + else + { + u32 errcode = m_mcStatus.errorCode; + if(errcode != m_errorCode) + { + m_errorCode = errcode; + + QString info; + info.clear(); + info = getErrStr(m_mcStatus.errorCode); + //如果不是通用错误(即info为空),就从机型cpp中的错误代码查找 + if(info.length() <= 0) + { + for(int i = 0; i < m_errorCodeAndStateItemList.size(); i++) + { + if(m_mcStatus.errorCode == m_errorCodeAndStateItemList[i].m_code) + { + info = m_errorCodeAndStateItemList[i].m_name; + break; + } + } + } + //如果不是通用错误也不是机型cpp中的错误代码,就显示未定义错误 + if(info.length() <= 0) + { + QString errorCode; + errorCode.sprintf("CODE 0x%x", m_mcStatus.errorCode); + info.append(tr("Undefined error,") + errorCode);//未定义错误, + } + + ui->labelState->setText(info);//状态: + + if ((errcode > 0 && errcode < 0x100) || errcode > 0x200) + { + m_pMainWidgetFunction->funErrorPrompt(info); + //将报错代码写入csv + g_pSettings->writeToCsv(info,TYPE_ERROR);//保存 + } + else + { + if(m_mcStatus.errorCode == STA_LINE_TBREAK) + { + //检测断线状态 + int ret = m_pMainWidgetFunction->funDetectBreakLineStatus(); + if(ret != 0)//断线报错 + { + + } + } + } + } + } +} + +void MainWidget::slotShowPercentage(int val) +{ + ui->labelTitle->setText(QString::number(val)+"%"); +} + +void MainWidget::slotRefreshWifiIcon(bool bl) +{ + if(bl == true)//已连接 + { + ui->buttonWifi->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonWifi->objectName()+"Connect")); + } + else + { + ui->buttonWifi->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonWifi->objectName()+"Unconnect")); + } +} + +void MainWidget::slotResetAnchorPos(DataFilePos pos) +{ + if(m_pMainWidgetFunction != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + m_pMainWidgetFunction->funResetAnchorPoint(m_curFilePath,pos); + + int begX = g_pCurEmbData->getBeginX(); + int begY = g_pCurEmbData->getBeginY(); + + QString startStr = QString("%1/%2").arg(QString::number(begX/100,'f',2)).arg(QString::number(begY/100,'f',2)); + ui->lab_StartPoint_2->setText(startStr); + + double minX = g_pCurEmbData->getMinX() / 100.0; + double minY = g_pCurEmbData->getMinY() / 100.0; + double maxX = g_pCurEmbData->getMaxX() / 100.0; + double maxY = g_pCurEmbData->getMaxY() / 100.0; + + QString rangeX = QString("%1/%2") + .arg(QString::number(minX, 'f', 2)) + .arg(QString::number(maxX, 'f', 2)); + QString rangeY = QString("%1/%2") + .arg(QString::number(minY, 'f', 2)) + .arg(QString::number(maxY, 'f', 2)); + + ui->lab_Range_21->setText(rangeX); + ui->lab_Range_22->setText(rangeY); + } + } +} + +void MainWidget::slotShowPatternPara(QString filePath,s16 showFlag) +{ + QString beforeFilePath = m_curFilePath; + qDebug()<" + tr(" Head spacing"));// 花样设置 > 机头间距 + headDialog.initDsrFileInfo(m_curFilePath); + headDialog.setTypeLogo(tStyle); + + if((showFlag == 0) && ("DSR" == QFileInfo(filePath).suffix().toUpper())) + { + //执行修改机头间距界面 + int result = headDialog.exec(); + if(result != 1) + { + //点击取消按钮后花样路径恢复为上次选中的花样 + m_curFilePath = beforeFilePath; + return; + } + } + } + + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Pattern para"));//花样参数 + m_pParameterSetDlg->setSubTitle(tr("Pattern setting") + ">" + tr(" Pattern para"));// 花样设置 > 花样参数 + + QFileInfo fileInfo(m_curFilePath); + QString suffix = fileInfo.suffix().toUpper(); + //为plt文件时不显示花样参数设置窗体 + if(suffix != "PLT") + { + showDiffPara(suffix);//根据文件格式不同显示不同花样参数 + } + else + { + memset((char*)&m_patternSetPara,0,sizeof(PatternSetPara)); + showFlag = 1; + } + m_pParameterSetDlg->setCurPage(1); + + s16 value = 0; + if(showFlag)//不显示此窗体直接加载花样参数(适用于开机自动加载花样文件) + { + value = 1; + m_pPatternSelectWi->hide(); + } + else //显示此窗体 + { + if(!m_whetherShowFlag) + { + m_whetherShowFlag=1; + return; + } + value = m_pParameterSetDlg->exec(); + m_pPatternSelectWi->hide(); + } + + if(value == 1)//花样参数设置(点击了确定按钮或直接加载文件后加载花样参数) + { + //TODO 机头列表界面设置 + + //快进快退等功能可用 + for(int i = 0; i < m_quickItemList.size(); i++) + { + int enumFun = m_quickItemList[i].m_enumFunction; + if(enumFun == FUN_FORWARDORBACK ||//快进快退 + enumFun == FUN_SETSTARTPOINT ||//定起始点 + enumFun == FUN_BACKSTARTPOINT ||//回起始点 + enumFun == FUN_CHECKFRAME //边框检查 + ) + { + if(m_curFilePath.length() > 0)//选择文件后快进快退等按钮可用 + { + m_quickBtnList[i]->setEnabled(true); + } + } + } + + //有花样时花样参数、花样色序、可按 + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNPARA || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNEDIT || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_NEEDLEPREVIEW) + { + m_patternSetBtnList[i]->setEnabled(true); + } + } + + //为plt文件时不显示花样参数设置窗体,且不设置参数 + if(suffix != "PLT") + { + showDiffPara(suffix,1); + } + + slotSetPatternData();//设置花样数据并显示 + +#if(0)//昆仑通态操作屏下有问题,所以注释掉 + if(m_pPromptDlg->isVisible())//若是可见的 + { + m_pPromptDlg->hide();//隐藏加载花样的提示窗体 + } +#endif + + //发送五头机机头间距数据 + if((m_linkSta == Connected) && (g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING)) + { + g_pMachine->setHeadSpacing(headDialog.getHeadData()); + } + + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + calPointsAndSetDoubleCombQui(); + } + else + { + //计算起始点和定位点并设置 + calPointsAndSet(); + } + + ui->lab_Locate_2->setText(QString("%1/%2") + .arg(QString::number((double)m_patternSetPara.left/10,'f',1)) + .arg(QString::number((double)m_patternSetPara.front/10,'f',1))); //定位点 从左边前边获取 + + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getBeginX()" << g_pCurEmbData->getBeginX(); + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getBeginY()" << g_pCurEmbData->getBeginY(); + + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ui->lab_StartPoint_2->setText(QString("%1/%2") + .arg(QString::number(g_pCurEmbData->getBeginX()*0.01,'f',2)) + .arg(QString::number(g_pCurEmbData->getBeginY()*0.01,'f',2))); + + ui->lab_Head2_StartPointVal->setText(QString("%1/%2") + .arg(QString::number(g_pCurEmbData->getBeginX2()*0.01,'f',2)) + .arg(QString::number(g_pCurEmbData->getBeginY2()*0.01,'f',2))); + } + else + { + // 20250118 Marshal Lee 修改为从发送数据取数据 + ui->lab_StartPoint_2->setText(QString("%1/%2") + .arg(QString::number((double)g_pCurEmbData->getBeginX()/100,'f',2)) + .arg(QString::number((double)g_pCurEmbData->getBeginY()/100,'f',2))); + } + + double minX = g_pCurEmbData->getMinX() / 100.0; + double minY = g_pCurEmbData->getMinY() / 100.0; + double maxX = g_pCurEmbData->getMaxX() / 100.0; + double maxY = g_pCurEmbData->getMaxY() / 100.0; + + QString rangeX = QString("%1/%2") + .arg(QString::number(minX, 'f', 2)) + .arg(QString::number(maxX, 'f', 2)); + QString rangeY = QString("%1/%2") + .arg(QString::number(minY, 'f', 2)) + .arg(QString::number(maxY, 'f', 2)); + + ui->lab_Range_21->setText(rangeX); + ui->lab_Range_22->setText(rangeY); + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getMinX()" << g_pCurEmbData->getMinX(); + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getMinY()" << g_pCurEmbData->getMinY(); + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getMaxX()" << g_pCurEmbData->getMaxX(); + qDebug() << " ++++++++++++++++++ g_pCurEmbData->getMaxY()" << g_pCurEmbData->getMaxY(); + + if(m_linkSta == Connected)//已连接 + { + m_pMainWidgetFunction->sendPatternData(m_curFilePath);//发送花样数据 + //设置为按进度执行模式 + g_pCurEmbData->setExecIndex(m_curDatIdx); // 设置进度 + } + } + else + { + //点击取消按钮后花样路径恢复为上次选中的花样 + m_curFilePath = beforeFilePath; + } +} + +void MainWidget::slotShowPatternEdit(QString filePath) +{ + m_pPatternEditWi->refreshView(filePath); +} + +void MainWidget::slotShowPara(QString suffix) +{ + //获得花样参数的图标 + QString tStyle; + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_ALGORITHMPARA) + { + QString topImageName = m_patternSetItemList[i].m_topImageName; + //加载按钮顶图图标 + tStyle = m_setControlStyle.getTopStyleSheet(topImageName); + break; + } + } + + showDiffPara(suffix);// 显示不同花样的参数 + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Pattern para"));//花样参数 + m_pParameterSetDlg->setSubTitle(tr("Pattern setting") + ">" + tr(" Pattern para"));// 花样设置 > 花样参数 + m_pParameterSetDlg->setCurPage(1); + m_pParameterSetDlg->exec(); +} + +void MainWidget::slotTcpRecvFile(QString filePath) +{ + qDebug()<< "tcp RecvFile : "< 0) + { + QFile file(m_curFilePath); + if(!file.exists())//不存在 + { + m_curFilePath.clear(); + + //花样参数不可按 + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNPARA || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNEDIT || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_NEEDLEPREVIEW) + { + m_patternSetBtnList[i]->setEnabled(false); + } + } + + if(g_pMachine != NULL) + { + g_pMachine->invalidateWorkFile(); + } + } + } +} + +//花样导入替换文件,判断替换文件是否是当前所选的花样 +void MainWidget::slotReplacePattrn(QString path) +{ + QFileInfo file(m_curFilePath); + QFileInfo newfile(path); + QString pathPattern = file.fileName(); + QString newPathPattern = newfile.fileName(); + if(m_curFilePath.length() > 0)//当前选择的花样路径 + { + if(pathPattern == newPathPattern)//如果替换的花样等于当前选择的花样 + { + m_curFilePath.clear();//清空当前的花样,并重新选择 + + //花样参数、花样色序不可按 + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNPARA || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNCOLOR || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNEDIT || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_NEEDLEPREVIEW) + { + m_patternSetBtnList[i]->setEnabled(false); + } + } + + if(g_pMachine != NULL) + { + g_pMachine->invalidateWorkFile(); + } + } + } +} + +void MainWidget::slotClearPatternFcg() +{ + if(m_curFilePath.length() > 0)//当前选择的花样路径 + { + m_curFilePath.clear(); + + //花样参数、花样色序不可按 + for(int i = 0; i < m_patternSetItemList.size(); i++) + { + if(m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNPARA || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_PATTERNEDIT || + m_patternSetItemList[i].m_enumFunction == PATTERNSET_NEEDLEPREVIEW) + { + m_patternSetBtnList[i]->setEnabled(false); + } + } + + for(int i = 0; i < m_quickItemList.size(); i++) + { + int enumFun = m_quickItemList[i].m_enumFunction; + if(enumFun == FUN_FORWARDORBACK ||//快进快退 + enumFun == FUN_SETSTARTPOINT ||//定起绣点 + enumFun == FUN_BACKSTARTPOINT ||//回起绣点 + enumFun == FUN_CHECKFRAME //边框检查 + ) + { + m_quickBtnList[i]->setEnabled(false); + } + } + + ui->buttonNineBtn1->setEnabled(false); + + if(g_pMachine != NULL) + { + g_pMachine->invalidateWorkFile(); + } + } +} + +//设置花样数据 +void MainWidget::slotSetPatternData() +{ + if(m_curFilePath.length() <= 0) + { + return; + } + QFile curfile(m_curFilePath); + if(!curfile.exists()) + { + return; + } + + if(m_pParameterSetDlg == NULL){return;} + + g_pCurEmbData->setViewInfo(m_embBackPix); + g_pCurEmbData->setDrawMode(EmbData::DRAW_VIEW);//非预览模式 + QFileInfo file(m_curFilePath); + QString ext = file.suffix().toUpper(); + QString fileName = file.fileName().left(file.fileName().size() - 4);//去掉结尾dsr + ui->lab_FileName_2->setText(fileName); //去掉结尾的dsr + g_pCurEmbData->clear();//清空当前选择的花样 + + if(appendDiffAbsData(ext) != 0) + { + return; + } + + g_pCurEmbData->appendAEmbAbsFile(m_curFilePath, g_pCurEmbData->getAbsDat());//生成文件信息 + + //旋转式样 + switch (m_patternSetPara.rotateStyle) + { + case 0: + break; + case 1: + g_pCurEmbData->setRotate90(true); + break; + case 2: + g_pCurEmbData->setMirror(MirrorType::BothMirror); + break; + case 3: + g_pCurEmbData->setRotate90(false); + break; + case 4: + g_pCurEmbData->setMirror(MirrorType::HorizontalMirror); + break; + case 5: + g_pCurEmbData->setMirror(MirrorType::HorizontalMirror); + g_pCurEmbData->setRotate90(true); + break; + case 6: + g_pCurEmbData->setMirror(MirrorType::VerticalMirror); + break; + case 7: + g_pCurEmbData->setMirror(MirrorType::HorizontalMirror); + g_pCurEmbData->setRotate90(false); + break; + } + + //旋转 + g_pCurEmbData->setRotate(360-m_patternSetPara.rotateAngle); + +// g_pCurEmbData->getAbsDatRangeXY();//获得单个图元的宽高范围 + +#if 01 + //屏蔽 否则dstr 定起始点功能不准 + //g_pCurEmbData->setDatSizeChange(m_patternSetPara.scanX, m_patternSetPara.scanY); // 设置尺寸变化(缩放) + + //if(ext == "QUI" || ext == "QUIX") + { + //reFitLine的拟合算法更好 针步拟合 + //g_pCurEmbData->reFitByStep(m_patternSetPara.normalStep); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + int value = g_pSettings->readFromIniFile("HMI/splitStep").toInt(); + if(value == 1)//分割针步 + { + g_pCurEmbData->reFitLineDoubleHead(m_patternSetPara.normalStep); + } + } + else + { + int value = g_pSettings->readFromIniFile("HMI/splitStep").toInt(); + if(value == 1)//分割针步 + { + g_pCurEmbData->reFitLine(m_patternSetPara.normalStep); + } + } + } +#endif + + g_pCurEmbData->setSplitLen(m_patternSetPara.bisect);//用于粗线布线机 + + //双头组合机型要去除特别小的偏移针步,因为打版时切断连接没有那么紧密,其实是要相连的 + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_THICK_WIRING || g_emMacType == MACHINE_FOURHEADQUI) + { + g_pCurEmbData->setOftNeedleSize(m_patternSetPara.oftNeedleSize); + } + //加锁针 + g_pCurEmbData->addLockStitchs(m_patternSetPara.reinMode, m_patternSetPara.reinNeedles, m_patternSetPara.reinNum); // 添加锁针针步 + + //角度修正 + //#if(0) + g_pCurEmbData->angleCorrection(m_patternSetPara.angleCorrOffset*10); // 角度修正,修正固定值 + //#else + // 角度修正,X正负和Y正负分别修正 + g_pCurEmbData->angleCorrectionXY(m_patternSetPara.angleCorrPosX*10,m_patternSetPara.angleCorrNegX*10,m_patternSetPara.angleCorrPosY*10,m_patternSetPara.angleCorrNegY*10); + //#endif + + //如果为多针机,处理最后一个针步的角度,将最后一针到第一针的角度放在最后一个针步上 + if(g_emMacType == MACHINE_L2000_MULTI) + { + g_pCurEmbData->setLastStepAngle(); + } + + if (g_emMacType == MACHINE_CUTTINGWALK) //边走边裁 + { + g_pCurEmbData->setCut2CornerStep(); // 增加拐点数据 + g_pCurEmbData->setCut2FitSplitStep(); // 分割切刀数据 + g_pCurEmbData->setCut2JudgInterval(); // 判断区间 + //g_pCurEmbData->setCut2ModifyDataDir(); // 修改数据方向-注释 + g_pCurEmbData->setCut2SortNewData(); // 排序&组成新数据 + g_pCurEmbData->setCut2AddCutterComption2(); // 增加圆刀补偿数据 + g_pCurEmbData->setCut2AddOffsetData(); // 增加偏移数据,结束码 + //g_pCurEmbData->recalculateAngles(); //重新计算角度-注释 + } + + resetAllData(); //显示全部花样区域 + + u32 paraId = calcCrc16((u8*)(&m_patternSetPara),sizeof(m_patternSetPara)); + u32 headFileId = g_pCurEmbData->getDsDatHead()->checkCrc + paraId; + g_pCurEmbData->setDsDatHeadFileID(headFileId); //将计算得到的fileid写回到数据区 + qDebug() << "slotSetPatternData() 2 headFileId============================" << headFileId; + showPatternPreview(); +} + +void MainWidget::slotEditPattern() +{ + if(m_pPatternEditWi != NULL) + { + m_pPatternEditWi->hide(); + QByteArray ary = m_pPatternEditWi->getEditDat(); + int size = ary.size(); + if (size <= (int)(sizeof(DsrHead))) + { + return; + } + DsrHead * dsrHead = (DsrHead *)(ary.data());//头文件的结构体 + size -= dsrHead->dataBegin; + + if (size <= 0) + { + return; + } + int stepsize = size/sizeof(DsrStep); + if (stepsize <= 0) + { + return; + } + DsrStep * dsrDataBeg = (DsrStep *)((ary.data() + dsrHead->dataBegin)); + + // 绝对坐标数据 + DataDs16FileHead dhead; + memset(&dhead, 0, sizeof(DataDs16FileHead)); + + QByteArray absData;//绝对坐标 + absData.clear(); + DsAbsItem absItem; + memset(&absItem,0,sizeof(DsAbsItem)); + + DsrStep * dsrDataPtr = dsrDataBeg; + + //都减去第一个点坐标,并转换为中间数据 + for (int i = 0; i < stepsize; i++) + { + absItem.ctrl = dsrDataPtr->ctrl; + absItem.attr = dsrDataPtr->attr; + absItem.ax = 0 - dsrDataPtr->dx; + absItem.ay = 0 - dsrDataPtr->dy; + absItem.ar = dsrDataPtr->dr; + + absData.append((char*)(&absItem), sizeof(DsAbsItem)); + dsrDataPtr++; + } + + int begX = dsrHead->startX; + int begY = dsrHead->startY; + int anchorX = dsrHead->anchorX; + int anchorY = dsrHead->anchorY; + + int newstepnum = stepsize; // 转换后的数据长度 + + QFileInfo file(m_curFilePath); + // 文件头转换 + QString name = file.fileName(); + int namelen = name.size(); + if (namelen > HEAD_NAME_STR_LEN) + { + namelen = HEAD_NAME_STR_LEN; + } + memcpy(dhead.fileName, name.data(), namelen); // 文件名称 + dhead.dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 + dhead.itemNums = newstepnum; // 数据项个数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + dhead.dataChecksum = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 原始数据累加校验和 + dhead.fileid = fileID; //中间数据的 fileid = + qDebug()<< __FUNCTION__ << " dhead.fileid" << dhead.fileid; + dhead.anchorX = anchorX; // 定位点坐标X + dhead.anchorY = anchorY; // 定位点坐标Y + dhead.beginX = begX; // 数据起点坐标X + dhead.beginY = begY; // 数据起点坐标Y + dhead.beginR = 0; + dhead.minX = dsrHead->rangePx; + dhead.maxX = dsrHead->rangeNx; + dhead.minY = dsrHead->rangePy; + dhead.maxY = dsrHead->rangeNy; // 轮廓范围,使用重新计算之后的值 + absData.insert(0,(char*)&dhead,sizeof(DataDs16FileHead)); + + g_pCurEmbData->setViewInfo(m_embBackPix); + g_pCurEmbData->setDrawMode(EmbData::DRAW_VIEW);//非预览模式 + QString fileName = file.fileName().left(file.fileName().size() - 4);//去掉结尾dsr + ui->lab_FileName_2->setText(fileName); //去掉结尾的dsr + g_pCurEmbData->clear();//清空当前选择的花样 + + g_pCurEmbData->appendAEmbAbsFile(m_curFilePath,absData); + + resetAllData(); //显示全部花样区域 + + //显示花样范围 + double minX = g_pCurEmbData->getMinX() / 100.0; + double minY = g_pCurEmbData->getMinY() / 100.0; + double maxX = g_pCurEmbData->getMaxX() / 100.0; + double maxY = g_pCurEmbData->getMaxY() / 100.0; + QString rangeX = QString("%1/%2") + .arg(QString::number(minX, 'f', 2)) + .arg(QString::number(maxX, 'f', 2)); + QString rangeY = QString("%1/%2") + .arg(QString::number(minY, 'f', 2)) + .arg(QString::number(maxY, 'f', 2)); + ui->lab_Range_21->setText(rangeX); + ui->lab_Range_22->setText(rangeY); + + u32 paraId = calcCrc16((u8*)(&m_patternSetPara),sizeof(m_patternSetPara)); // 2025.2.25 + u32 headFileId = g_pCurEmbData->getDsDatHead()->checkCrc + paraId; + qDebug() << "1 headFileId= " << headFileId; + g_pCurEmbData->setDsDatHeadFileID(headFileId); //将计算得到的fileid写回到数据区 + showPatternPreview(); + + if(m_linkSta == Connected)//已连接 + { + m_pMainWidgetFunction->sendPatternData(m_curFilePath);//发送花样数据 + //设置为按进度执行模式 + g_pCurEmbData->setExecIndex(m_curDatIdx); // 设置进度 + } + } +} + +void MainWidget::slotEditPatternFinish(s16 val) +{ + //覆盖源文件时,主界面需要重新加载这个文件 + if(val == 1) + { + slotShowPatternPara(m_curFilePath,-1); + } + + hideMenuFrame(); + showPatternPreview(); + ui->frameNineBtn->setVisible(true); + ui->frameEmbInfo->setVisible(true); + ui->buttonMainMenu->setChecked(true); +} + +//排针预览后刷新图形 +void MainWidget::slotPatternNeedlePreview() +{ + if(m_pPatternNeedleWi == NULL) + { + return; + } + + unsigned char arrayNeedle1[LAYOUTNEEDLENUM]; // 第1排排针 + unsigned char arrayNeedle2[LAYOUTNEEDLENUM]; // 第2排排针 + unsigned char arrayNeedle3[LAYOUTNEEDLENUM]; // 第3排排针 + + int leftRightNeedleSpace = m_pPatternNeedleWi->getLeftRightNeedleSpace(); + int needleLayoutSpace12 = m_pPatternNeedleWi->getNeedleLayoutSpace12(); + int needleLayoutSpace23 = m_pPatternNeedleWi->getNeedleLayoutSpace23(); + int needlesSpace = m_pPatternNeedleWi->getNeedlesSpace(); + memcpy((char*)arrayNeedle1,(char*)(m_pPatternNeedleWi->getarrayNeedle1()),sizeof(arrayNeedle1)); + memcpy((char*)arrayNeedle2,(char*)(m_pPatternNeedleWi->getarrayNeedle2()),sizeof(arrayNeedle2)); + memcpy((char*)arrayNeedle3,(char*)(m_pPatternNeedleWi->getarrayNeedle3()),sizeof(arrayNeedle3)); + + g_pCurEmbData->setViewInfo(m_embBackPix); + + QByteArray ary = g_pCurEmbData->getDsDat(); + g_pCurEmbData->getOneDispDat(ary); + g_pCurEmbData->resetLayoutDispDat(arrayNeedle1,arrayNeedle2,arrayNeedle3,leftRightNeedleSpace,needlesSpace,needleLayoutSpace12,needleLayoutSpace23,0); + g_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(1); + + m_dispMode = EmbData::DISP_ALL_EXEC; + g_pCurEmbData->setDispMode(m_dispMode, 1); // 重新画图 + m_dispMode = EmbData::DISP_EXECING; // 设置为执行模式 + g_pCurEmbData->setDispMode(m_dispMode, 0); // 设置为按进度执行模式 + + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); + + hideMenuFrame(); + showPatternPreview(); + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); + m_pPatternNeedleWi->hide(); +} + +void MainWidget::slotTempNeedleLayoutPreview(QByteArray &dat) +{ + if(m_pPatternNeedleWi == NULL) + { + return; + } + + m_pPatternNeedleWi->showTempView(dat); +} + +//每十万针主界面加载图片的进度条走一格 +void MainWidget::slotChangeProgressBar(int value) +{ + ui->progressBar->setValue(value); +} + +//快捷功能中的快捷按钮被点击 +void MainWidget::slotQuickBtnClick() +{ + MyButton *button = (MyButton*) this->sender(); + + if(button == NULL) + { + return; + } + + //执行快捷按钮动作 + for(int i = 0; i < m_quickBtnList.size(); i++) + { + if(button == m_quickBtnList[i]) + { + int idx = (m_curPages-1)*m_itemPerPage+i; + int enumFun = m_quickItemList[idx].m_enumFunction; + runCommonBtnFunction(enumFun); + break; + } + } +} + +//辅助功能中的辅助功能按钮被点击 +void MainWidget::slotAssistBtnClick() +{ + MyButton *button = (MyButton*) this->sender(); + + if(button == NULL) + { + return; + } + + //执行快捷按钮动作 + for(int i = 0; i < m_assistBtnList.size(); i++) + { + if(button == m_assistBtnList[i]) + { + int idx = (m_curPages-1)*m_itemPerPage+i; + int enumFun = m_assistItemList[idx].m_enumFunction; + runAssistBtnFunction(enumFun,i); + break; + } + } +} + +//花样设置中的花样设置按钮被点击 +void MainWidget::slotPatternSetBtnClick() +{ + MyButton *button = (MyButton*) this->sender(); + + if(button == NULL) + { + return; + } + + //执行快捷按钮动作 + for(int i = 0; i < m_patternSetBtnList.size(); i++) + { + if(button == m_patternSetBtnList[i]) + { + int enumFun = m_patternSetItemList[i].m_enumFunction; + runPatternSetBtnFunction(enumFun,i); + break; + } + } +} + +//参数设置中的参数功能按钮被点击 +void MainWidget::slotParaTypeBtnClick() +{ + MyButton *button = (MyButton*) this->sender(); + + if(button == NULL) + { + return; + } + + QString bStyle = m_setControlStyle.getBottomStyleSheet(ui->buttonParaSet->parent()->objectName()); + QString tStyle = m_setControlStyle.getTopStyleSheet(ui->buttonParaSet->objectName()); + + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Parameter setting")); + + //执行快捷按钮动作 + for(int i = 0; i < m_paraSetBtnList.size(); i++) + { + if(button == m_paraSetBtnList[i]) + { + int paraType = m_paraSetItemList[i].m_paraType; + QString subStr; + int64_t sort = -1; + + switch (paraType) + { + case PARASET_ACTION://动作参数 + case PARASET_SPEED: //速度参数 + case PARASET_POSITION: // 限位参数 + case PARASET_DETECT: //检测参数 + if(g_emDebugMode == nodebugMode && g_emUser != repair){ + m_pMainWidgetFunction->slotUserLogin(repair); + if(g_emUser != repair) return; + } + if(paraType == PARASET_POSITION){ + subStr = tr("Position parameter");//限位参数 + sort = MC_SORT_POSITION; + }else if(paraType == PARASET_ACTION){ + subStr = tr("Action settings");//动作设定 + sort = MC_SORT_ACTION; + }else if(paraType == PARASET_SPEED){ + subStr = tr("Speed parameters");//速度参数 + sort = MC_SORT_SPEED; + }else if(paraType == PARASET_DETECT){ + subStr = tr("Detection parameters");//检测参数 + sort = MC_SORT_DETECT; + } + break; + + case PARASET_SETTING://工作参数 + subStr = tr("Work parameters");//工作参数 + sort = MC_SORT_SETTING; + break; + + case PARASET_ALL: + if(g_emDebugMode == nodebugMode && g_emUser != root){ + m_pMainWidgetFunction->slotUserLogin(root); + if(g_emUser != root) return; + } + subStr = tr("All parameters");//全部参数 + sort = -1; + break; + default: + break; + } + + m_pParameterSetDlg->setSubTitle(tr("Parameter setting") + " > " + subStr);//参数设置 > + //机器参数和工作参数 + m_pParameterSetDlg->setItemList(g_emUser,PARA_TYPE_MACH|PARA_TYPE_WORK,sort); + m_pParameterSetDlg->exec(); + break; + } + } +} + +//设置超级用户图标 +void MainWidget::slotSetButtonRootLogo(int level) +{ + ui->buttonUser->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonUser->objectName()+QString::number(level))); +} + +//清空花版断线次数 +void MainWidget::slotClearPatternBreakLineNum() +{ + +} + +void MainWidget::slotDebugState() +{ + if(g_emDebugMode == debugMode) + { + ui->labelTitle->setText(tr("Debugging mode")); //调试模式,禁止发机! + ui->labelTitle->setStyleSheet(warnTextColour()); + } + else + { + setLabelTitleText(g_emMacType);//根据机型显示主界面标题 + ui->labelTitle->setStyleSheet(titleTextColour()); + } +} + +void MainWidget::slotReceScanData(QByteArray data) +{ + QString fileName(data.left(data.size() - 1));// 去除结尾 /r + qDebug()<< "FileName:"<labelState->setText(tr("scanner data:") + fileName);//扫码数据: + QFileInfo info(fileName); + //判断数据格式 + if(QString("DSR") != info.suffix().toUpper()) + { + ui->labelState->setText(tr("scanner error:") + info.suffix().toUpper());//扫码错误: + return; + } + + //遍历文件夹 找到目标文件 + QStringList list; + QDir apppath(qApp->applicationDirPath()); + QString filePath = apppath.path() + apppath.separator() + PATTERNPATH; + QString dirPath = QDir(filePath).absolutePath();//为了将"\"变为"/" + qDebug()<labelState->setText(tr("scanner filename not found:") + fileName);//扫码器文件未找到: + return; + } + + foreach(QString pathFile, list) + { + qDebug() << "Success Find File:"<< pathFile; + } + + if(list.size() > 0){ + slotShowPatternPara(list.at(0),-1);//直接显示图片 取第一张 + } + +} + +void MainWidget::slotDebugInfo() +{ + DebugInfo info;//调试信息 + char mDebugInfoStr[1024+1]; + + info = g_pMachine->getDebugInfo(); + memcpy(mDebugInfoStr, info.debugInfoStr, 1024); + + mDebugInfoStr[1024] = 0; + + QString strDebugInfoStr; + strDebugInfoStr.sprintf("%s", mDebugInfoStr); + if(strDebugInfoStr.length()>0) + { + g_pSettings->writeToCsv(strDebugInfoStr,TYPE_DEBUGINFO);//写入csv + } +} + +void MainWidget::onRefreshPatternTimer() +{ + // 文件执行进度(当前针数) labelNeedleIdx + m_curDatIdx++; + reSetDatIdx(m_curDatIdx); + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); +} + +//1秒定时器 +void MainWidget::onOneSecondTimer() +{ + // 获取系统当前时间 + QDateTime dateTime = QDateTime::currentDateTime(); + ui->labelTime->setText(dateTime.toString("yyyy/MM/dd HH:mm:ss")); + refConnectUi(dateTime.time().second());//刷新连接 + + if(g_emDebugMode == debugMode) + { + if (dateTime.time().second() % 5 == 0) + { + setLabelTitleText(g_emMacType);//根据机型显示主界面标题 + } + else + { + ui->labelTitle->setText(tr("Debugging mode")); //调试模式! + } + } + + if ((m_workStatus & WORK_STA_SIMULATE) == WORK_STA_SIMULATE) //模拟工作 + { + if (dateTime.time().second() % 2 == 0) + { + ui->labelWorkState->setText(tr(""));//模拟缝纫 + } + else + { + ui->labelWorkState->setText(tr("Simulated working"));//模拟工作 + } + } +} + +//5秒定时器 +void MainWidget::onFiveSecondTimer() +{ + if(m_conFlag == 0)//已连接 + { + + } + else + { + g_pMachine->setTcpConnectState(1);//将连接状态置为1 + } + m_conFlag = -1; +} + +void MainWidget::onTenMiniteTimer() +{ + s16 rel = m_pMainWidgetFunction->detectWifiConnect(); + if(rel > 0)//已连接 + { + ui->buttonWifi->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonWifi->objectName()+"Connect")); + } + else + { + ui->buttonWifi->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonWifi->objectName()+"Unconnect")); + } +} + +//1分钟定时器,记录当前系统时间,用于上电时 计算 关机时间 +void MainWidget::onOneMinTimer() +{ + // 获取系统当前时间 + QDateTime dateTime = QDateTime::currentDateTime(); + g_pSettings->writeOneToIniFile(("DateTime/second"),dateTime.toTime_t());//单位为秒 +#if(0) + //30天自动删除是只删除超过30天的记录 + //文件路径 + QDir apppath(qApp->applicationDirPath()); + QString csvfile; + csvfile = apppath.path() + apppath.separator() + CSV_FILEID; + //获取文件的创建时间 + QFileInfo info(csvfile); + qDebug() << info.size();//获取文件大小 + QDateTime dt = info.created();//获取文件创建时间 + int days = dt.daysTo(dateTime);//获取文件相对于当前时间的天数 + if (days >30) + { + QFile::remove(csvfile);//大于30天,删除这个文件 + } +#endif +} + +//刷新版本信息 +void MainWidget::onRefreshVer() +{ + //版本显示 + QString verStr = m_pMainWidgetFunction->getVersionStr();; + QString softwareVer = m_pMainWidgetFunction->getCompileDateTime(); + + ui->labelHMIVersion->setText(verStr+softwareVer);//版本: +} + +//主界面 +void MainWidget::on_buttonMainMenu_clicked() +{ + hideMenuFrame(); + showPatternPreview(); + ui->frameNineBtn->setVisible(true); + ui->frameEmbInfo->setVisible(true); + ui->buttonMainMenu->setChecked(true); +} + +//花样设置 +void MainWidget::on_buttonPatternSet_clicked() +{ +#if(0) + //如果为当前显示页面,再点击时需隐藏,显示花样页面 + if(ui->framePatternSet->isVisible()) + { + showPatternPreview(); + } +#endif + hideMenuFrame(); + ui->frameMenuBack->setVisible(true); + ui->framePatternSet->setVisible(true); + ui->buttonPatternSet->setCheckable(true); + ui->buttonPatternSet->setChecked(true); +} + +//参数设定按钮 +void MainWidget::on_buttonParaSet_clicked() +{ + s16 paraSort = g_pSettings->readFromIniFile("HMI/paraSort").toInt(); + + if(paraSort == 1)//分类显示参数 + { + hideMenuFrame(); + ui->frameMenuBack->setVisible(true); + ui->frameParaSet->setVisible(true); + ui->buttonParaSet->setCheckable(true); + ui->buttonParaSet->setChecked(true); + } + else if(paraSort == 0)//不分类显示参数 + { + showPatternPreview(); + + QString tStyle = m_setControlStyle.getTopStyleSheet(ui->buttonParaSet->objectName()); + + m_pParameterSetDlg->setTypeLogo(tStyle); + m_pParameterSetDlg->setMainTitle(tr("Parameter setting")); + m_pParameterSetDlg->setSubTitle(tr("Parameter setting > Parameter setting")); + //机器参数和工作参数 + m_pParameterSetDlg->setItemList(operate,PARA_TYPE_MACH|PARA_TYPE_WORK); + m_pParameterSetDlg->exec(); + } +} + +//快捷功能按钮 +void MainWidget::on_buttonShortcutFunction_clicked() +{ + m_curPages = 1; // 当前页 + hideMenuFrame(); + ui->frameMenuBack->setVisible(true); + ui->frameShortcutFunction->raise(); + ui->frameShortcutFunction->setVisible(true); + ui->buttonShortcutFunction->setCheckable(true); + ui->buttonShortcutFunction->setChecked(true); + if(m_quickItemList.size() > m_itemPerPage) + { + ui->buttonShortCutPgDn->setVisible(true); + ui->buttonShortCutPgUp->setVisible(true); + ui->labelShortCutPage->setVisible(true); + refreshPageUi(INTERFACE_SHORTCUT); + } +} + +//辅助功能按钮 +void MainWidget::on_buttonAccessFunction_clicked() +{ + m_curPages = 1; // 当前页 + hideMenuFrame(); + + ui->frameMenuBack->setVisible(true); + ui->frameAccessFunction->setVisible(true); + ui->buttonAccessFunction->setCheckable(true); + ui->buttonAccessFunction->setChecked(true); + if(m_assistItemList.size() > m_itemPerPage) + { + ui->buttonShortCutPgDn->setVisible(true); + ui->buttonShortCutPgUp->setVisible(true); + ui->labelShortCutPage->setVisible(true); + refreshPageUi(INTERFACE_SHORTCUT); + } +} + +//速度加 +void MainWidget::on_buttonSpeedAdd_clicked() +{ + if(g_pMachine != NULL) + { + int speed = 0; + if(m_speedLevel == 1) + { + speed = 10; + } + else if(m_speedLevel == 2) + { + speed = 50; + } + else if(m_speedLevel == 3) + { + speed = 100; + } + + g_pMachine->msRpmChange(speed,0); + } +} + +//速度减 +void MainWidget::on_buttonSpeedDec_clicked() +{ + if(g_pMachine != NULL) + { + int speed = 0; + if(m_speedLevel == 1) + { + speed = -10; + } + else if(m_speedLevel == 2) + { + speed = -50; + } + else if(m_speedLevel == 3) + { + speed = -100; + } + + g_pMachine->msRpmChange(speed,0); + } +} + +void MainWidget::on_buttonNineBtnUp_pressed() +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->manualAction(XY_MOVE_BACK_CUTTING, m_speedLevel); + } + else + { + g_pMachine->manualAction(XY_MOVE_FRONT, m_speedLevel); + } + } +} + +void MainWidget::on_buttonNineBtnUp_released() +{ + setFrameNineBtnStyle(); + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->motoMove(XY_MOVE_FRONT, MT_MOVE_DIR_STOP, 0); + } + else if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->motoMove(XY_MOVE_BACK_CUTTING, MT_MOVE_DIR_STOP, 0); + } + else + { + g_pMachine->manualAction(XY_MOVE_STOP); + } + } +} + +void MainWidget::on_buttonNineBtnDown_pressed() +{ + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->manualAction(XY_MOVE_FRONT_CUTTING, m_speedLevel); + } + else + { + g_pMachine->manualAction(XY_MOVE_BACK, m_speedLevel); + } + } +} + +void MainWidget::on_buttonNineBtnDown_released() +{ + setFrameNineBtnStyle(); + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_THICK_WIRING) + { + g_pMachine->motoMove(XY_MOVE_BACK, MT_MOVE_DIR_STOP, 0); + } + else if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->motoMove(XY_MOVE_FRONT_CUTTING, MT_MOVE_DIR_STOP, 0); + } + else + { + g_pMachine->manualAction(XY_MOVE_STOP); + } + } +} + +void MainWidget::on_buttonNineBtnLeft_pressed() +{ + //qDebug()<<"on_buttonNineBtnLeft_pressed"; + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->manualAction(XY_MOVE_LEFT_CUTTING, m_speedLevel); + } + else + { + g_pMachine->manualAction(XY_MOVE_LEFT, m_speedLevel); + } + } +} + +void MainWidget::on_buttonNineBtnLeft_released() +{ + //qDebug()<<"on_buttonNineBtnLeft_released"; + setFrameNineBtnStyle(); + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->motoMove(XY_MOVE_LEFT_CUTTING, MT_MOVE_DIR_STOP, 0); + } + else + { + g_pMachine->manualAction(XY_MOVE_STOP); + } + } +} + +void MainWidget::on_buttonNineBtnRight_pressed() +{ + //qDebug()<<"on_buttonNineBtnRight_pressed"; + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->manualAction(XY_MOVE_RIGHT_CUTTING, m_speedLevel); + } + else + { + g_pMachine->manualAction(XY_MOVE_RIGHT, m_speedLevel); + } + } +} + +void MainWidget::on_buttonNineBtnRight_released() +{ + //qDebug()<<"on_buttonNineBtnRight_released"; + setFrameNineBtnStyle(); + if(g_pMachine != NULL) + { + if(g_emMacType == MACHINE_CUTTINGWALK) + { + g_pMachine->motoMove(XY_MOVE_RIGHT_CUTTING, MT_MOVE_DIR_STOP, 0); + } + else + { + g_pMachine->manualAction(XY_MOVE_STOP); + } + } +} + +void MainWidget::on_buttonNineBtnMiddle_pressed() +{ + m_speedLevel = m_speedLevel + 1; + if(m_speedLevel > 3) + { + m_speedLevel = 1; + } + + bool cVal = ui->buttonPatternSet->isEnabled();//按钮是否失能,是否锁界面 + + if(cVal == true) + { + // ui->frameNineBtn->setStyleSheet(m_setControlStyle.getBorderImageStyleSheet("frameNineBtnMiddle")); + } +} + +void MainWidget::on_buttonNineBtnMiddle_released() +{ + bool cVal = ui->buttonPatternSet->isEnabled();//按钮是否失能,是否锁界面 + + if(cVal == true) + { + // ui->frameNineBtn->setStyleSheet(m_setControlStyle.getBorderImageStyleSheet(ui->frameNineBtn->objectName())); + } + + setFrameNineBtnStyle(); +} + +//前进回退 +//void MainWidget::on_buttonNineBtn1_clicked() +//{ +// funForwardOrBack(); +//} + +void MainWidget::on_buttonNineBtn1_clicked() +{ + runCommonBtnFunction(m_nineBtn.value(1).m_enumFunction); +} + +void MainWidget::on_buttonNineBtn2_clicked() +{ + runCommonBtnFunction(m_nineBtn.value(2).m_enumFunction); +} + +void MainWidget::on_buttonNineBtn3_clicked() +{ + runCommonBtnFunction(m_nineBtn.value(3).m_enumFunction); +} + +void MainWidget::on_buttonNineBtn4_clicked() +{ + runCommonBtnFunction(m_nineBtn.value(4).m_enumFunction); +} + +void MainWidget::on_buttonNeedleBegin_clicked() +{ + m_forwardBackNeedleIdx = 0; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleEnd_clicked() +{ + m_forwardBackNeedleIdx = g_pCurEmbData->getStitchNums(); //总针数 + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleDec1_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx - 1; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleAdd1_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx + 1; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleDec10_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx - 10; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleAdd10_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx + 10; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleDec100_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx - 100; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleAdd100_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx + 100; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleDec1000_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx - 1000; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleAdd1000_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx + 1000; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleDec10000_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx - 10000; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonNeedleAdd10000_clicked() +{ + m_forwardBackNeedleIdx = m_forwardBackNeedleIdx + 10000; + addOrDecNeedleIdx(m_forwardBackNeedleIdx); +} + +void MainWidget::on_buttonForwardBackOk_clicked() +{ + if ((m_mcStatus.workStatus & WORK_STA_BUSY) != 0) // 下位机在执行动作 + { + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_OK); + promptDlg.setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("The machine is in operation and cannot be configured.");//机器处于工作状态,不可设置 + promptDlg.setContentStr(str); + promptDlg.exec(); + + return; + } + + //g_pMachine->setFileExecProgress(0, m_curFileID, m_expara); + g_pMachine->fastJump(m_expara.newIdx);//前进回退 + ui->frameForwardBack->setVisible(false); + setUiBtnEnable(true); + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); +} + +void MainWidget::on_buttonForwardBackCancel_clicked() +{ + g_pCurEmbData->setExecIndex(m_curDatIdx);// 更新针数 + + QPixmap patternPix = g_pCurEmbData->getPreviewImage(); + ui->labelPatternView->setPixmap(patternPix); + + ui->frameForwardBack->setVisible(false); + setUiBtnEnable(true); + ui->buttonMainMenu->setCheckable(true); + ui->buttonMainMenu->setChecked(true); + + +} + +//退出登录 +void MainWidget::on_buttonUser_clicked() +{ + //退回到无密码的普通用户 + if(g_emUser == repair || g_emUser == root) + { + m_pMainWidgetFunction->funExitRoot(); + ui->buttonUser->setStyleSheet(m_setControlStyle.getStyleSheet(ui->buttonUser->objectName())); + } +} + +void MainWidget::mousePressEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + mousePressX = e->x(); + mousePressY = e->y(); + mouseReleaseX = 0; + mouseReleaseY = 0; + } +} + +void MainWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + mouseReleaseX = e->x(); + mouseReleaseY = e->y(); + } + + int width = this->width(); + int height = this->height(); + if ((mousePressX >= 0 && mousePressX <= 100) && + ((mousePressY >= (height - 100)) && mousePressY <= height) && + ((mouseReleaseX >= (width - 100)) && ((mouseReleaseX <= (width)))) && + ((mouseReleaseY >= (height - 100)) && mouseReleaseY <= height) + ) + { + m_usbPath.clear();//清空路径字符串 //优盘路径 + m_usbPath = m_pMainWidgetFunction->detectUsb();//优盘检测 + if(m_usbPath.length() <= 0) + { + //优盘不存在 + return; + } + else + { + QPixmap pixmap=QPixmap::grabWindow(this->winId(),0,0,this->width(),this->height());//截屏存放在pixmap + QString name_pc = m_usbPath + "EMB" + // + QDateTime::currentDateTime().toString("yyyyMMdd") +//获取时期时间 + +"_"+ + QDateTime::currentDateTime().toString("hhmmss") + ".png"; + + pixmap.save(name_pc,"png"); // 路径 + + if (m_usbPath!= "") + { + //截屏效果 + ui->labelScreenshot->show(); + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + ui->labelScreenshot->setStyleSheet(setControlStyle.getStyleSheet("labelScreenshot")); + QTimer::singleShot(2000,ui->labelScreenshot,SLOT(hide())); // 停留一秒 隐藏 + } + } + } + + mousePressX = 0; + mousePressY = 0; + mouseReleaseX = 0; + mouseReleaseY = 0; +} + +void MainWidget::on_buttonStartStop_clicked() +{ + g_pMachine->pauseWork(); +} + +void MainWidget::on_buttonMove_pressed() +{ + +#ifdef Q_OS_LINUX +#else + //qDebug()<<"buttonMove_pressed"; + QPoint msPos; + int msX,msY; + int uiX,uiY; + + uiX = g_mainWidgetPos.x(); + uiY = g_mainWidgetPos.y(); + msPos = QCursor::pos(); + msX = msPos.x(); + msY = msPos.y(); + ui->buttonMove->setChecked(true); + + do + { + msPos = QCursor::pos(); + g_mainWidgetPos.setX((msPos.x() - msX) + uiX); + g_mainWidgetPos.setY((msPos.y() - msY) + uiY); + + this->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + if(ui->buttonMove->isChecked() == false) + { + break; + } + QCoreApplication::processEvents(QEventLoop::AllEvents); + + }while(1); + + + m_pPatternSelectWi->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + m_pParameterSetDlg->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + m_pPatternManageWi->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + m_pSensorInputWi->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + m_pControlActionWi->move(g_mainWidgetPos.x(),g_mainWidgetPos.y()); + + m_pMainWidgetFunction->moveDlgPos(); +#endif +} + +void MainWidget::on_buttonMove_released() +{ +#ifdef Q_OS_LINUX +#else + ui->buttonMove->setChecked(false); + //qDebug()<<"on_buttonMove_released"; +#endif +} + +void MainWidget::on_buttonAssistPgDn_clicked() +{ + m_curPages++; + refreshPageUi(INTERFACE_ACCESS); +} + +void MainWidget::on_buttonAssistPgUp_clicked() +{ + m_curPages--; + refreshPageUi(INTERFACE_ACCESS); +} + +void MainWidget::on_buttonShortCutPgDn_clicked() +{ + m_curPages++; + refreshPageUi(INTERFACE_SHORTCUT); +} + +void MainWidget::on_buttonShortCutPgUp_clicked() +{ + m_curPages--; + refreshPageUi(INTERFACE_SHORTCUT); +} diff --git a/mctype/patternsingleboard/mainUI/mainwidget.h b/mctype/patternsingleboard/mainUI/mainwidget.h new file mode 100644 index 0000000..4cd16cd --- /dev/null +++ b/mctype/patternsingleboard/mainUI/mainwidget.h @@ -0,0 +1,355 @@ +#ifndef MainWidget_H +#define MainWidget_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "main.h" +#include "mctype/mainwidgetfunction.h" +#include "sharedviews/promptdialog.h" +#include "sharedviews/patternselectwidget.h" +#include "sharedviews/parametersetdialog.h" +#include "sharedviews/patternmanagewidget.h" +#include "sharedviews/sensorinputwidget.h" +#include "sharedviews/controlactionwidget.h" +#include "sharedviews/knifegapparadialog.h" +#include "mctype/patternsingleboard/function/highsinglequilting.h" +#include "machine/error.h" +#include "sharedviews/headspacingsheetdialog.h" +#include "mctype/patternsingleboard/function/fiveheadprecisionsewing.h" +#include "mctype/patternsingleboard/function/clothingmac.h" +#include "mctype/patternsingleboard/function/multineedlerotary.h" +#include "mctype/patternsingleboard/function/thickwiringmac.h" +#include "mctype/patternsingleboard/function/flyshuttle.h" +#include "mctype/patternsingleboard/function/glassfibremac.h" +#include "mctype/patternsingleboard/function/doublelayeredmac.h" +#include "mctype/patternsingleboard/function/doublesidedbedsheets.h" +#include "mctype/patternsingleboard/function/dlqscheboard.h" +#include "mctype/patternsingleboard/function/singlemutilneedlemac.h" +#include "mctype/patternsingleboard/function/l2000multimac.h" +#include "mctype/patternsingleboard/function/fullyautomatic.h" +#include "mctype/patternsingleboard/function/pkgfoursidedtestboardmac.h" +#include "mctype/patternsingleboard/function/autodoubledoormac.h" +#include "mctype/patternsingleboard/function/doubleheadcombqui.h" +#include "mctype/patternsingleboard/function/fourheadcombqui.h" +#include "mctype/patternsingleboard/function/cuttingwalk.h" +#include "sharedviews/setcontrolstyle.h" +#include "sharedviews/patterneditwidget.h" +#include "sharedviews/patternneedlelayoutwidget.h" +#include "sharedviews/linegenerwidget.h" +#include "machine/mytcpserver.h" + +namespace Ui { +class MainWidget; +} + +typedef struct +{ + s16 rotation; //旋转角度调整 + s16 rotateStyle; //旋转式样 + s16 rotateAngle; //旋转角度 + s16 reinMode; //加固方式 + s16 reinNeedles; //加固针数 + s16 reinNum; //加固次数 + s32 normalStep; //针步大小 + s32 lolaComp; //罗拉补偿 + s32 lolaCompXNeg; //罗拉补偿X为负 + s32 lolaCompXZero; //罗拉补偿X为0 + s32 angleCorrOffset; //角度修正量 + s32 angleCorrPosX; //角度修正x正 + s32 angleCorrNegX; //角度修正x负 + s32 angleCorrPosY; //角度修正y正 + s32 angleCorrNegY; //角度修正y负 + s32 left; //左边 + s32 front; //前边 + s32 scanX; //缩放x + s32 scanY; //缩放y + s32 startX; //起始点X + s32 startY; //起始点Y + s32 anchorX; //定位点X + s32 anchorY; //定位点Y + s32 bisect; //平分参数 + s32 cornerCompensation; //尖角补偿 + s32 oftNeedleSize; //去除偏移最小针步设置 + s16 uniScale; //等比缩放 +}__attribute__ ((packed)) PatternSetPara; + +class MainWidget : public QWidget +{ + Q_OBJECT + +public: + explicit MainWidget(QWidget *parent = 0); + ~MainWidget(); + +private: + Ui::MainWidget *ui; + PatternSelectWidget *m_pPatternSelectWi;//花样选择窗体 + ParameterSetDialog *m_pParameterSetDlg;//参数设定窗体 + PatternManageWidget *m_pPatternManageWi;//花样管理窗体(花样导入、导出...) + PatternEditWidget *m_pPatternEditWi;//花样编辑窗体 + LineGenerWidget *m_pLineGenerWi;//线迹生成窗体 + PatternNeedleLayoutWidget *m_pPatternNeedleWi;//花样排针预览窗体 + SensorInputWidget *m_pSensorInputWi; + ControlActionWidget *m_pControlActionWi; + MainWidgetFunction *m_pMainWidgetFunction;//快捷功能函数结构体 + Machine * m_pMachine; + QThread * m_pScanComThread; //扫码器 + ComPort * m_pScanComPort; //扫码器串口 + QSharedPointer m_pTcpServer;//平板切割机 文件服务器 + QSharedPointer m_pTcpServerThread; //服务器 线程 + QSharedPointer m_pKnifeGapParaDlg; + + QList m_quickBtnList;//快捷功能中的快捷按钮列表 + QList m_quickLabelList;//快捷功能中的label显示列表 + + QList m_assistBtnList;//辅助功能中的辅助按钮列表 + QList m_assistLabelList;//辅助功能中的label显示列表 + + QList m_patternSetBtnList;//花样设置中的花样设置按钮列表 + QList m_patternSetLabelList;//花样设置中的label显示列表 + + QList m_paraSetBtnList;//参数设置中的参数设置按钮列表 + QList m_paraSetLabelList;//参数设置中的label显示列表 + QHash m_nineBtn; //九宫格四角按钮的机型化配置 + QList m_fileInfo;//右上角花样信息显示 + + QString m_usbPath;//优盘路径 + QString m_rootPath;//操作屏根路径 + QString m_curPath;//当前路径 + + int m_pageNums;//总页数 + int m_curPages;//快捷界面当前页数 + + bool m_nineBtnShowFlag;//九宫格显示标志 +private: + void initialize();//初始化 + +public: + void initAllWindows(s16 ifHMIDecrypt = 1, s16 connectMode = 0);//初始化窗体 + void initMcTypeWindows();//不同机型不同的窗体设置 + void setLabelTitleText(MachineType type); + + void xDataWhetherSame(QByteArray testAry); +private: + void initQuickFunBtn();//初始化快捷功能中的快捷按钮 + QList m_quickItemList;//快捷功能中的快捷条目列表 + + void initAssisitBtn();//初始化辅助功能中的辅助按钮 + QList m_assistItemList;//辅助功能中的辅助按钮列表 + + void initPatternSetBtn();//初始化花样设置功能中的花样设置按钮 + QList m_patternSetItemList;//花样设置功能中的花样设置条目列表 + + void initParaSetBtn();//初始化参数设置功能中的参数设置按钮 + QList m_paraSetItemList;//参数设置功能中的参数设置条目列表 + + void initPatternInfo(int beginX, int beginY, int width, int height); + QList m_errorCodeAndStateItemList;//错误代码和状态列表 + +private: + u32 m_workStatus;//工作状态 + u32 m_oldWorkStatus;//上一工作状态 + int m_curRpm; + int m_curDatIdx;//当前针数索引 + + int m_forwardBackNeedleIdx;//前进回退时的针数索引 + s16 m_ifHMIDecrypt;//界面是否授权,1代表已授权解密过,0代表未授权解密过 + s16 m_connectMode;//通讯连接方式 0:网口,1:串口 + +private: + MCStatus m_mcStatus; + u32 m_errorCode;//记录报错代码 + + int m_initflag;//初始化标志 + int m_timoutflag;//超时标志 + QTimer * m_pTimer;//建立连接的定时器 + QTimer * m_pConTimer;//检测上下位机心跳包的定时器 + QTimer * m_pMinTimer;//记录当前时间的定时器 + QTimer * m_pRefreshVer; //刷新版本信息 + QTimer * m_pWifiConTimer;//检测wifi是否连接的定时器 + SetStyle m_setControlStyle; + + QTimer * m_pRefreshPatternTimer;//更新花样显示的定时器(测试用) + + int m_conFlag;//连接标志 + int m_linkSta;//连接状态 + int m_itemPerPage;//快捷界面每页按钮数 + int m_whetherShowFlag;//飞梭机检测花型是否显示标志 + + EmbData::DISP_MODE m_dispMode; + QPixmap *m_previewImage; + + QString m_curFilePath;//当前选择的花样路径 + int m_imageZoom;//花样图片缩放值 + int m_imageMoveX;//花样图片平移值X + int m_imageMoveY;//花样图片平移值Y + + int m_curFileFlag; + + PatternSetPara m_patternSetPara;//花样参数 + QPixmap m_embBackPix;//绘制预览图的背景图 + FileExecPara m_expara; + +private: + int m_speedLevel;//速度等级 + +private: + void setFrameNineBtnStyle(); + +private: + void clearFileInfo();//清除文件信息 + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + QString getBackImagePath(s16 waterMark);//获取背景图的加载路径 + void showWorkSpeed(QString speed); //用数字管显示速度 + void setViewFont(QFont font); //设置界面字体大小 + void refreshPageUi(s16 type);//刷新界面显示 + + //鼠标事件 +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + int mousePressX; + int mousePressY; + int mouseReleaseX; + int mouseReleaseY; + +private: + void sendInitString(QString str);//发送初始化字符串 + void refConnectUi(int alive);//刷新连接状态(1秒) + + //刷新连接状态 + void refConnectUi(Machine * pMachine,int & linkSta, int alive); + void hideMenuFrame();//隐藏菜单栏(frame) + void showDiffPara(QString ext,s16 setFlag = 0);//根据文件格式不同显示不同花样参数 + void calPointsAndSet();//计算起始点和定位点并设置 + void calPointsAndSetDoubleCombQui();//双头组合机型计算起始点 + s16 appendDiffAbsData(QString ext);//根据文件格式不同添加不同的绝对坐标中间数据 + void resetAllData();//重置所有数据 + void patternSelect();//花样选择 + +private: + void showExecInfo();//显示机器运行状态中的信息 + void showPatternPreview();//显示花样显示页面 + +private: + QString getCommonBtnStyle(int idx);//获取常用按钮样式 + void runCommonBtnFunction(int idx);//执行常用按钮功能 + void runAssistBtnFunction(int funEnum,int idx);//执行辅助按钮功能 + void runPatternSetBtnFunction(int funEnum,int idx);//执行花样设置按钮功能 + void setUiBtnEnable(bool bValue);//设置UI界面按钮的使能 + void showSpeedFrame(); //隐藏九宫格 显示速度 + void showNineFrame(); //隐藏速度 显示九宫格 + void setNotExecing();//不是执行状态,重置 + +private: + void reSetDatIdx(int newidx); + void funForwardOrBack();//前进回退 + void addOrDecNeedleIdx(int &idx); //加减针 + +signals: + void siSendLoadingMessage(QString info, int alignment, QColor color);//接受加载信息 + void siSpeed(int speed);//手动换挡 + +private slots: + void slotWaitTimout();//等待超时 + void slotMachineStatus(int toggle);//机器状态 + void slotShowPercentage(int val); + void slotRefreshWifiIcon(bool bl); + void slotResetAnchorPos(DataFilePos pos);//重新定定位点 + //void slotLotDat(); //测试物联网用 + +private slots: + void onRefreshVer();//刷新版本信息定时器 + + //选择花样后是否弹出花样参数设置窗体并设置花样参数(默认显示花样参数设置窗体) + void slotShowPatternPara(QString filePath,s16 showFlag = 0);//设置花样参数,showFlag非0时显示花样参数设置窗体 + void slotShowPatternEdit(QString filePath);//花样编辑 + void slotShowPara(QString suffix);//设置分割参数 + void slotTcpRecvFile(QString filePath); + void slotIfFileExist();//删除文件后判断当前文件是否被删除 + void slotClearPatternFcg();//删除fcg后重新选择花版 + void slotReplacePattrn(QString path);//花样导入替换文件 + void slotSetPatternData();//设置花样数据 + void slotEditPattern();//编辑花样 + void slotEditPatternFinish(s16 val);//完成花样编辑 + void slotPatternNeedlePreview();//花样排针预览 + void slotTempNeedleLayoutPreview(QByteArray &dat);//线迹生成后的排针预览 + +public slots: + void slotChangeProgressBar(int value); + void on_buttonMainMenu_clicked();//主界面按钮 + +private slots: + void slotQuickBtnClick();//快捷功能中的快捷按钮被点击 + void slotAssistBtnClick();//辅助功能中的辅助功能按钮被点击 + void slotPatternSetBtnClick();//花样设置中的花样设置按钮被点击 + void slotParaTypeBtnClick();//参数设置中的参数功能按钮被点击 + void slotSetButtonRootLogo(int level);//设置超级用户图标 + void slotClearPatternBreakLineNum();//清空花版断线次数 + void slotDebugState();//界面调试模式 + void slotReceScanData(QByteArray data);//接收扫码器数据 + void slotDebugInfo(); + +private slots: + void onRefreshPatternTimer();//1秒定时器(刷新花样测试用) + void onOneSecondTimer();//1秒定时器 + void onFiveSecondTimer();//5秒定时器 + void onTenMiniteTimer();//10分钟定时器 + void onOneMinTimer();//1分钟定时器 + void on_buttonPatternSet_clicked();//花样设置按钮 + void on_buttonParaSet_clicked();//参数设定按钮 + void on_buttonShortcutFunction_clicked();//快捷功能按钮 + void on_buttonAccessFunction_clicked();//辅助功能按钮 + + void on_buttonSpeedAdd_clicked(); + void on_buttonSpeedDec_clicked(); + void on_buttonNineBtnUp_pressed(); + void on_buttonNineBtnUp_released(); + void on_buttonNineBtnDown_pressed(); + void on_buttonNineBtnDown_released(); + void on_buttonNineBtnLeft_pressed(); + void on_buttonNineBtnLeft_released(); + void on_buttonNineBtnRight_pressed(); + void on_buttonNineBtnRight_released(); + void on_buttonNineBtnMiddle_pressed();//九宫格中间键按下 + void on_buttonNineBtnMiddle_released();//九宫格中间键抬起 + void on_buttonNineBtn1_clicked(); + void on_buttonNineBtn2_clicked(); + void on_buttonNineBtn3_clicked(); + void on_buttonNineBtn4_clicked(); + void on_buttonNeedleBegin_clicked(); + void on_buttonNeedleEnd_clicked(); + void on_buttonNeedleDec1_clicked(); + void on_buttonNeedleAdd1_clicked(); + void on_buttonNeedleDec10_clicked(); + void on_buttonNeedleAdd10_clicked(); + void on_buttonNeedleDec100_clicked(); + void on_buttonNeedleAdd100_clicked(); + void on_buttonNeedleDec1000_clicked(); + void on_buttonNeedleAdd1000_clicked(); + void on_buttonNeedleDec10000_clicked(); + void on_buttonNeedleAdd10000_clicked(); + void on_buttonForwardBackOk_clicked(); + void on_buttonForwardBackCancel_clicked(); + void on_buttonUser_clicked(); + void on_buttonStartStop_clicked(); + void on_buttonMove_pressed(); + void on_buttonMove_released(); + void on_buttonAssistPgDn_clicked(); + void on_buttonAssistPgUp_clicked(); + void on_buttonShortCutPgDn_clicked(); + void on_buttonShortCutPgUp_clicked(); + +}; + +#endif // MainWidget_H diff --git a/mctype/patternsingleboard/mainUI/mainwidget.ui b/mctype/patternsingleboard/mainUI/mainwidget.ui new file mode 100644 index 0000000..6e254cb --- /dev/null +++ b/mctype/patternsingleboard/mainUI/mainwidget.ui @@ -0,0 +1,4934 @@ + + + MainWidget + + + + 0 + 0 + 1024 + 600 + + + + + 10 + 10 + + + + + 10 + 10 + + + + + 10 + 10 + + + + + + + background-color: rgb(122, 122, 122); + + + + + 0 + 0 + 1024 + 30 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 2 + 301 + 20 + + + + Qt::LeftToRight + + + color: rgb(255, 255, 255); +background-color: rgba(255, 255, 255, 0); + + + + + + Qt::AutoText + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 830 + 10 + 191 + 16 + + + + color: rgb(255, 255, 255); + + + QUILTING-GOA-HMI-L1910-V210713 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 300 + 0 + 441 + 28 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); + + + + + + true + + + + + + + 0 + 30 + 91 + 532 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 60 + 54 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + FileSet + + + Qt::AlignCenter + + + + + + 20 + 270 + 54 + 54 + + + + Qt::NoFocus + + + + + + + + + 20 + 330 + 54 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Assist + + + Qt::AlignCenter + + + + + + 20 + 150 + 54 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + ParaSet + + + Qt::AlignCenter + + + + + + 20 + 90 + 54 + 54 + + + + Qt::NoFocus + + + + + + + + + 20 + 180 + 54 + 54 + + + + Qt::NoFocus + + + + + + + + + 20 + 240 + 54 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Shortcut + + + Qt::AlignCenter + + + + + + 20 + 0 + 54 + 54 + + + + Qt::NoFocus + + + QPushButton:checked{image: url(:/images/1920x1080/theme1/MainWidget/frameMainFunction_p1_1.png);} + + + + + + + false + + + false + + + + + + 20 + 420 + 54 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Main + + + Qt::AlignCenter + + + + + + 20 + 360 + 54 + 54 + + + + Qt::NoFocus + + + QPushButton:checked{image: url(:/images/1920x1080/theme1/MainWidget/frameMainFunction_p1_1.png);} + + + + + + + false + + + false + + + + + + + 819 + 30 + 188 + 280 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 20 + 51 + 16 + + + + TextLabel + + + + + + 110 + 20 + 72 + 15 + + + + TextLabel + + + + + + 10 + 50 + 61 + 16 + + + + TextLabel + + + + + + 110 + 50 + 61 + 16 + + + + TextLabel + + + + + + 10 + 80 + 72 + 15 + + + + TextLabel + + + + + + 110 + 80 + 72 + 15 + + + + TextLabel + + + + + + 10 + 110 + 72 + 15 + + + + TextLabel + + + + + + 110 + 110 + 72 + 15 + + + + TextLabel + + + + + + 10 + 140 + 72 + 15 + + + + TextLabel + + + + + + 110 + 140 + 72 + 15 + + + + TextLabel + + + + + + 10 + 170 + 72 + 15 + + + + TextLabel + + + + + + 110 + 170 + 72 + 15 + + + + TextLabel + + + + + + 10 + 200 + 72 + 15 + + + + TextLabel + + + + + + 110 + 200 + 72 + 15 + + + + TextLabel + + + + + + 100 + 0 + 72 + 15 + + + + TextLabel + + + + + + 0 + 0 + 72 + 15 + + + + TextLabel + + + + + + 20 + 20 + 72 + 15 + + + + TextLabel + + + + + + 120 + 20 + 72 + 15 + + + + TextLabel + + + + + + 10 + 220 + 61 + 16 + + + + TextLabel + + + + + + 110 + 220 + 61 + 16 + + + + TextLabel + + + + + + 10 + 240 + 72 + 15 + + + + TextLabel + + + + + + 110 + 240 + 72 + 15 + + + + TextLabel + + + + + + + 820 + 318 + 188 + 242 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 6 + 2 + 174 + 61 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 40 + 40 + 72 + 15 + + + + + + + + + + 50 + 50 + 72 + 15 + + + + + + + + + + 50 + 50 + 72 + 15 + + + + + + + + + + 50 + 50 + 72 + 15 + + + + + + + + + + 50 + 50 + 72 + 15 + + + + + + + + + + 0 + 0 + 44 + 44 + + + + Qt::NoFocus + + + + + + + + true + + + + 76 + 23 + 44 + 41 + + + + Qt::NoFocus + + + + + + + + + 112 + 0 + 44 + 44 + + + + Qt::NoFocus + + + + + + + + + + 6 + 68 + 174 + 164 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 0 + 56 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 0 + 112 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 60 + 112 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 60 + 0 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 60 + 56 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 120 + 112 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 120 + 0 + 48 + 48 + + + + Qt::NoFocus + + + + + + + + + 120 + 56 + 48 + 48 + + + + Qt::NoFocus + + + + + + buttonNineBtn1 + buttonNineBtnLeft + buttonNineBtn3 + buttonNineBtnDown + buttonNineBtnUp + buttonNineBtn4 + buttonNineBtn2 + buttonNineBtnRight + buttonNineBtnMiddle + + + + + + 0 + 570 + 1024 + 30 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 6 + 160 + 16 + + + + color: rgb(220, 0, 0); + + + Not connected + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 4 + 28 + 1016 + 2 + + + + QProgressBar +{ + border-radius: 5px; + border:0px; +} + +QProgressBar::chunk +{ + background-color: rgb(255, 255, 255); +} + + + 0 + + + + + + 600 + 10 + 160 + 16 + + + + color: rgb(220, 0, 0); + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 370 + 10 + 160 + 16 + + + + color: rgb(220, 0, 0); + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 0 + 0 + 1027 + 31 + + + + + + + + + + 860 + 10 + 160 + 16 + + + + color: rgb(255, 255, 255); + + + 2021/03/08 8:37:16 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 780 + 0 + 28 + 28 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); + + + + + + + + + 810 + 0 + 28 + 28 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); + + + + + + + + + 750 + 0 + 28 + 28 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); + + + + + + labelState + progressBar + labelScreenshot + labelTime + buttonConnect + buttonUser + labelWorkState + labelEnableWorkState + buttonWifi + + + + + 93 + 30 + 709 + 531 + + + + background-color: rgb(240, 240, 240); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 90 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 110 + 90 + 81 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 120 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 90 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 220 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 520 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 320 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 90 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 320 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 20 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 121 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 220 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 10 + 230 + 81 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 110 + 230 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 320 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 610 + 230 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 620 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 420 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 521 + 160 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 490 + 230 + 121 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 600 + 90 + 111 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 520 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 500 + 90 + 111 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 620 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 220 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 320 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 420 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 90 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 120 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 120 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 620 + 370 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 620 + 300 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 20 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 620 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 520 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 20 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 120 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 120 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 420 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + assist + + + Qt::AlignCenter + + + + + + 320 + 430 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 20 + 80 + 31 + + + + background-color: rgb(255, 255, 255); + + + PgUp + + + + + + 110 + 20 + 80 + 31 + + + + background-color: rgb(255, 255, 255); + + + PgDn + + + + + + 30 + 30 + 71 + 21 + + + + page:0/0 + + + + + + + 93 + 30 + 709 + 532 + + + + background-color: rgb(240, 240, 240); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 120 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 420 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 20 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 620 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 220 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 220 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 100 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 320 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 320 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 420 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 620 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 520 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 230 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 420 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 320 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 20 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 520 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 620 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 320 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 120 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 120 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 420 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 320 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 620 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 520 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 420 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 20 + 360 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 20 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 280 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 500 + 60 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + shortcut + + + Qt::AlignCenter + + + + + + 20 + 20 + 80 + 31 + + + + background-color: rgb(255, 255, 255); + + + PgUp + + + + + + 110 + 20 + 80 + 31 + + + + background-color: rgb(255, 255, 255); + + + PgDn + + + + + + 30 + 30 + 71 + 21 + + + + page:0/0 + + + buttonQuick1 + buttonQuick2 + buttonQuick5 + buttonQuick6 + buttonQuick7 + labelQuick6 + labelQuick2 + labelQuick5 + labelQuick1 + labelQuick7 + labelQuick3 + buttonQuick3 + labelQuick4 + buttonQuick4 + buttonQuick8 + labelQuick8 + labelQuick9 + buttonQuick9 + buttonQuick10 + labelQuick10 + buttonQuick11 + labelQuick11 + buttonQuick12 + labelQuick12 + buttonQuick14 + labelQuick14 + buttonQuick13 + labelQuick13 + buttonQuick26 + buttonQuick28 + labelQuick25 + labelQuick23 + buttonQuick25 + labelQuick26 + labelQuick22 + labelQuick20 + labelQuick21 + labelQuick18 + labelQuick16 + buttonQuick16 + buttonQuick23 + labelQuick17 + labelQuick19 + buttonQuick18 + buttonQuick20 + labelQuick27 + labelQuick28 + buttonQuick27 + buttonQuick19 + buttonQuick17 + buttonQuick24 + buttonQuick22 + labelQuick15 + buttonQuick15 + buttonQuick21 + labelQuick24 + buttonShortCutPgDn + buttonShortCutPgUp + labelShortCutPage + + + + + 93 + 30 + 709 + 532 + + + + background-color: rgb(189, 189, 189); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 30 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 10 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 130 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 110 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 230 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 210 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 330 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 310 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 430 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 410 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 530 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 510 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 630 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 610 + 90 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 210 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 310 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 30 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 130 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 430 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 610 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 330 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 230 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 410 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 530 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 630 + 150 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 10 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 510 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + 110 + 220 + 91 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + PatternSet + + + Qt::AlignCenter + + + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 100 + 30 + 702 + 532 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 820 + 30 + 191 + 534 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 60 + 30 + 51 + 28 + + + + color: rgb(255, 255, 255); +background-color: rgba(255, 255, 255, 0); + + + 4999 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 110 + 170 + 72 + 40 + + + + Qt::NoFocus + + + End + + + + + + 10 + 170 + 72 + 40 + + + + Qt::NoFocus + + + Begin + + + + + + 10 + 220 + 72 + 40 + + + + Qt::NoFocus + + + -1 + + + + + + 110 + 220 + 72 + 40 + + + + Qt::NoFocus + + + +1 + + + + + + 10 + 270 + 72 + 40 + + + + Qt::NoFocus + + + -10 + + + + + + 110 + 270 + 72 + 40 + + + + Qt::NoFocus + + + +10 + + + + + + 10 + 320 + 72 + 40 + + + + Qt::NoFocus + + + -100 + + + + + + 110 + 320 + 72 + 40 + + + + Qt::NoFocus + + + +100 + + + + + + 110 + 370 + 72 + 40 + + + + Qt::NoFocus + + + +1000 + + + + + + 10 + 370 + 72 + 40 + + + + Qt::NoFocus + + + -1000 + + + + + + 10 + 484 + 72 + 40 + + + + Qt::NoFocus + + + + + + + + + 110 + 484 + 72 + 40 + + + + Qt::NoFocus + + + + + + + + + 40 + 0 + 110 + 28 + + + + Qt::LeftToRight + + + color: rgb(255, 255, 255); +background-color: rgba(255, 255, 255, 0); + + + Forward or back + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + -10 + 171 + 521 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 110 + 420 + 72 + 40 + + + + Qt::NoFocus + + + +10000 + + + + + + 10 + 420 + 72 + 40 + + + + Qt::NoFocus + + + -10000 + + + + + + 19 + 150 + 54 + 12 + + + + AY: + + + + + + 19 + 110 + 54 + 12 + + + + DY: + + + + + + 19 + 90 + 54 + 12 + + + + DX: + + + + + + 89 + 110 + 54 + 12 + + + + 0 + + + + + + 89 + 90 + 54 + 12 + + + + 0 + + + + + + 89 + 130 + 54 + 12 + + + + 0 + + + + + + 19 + 40 + 31 + 16 + + + + + + + Idx: + + + + + + 19 + 130 + 54 + 12 + + + + AX: + + + + + + 19 + 70 + 54 + 12 + + + + R: + + + + + + 89 + 150 + 54 + 12 + + + + 0 + + + + + + 90 + 70 + 54 + 12 + + + + color: rgb(255, 255, 255); +background-color: rgba(255, 255, 255, 0); + + + 30 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + frameForwardBackBack + labelNeedleCurAndTotal + buttonNeedleEnd + buttonNeedleBegin + buttonNeedleDec1 + buttonNeedleAdd1 + buttonNeedleDec10 + buttonNeedleAdd10 + buttonNeedleDec100 + buttonNeedleAdd100 + buttonNeedleAdd1000 + buttonNeedleDec1000 + buttonForwardBackOk + buttonForwardBackCancel + labelForwardBackTitle + buttonNeedleAdd10000 + buttonNeedleDec10000 + labelAy + labelDy + labelDx + labelDyValue + labelDxValue + labelAxValue + labelNeedleIdx + labelAx + labelAngle + labelAyValue + labelAngleValue + + + + + 93 + 30 + 709 + 461 + + + + background-color: rgb(205, 238, 255); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 40 + 541 + 411 + + + + background-color: rgba(255, 255, 255, 0); + + + + + + Qt::AlignCenter + + + + + + + 93 + 30 + 709 + 532 + + + + background-color: rgb(240, 240, 240); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 10 + 90 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AutoText + + + Qt::AlignCenter + + + true + + + + + + 109 + 90 + 81 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 120 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 210 + 90 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 220 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 320 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 310 + 90 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 410 + 90 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 420 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 510 + 90 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 610 + 90 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 620 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 620 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 510 + 210 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 410 + 210 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 20 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 520 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 10 + 210 + 91 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 210 + 210 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 320 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 420 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 109 + 210 + 81 + 20 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + true + + + + + + 310 + 210 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 610 + 210 + 81 + 16 + + + + background-color: rgba(255, 255, 255, 0); + + + labelParaType + + + Qt::AlignCenter + + + + + + 120 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + 220 + 140 + 60 + 60 + + + + Qt::NoFocus + + + + + + + frameBack + frameMenuBack + frameUp + frameFunctionBtn + frameDown + frameMainFunction + frameShortcutFunction + frameEmbInfo + frameAccessFunction + framePatternSet + framePatternView + frameParaSet + frameForwardBack + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/settings/lotsettings.h b/settings/lotsettings.h new file mode 100644 index 0000000..98d6880 --- /dev/null +++ b/settings/lotsettings.h @@ -0,0 +1,112 @@ +#ifndef LOTSETTINGS_H +#define LOTSETTINGS_H + +//物联网数据key +//上行数据属性列表 +#define U00001 "progress" //完成进度(%) int +#define U00002 "products" //生产数量 int +#define U00003 "Action" //动作(0:开始;1:停止;9:剪线) int +#define U00004 "Turns" //转速 int +#define U00005 "xInitCoordinate" //定位点x int +#define U00006 "ynitCoordinate" //定位点y int +#define U00007 "xCoordinate" //当前点位x int +#define U00008 "yCoordinate" //当前点位y int +#define U00009 "realTime" //一天机器实际工作时间时间戳 int +#define U00010 "estimatedTime" //标准时间完成一件产品时间时间戳 int +#define U00011 "totalWork" //工作总量 int +#define U00012 "totalTime" //一天生产总时间时间戳 int +#define U00013 "machineTime" //一天机器做工工作时间时间戳 int +#define U00014 "TotalNeedle" //累计针数 int +#define U00015 "totalTime" //累计刺绣时间 int +#define U00016 "machineName" //机器(设备)名称 string +#define U00017 "deviceID" //设备(机器)ID string +#define U00018 "RackNumber" //机器编号(机架号) int +#define U00019 "Oline" //是否在线(0:离线;1:在线) int +#define U00020 "ErrorCode" //错误编码 int +#define U00021 "Message" //提示信息 string +#define U00022 "MachineEdition" //机器版本 string +#define U00023 "AlarmInformation" //报警信息 string +#define U00024 "TotalAuthorizationTime" //授权总时间(min) int +#define U00025 "AuthorizationTimeRemaining"//授权剩余时间(min) int +#define U00026 "StartupTime" //开机时间(min) int +#define U00027 "RunningTime" //运行时间(min) int +#define U00028 "CurrentProduction" //当前产量 int +#define U00029 "OutputSetting" //产量设定 int +#define U00030 "InterfaceVersion" //界面版本 string +#define U00031 "StagesPasswordState" //分期密码状态(0:未设置;1:已设置) int +#define U00032 "RemoteUpgradeState" //是否远程升级(0,1) int +#define U00033 "WorkingState" //设备状态编码 int +#define U00034 "spindleZeroSta" //主轴零位状态 int +#define U00035 "SpindleAngle" //主轴角度 int +#define U00036 "Frame_X" //绣框X坐标 int +#define U00037 "Frame_Y" //绣框y坐标 int +#define U00038 "StartButton1" //启动按钮1(0,1) int +#define U00039 "PauseButton1" //暂停按钮1(0,1) int +#define U00040 "JogButton1" //点动按钮1(0,1) int +#define U00041 "MFrameX_Z" //主框架X零位 int +#define U00042 "MFrameY_Z" //主框架Y零位 int +#define U00043 "MFrameX_N" //主框架X负限位 int +#define U00044 "MFrameY_N" //主框架Y负限位 int +#define U00045 "MFrameX_P" //主框架X正限位 int +#define U00046 "MFrameY_P" //主框架Y正限位 int +#define U00047 "ScissorsReturn" //剪刀回位(0,1) int +#define U000102 "electric_total" //电机总数 int +#define U000103 "sensor_total" //传感器总数 int +#define U000118 "realityTime" //手动输入实际交付时间 string +#define U000119 "manualProgress" //手动输入安装/调试进度 int +#define U000120 "hookMode" //勾线模式 +#define U000121 "taperedMode" //锁头模式 +#define U000122 "sewHeadNumbers" //缝纫机头个数 +#define U000123 "embHeadNumbers" //绣花机头个数 +#define U000124 "embneedleNumbers" //绣花机针个数 +#define U000125 "punchHeadNumbers" //冲孔机头个数 +#define U000126 "punchneedleNumbers" //冲孔机针个数 +#define U000149 "WorkProgress" //机器工作进度 + +#define S0504 "1" //已启动 +#define S0505 "2" //运行中 +#define S0506 "1" //机器空闲 + +//下行数据属性列表 +#define D00001 "StagesPassword " //分期密码 string +#define D00002 "Start" //开机指令(0,1) bool +#define D00003 "Stop" //停止指令(0,1) bool +#define D00004 "SetTurns" //设置转速 int +#define D00005 "RemoteUpgrade" //远程升级(0,1) bool + +//传感器信号索引,对应的excel表 +#define S00000 "S00000" //启动按钮 +#define S00010 "S00010" //暂停按钮 +#define S00020 "S00020" //点动按钮 +#define S00070 "S00070" //气压检测 +#define S00200 "S00200" //主框架X零位 +#define S00201 "S00201" //主框架Y零位 +#define S00220 "S00220" //主框架X负限位 +#define S00221 "S00221" //主框架Y负限位 +#define S00230 "S00230" //主框架X正限位 +#define S00231 "S00231" //主框架Y正限位 +#define S01000 "S01000" //剪刀回位 + +//有毛巾功能的传感器信号 +#define S01020 "S01020" // 毛巾M轴零位 +#define S01021 "S01021" // 毛巾打环轴零位 + +//绣花机电机 +#define M0001 "M0001" //X向移动电机 +#define M0002 "M0002" //Y向移动电机 +#define M0003 "M0003" //平绣主轴 +#define M0004 "M0004" //平绣换色电机 + +//有毛巾功能的电机 +#define M0005 "M0005" //毛巾主轴 +#define M0006 "M0006" //毛巾M轴 +#define M0007 "M0007" //毛巾打环轴 + +//有缠绕功能的电机 +#define M0008 "M0008" //缠绕主轴 +#define M0009 "M0009" //缠绕M轴 +#define M0010 "M0010" //缠绕压脚电机 +#define M0011 "M0011" //缠绕锯齿电机 + + +#endif // LOTSETTINGS_H diff --git a/settings/settings.cpp b/settings/settings.cpp new file mode 100644 index 0000000..302034b --- /dev/null +++ b/settings/settings.cpp @@ -0,0 +1,549 @@ +#include "settings.h" +#include +#include +using namespace std; +Settings::Settings() +{ + m_configFile.clear(); + m_HMIconfigFile.clear(); + m_pSettings = NULL; +} + +Settings::~Settings() +{ + if (m_pSettings) + { + // QSettings 的析构函数会自动调用 sync(),确保所有内存中的更改写入文件 + delete m_pSettings; + m_pSettings = NULL; // 防止悬空指针(虽然对象已销毁) + } +} + +void Settings::loadSetting(QString configfile) +{ + if (configfile.isEmpty() == false) + { + m_configFile = configfile; + //使用 new 动态分配 QSettings 对象 + m_pSettings = new QSettings(m_configFile, QSettings::IniFormat); + } + + fillDefaultColor(); +} + +void Settings::loadHMISetting(QString configfile) +{ + if (configfile.isEmpty() == false) + { + m_HMIconfigFile = configfile; + } +} + +//写入值到ini文件 +void Settings::writeToIniFile(const QMap& keyValueMap) +{ + if(m_configFile.length() <= 0 || keyValueMap.isEmpty()){return;} + + // 锁定(如果需要线程安全) + QMutexLocker locker(&m_mutex); + + // 在同一个 QSettings 对象生命周期内设置所有值 + for (QMap::const_iterator it = keyValueMap.constBegin(); it != keyValueMap.constEnd(); ++it) + { + m_pSettings->setValue(it.key(), it.value()); + } + +#ifdef Q_OS_LINUX + system("sync"); +#endif +} + +//写入值到ini文件 +void Settings::writeToInHMIiFile(QString key, QVariant value) +{ + if(m_HMIconfigFile.length() <= 0){return;} + QSettings iniSetting(m_HMIconfigFile, QSettings::IniFormat); + iniSetting.setValue(key,value); + //qDebug()<<"key"<setValue(key,value); +} + +QVariant Settings::readFromIniFile(QString key) +{ + if(m_configFile.length() <= 0){return -1;} + QMutexLocker locker(&m_mutex); + return m_pSettings->value(key); +} + +//从HMIini文件读取值 +QVariant Settings::readFromInHMIiFile(QString key) +{ + if(m_HMIconfigFile.length() <= 0){return -1;} + QSettings iniSetting(m_HMIconfigFile, QSettings::IniFormat); + return iniSetting.value(key); +} + +bool Settings::ifKeyExists(QString key) +{ + if(key.length() <= 0){return false;} + if(m_configFile.length() <= 0){return false;} + QMutexLocker locker(&m_mutex); + return m_pSettings->contains(key); +} + +bool Settings::ifHMIKeyExists(QString key) +{ + if(m_HMIconfigFile.length() <= 0){return false;} + QSettings iniSetting(m_HMIconfigFile, QSettings::IniFormat); + return iniSetting.contains(key); +} +//hsb转换成rgb +void Settings::HSItoRGB(float h,float s,float i,float *r,float *g,float *b) +{ + int hi = ((int)h / 60) % 6; + float f = h / 60 - hi; + float p = i * (1 - s); + float q = i * (1 - f * s); + float t = i * (1 - (1 - f) * s); + switch(hi) + { + case 0: + *r = i; *g = t; *b = p; + break; + case 1: + *r = q; *g = i; *b = p; + break; + case 2: + *r = p; *g = i; *b = t; + break; + case 3: + *r = p; *g = q; *b = i; + break; + case 4: + *r = t; *g = p; *b = i; + break; + case 5: + *r = i; *g = p; *b = q; + break; + default: + break; + } + *r = (int)((*r) * 255); + *g = (int)((*g) * 255); + *b = (int)((*b) * 255); +} +void Settings::fillDefaultColor() +{ + m_colorRGB.clear(); +#if (1) + vector > sbv; + sbv.push_back(make_pair(1, 0.7));//尾部插入数字 + sbv.push_back(make_pair(0.9, 0.7)); + sbv.push_back(make_pair(0.7, 0.7)); + sbv.push_back(make_pair(0.5, 0.7)); + sbv.push_back(make_pair(0.3, 0.7)); + sbv.push_back(make_pair(0.1, 0.7)); + sbv.push_back(make_pair(0.1, 1)); + sbv.push_back(make_pair(0.3, 1)); + sbv.push_back(make_pair(0.5, 1)); + sbv.push_back(make_pair(0.7, 1)); + sbv.push_back(make_pair(0.9, 1)); + sbv.push_back(make_pair(1, 1)); + float hv[] = {15, 31, 46, 61, 76, 91, 106, 121, 136, 151, 166, 181, 196, 211, 226, 241, 256, 271, 286, 301, 316, 331, 346}; + QRgb rgb[EMB_MC_SW_ND]; + int num = 0; + for(int i = 0; i < 12; i ++) + { + float s = sbv[i].first; + float b = sbv[i].second; + for(int j = 0; j < 24; j ++) + { + if(j==24) + { + float R = 225; + float G = 225; + float B = 225; + HSItoRGB(hv[j], s, b, &R, &G, &B); + rgb[num ++] = qRgb(R, G, B); + } + else + { + + float R, G, B; + HSItoRGB(hv[j], s, b, &R, &G, &B); + rgb[num ++] = qRgb(R, G, B); + } + } + } + + for (int i = 0; i < EMB_MC_SW_ND; i++) + { + m_colorRGB.append((char*)(&(rgb[i])), sizeof(QRgb)); + } + +#else + u8 r, g, b; + u8 * prgb; + const int cnum = 243; // 3的5次方 + int rcount = 0; + int gcount = 0; + int bcount = 0; + int temp; + r = 102; + g = 255; + b = 154; + for (int i = 0; i < cnum; i++) + { + if ((rcount <= gcount) && (rcount <= bcount)) + { + prgb = &r; + rcount++; + rcount %= 5; + } + else if ((gcount <= rcount) && (gcount <= bcount)) + { + prgb = &g; + gcount++; + gcount %= 5; + } + else if ((bcount <= rcount) && (bcount <= gcount)) + { + prgb = &b; + bcount++; + bcount %= 5; + } + else + { + break; + } + temp = *prgb; + temp += (int)(51.2*3 + 0.5); + if (temp > 255) + { + temp -= 256; + } + *prgb = temp; + + m_colorRGB.append(r); + m_colorRGB.append(g); + m_colorRGB.append(b); + m_colorRGB.append(255); + } +#endif +} + +void Settings::writeToCsv(QString strText,int type) +{ + QString filePath; + filePath.clear(); + + QDir apppath(qApp->applicationDirPath()); + if(type == TYPE_ERROR) + { + filePath = apppath.path() + apppath.separator() + CSV_ERROR; + } + else if(type == TYPE_BREAK) + { + filePath = apppath.path() + apppath.separator() + CSV_BREAK; + } + else if(type == TYPE_DEBUGINFO) + { + filePath = apppath.path() + apppath.separator() + CSV_DEBUGINFO; + } + if(filePath.length() <= 0){return;} + + QFile file(filePath); + if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) + { + QString strCurTime = QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss");//时间 + QString strMessage; + QTextStream in(&file);//写 + if(type == TYPE_DEBUGINFO) + { + strMessage = QString("%1//%2").arg(strCurTime).arg(strText);//时间,内容 + } + else + { + strMessage = QString("%1,%2").arg(strCurTime).arg(strText);//时间,内容 + } + in << strMessage << '\n'; + +#ifdef Q_OS_LINUX + system("sync"); +#endif + file.close(); + } +} + +void Settings::clearToCsv(int type) +{ + QString filePath; + filePath.clear(); + + QStringList tempbar; + tempbar.clear(); + + QDir apppath(qApp->applicationDirPath()); + if(type == TYPE_ERROR) + { + filePath = apppath.path() + apppath.separator() + CSV_ERROR; + } + else if(type == TYPE_BREAK) + { + filePath = apppath.path() + apppath.separator() + CSV_BREAK; + } + else if(type == TYPE_DEBUGINFO) + { + filePath = apppath.path() + apppath.separator() + CSV_DEBUGINFO; + } + + if(filePath.length() <= 0){return;} + + // 定义可能的格式列表,把最可能的格式放在前面 + QStringList possibleFormats; + possibleFormats.clear(); + possibleFormats.append("yyyy/M/d hh:mm:ss"); + possibleFormats.append("yyyy/MM/dd hh:mm:ss"); + possibleFormats.append("yyyy/M/d hh:mm"); + possibleFormats.append("yyyy/MM/dd hh:mm"); + + QStringList strAlarmInfoList; + strAlarmInfoList.clear(); + QString oneItem; + oneItem.clear(); + int timeFlag = 0; + QFile file(filePath); + if (file.open(QIODevice::ReadOnly)) + { + QTextStream out(&file);//读 + QStringList tempOption = out.readAll().split("\n"); + // 获取系统当前时间 + QDateTime dateTime = QDateTime::currentDateTime(); + int curSecond = dateTime.toTime_t();//当前时间转换为秒 + int differSecond = curSecond - 30 * 24 * 60 * 60; //减去30天 + for (int i = 0; i < tempOption.count(); i++)//tempOption文件里的所有行 + { + oneItem = tempOption[i]; + + if(oneItem.length() <= 0) + { + continue; + } + + if(type == TYPE_DEBUGINFO) + { + tempbar= oneItem.split("//");//获取每一行 以“//”号分开 + } + else + { + tempbar = oneItem.split(",");//获取每一行 以“,”号分开 + } + + if (tempbar.size() < 2) + continue; + + if (tempbar.at(0).indexOf(QString("DateTime")) != -1) + continue; + + QString listTime = tempbar.at(0).trimmed(); // 必须 trim + + QDateTime cdateTime; + bool parsed = false; + for (int i = 0; i < possibleFormats.size(); i++) + { + cdateTime = QDateTime::fromString(listTime, possibleFormats[i]); + if (cdateTime.isValid()) + { + parsed = true; + break; // 一旦成功,就跳出循环 + } + } + + if (!parsed) + { + continue; // 跳过这一行,不要使用无效时间 + } + + int newTime = cdateTime.toTime_t();//转换为秒 + //没超过30天的,存在列表里 + if(newTime >= differSecond) + { + if (tempbar.size() >= 2) + { + strAlarmInfoList << oneItem; + } + else + { + return; + } + } + else + { + timeFlag = 1; + } + } + + file.close(); + } + + int reWriteFlag = 0;//重写标志 + if(timeFlag == 1) + { + reWriteFlag = 1; + } + else if(strAlarmInfoList.size()>800) + { + while(strAlarmInfoList.size()>800) + { + strAlarmInfoList.removeFirst(); + } + reWriteFlag = 1; + } + + if(reWriteFlag == 1) + { + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + QTextStream in(&file);//写 + + for(int i = 0; i < strAlarmInfoList.size(); i++) + { + in << strAlarmInfoList[i] << '\n'; + } + + file.close(); +#ifdef Q_OS_LINUX + system("sync"); +#endif + } + } + + return; +} + +QStringList Settings::readToCsv(int type) +{ + QStringList strAlarmInfoList; + strAlarmInfoList.clear(); + + QStringList strInfoList; + strInfoList.clear(); + + QStringList newTempOption; + newTempOption.clear(); + + QString allinfo; + allinfo.clear(); + + QStringList tempbar; + tempbar.clear(); + + QString filePath;//文件 + filePath.clear(); + + QDir apppath(qApp->applicationDirPath()); + if(type == TYPE_ERROR) + { + filePath = apppath.path() + apppath.separator() + CSV_ERROR; + } + else if(type == TYPE_BREAK) + { + filePath = apppath.path() + apppath.separator() + CSV_BREAK; + } + else if(type == TYPE_DEBUGINFO) + { + filePath = apppath.path() + apppath.separator() + CSV_DEBUGINFO; + } + + if(filePath.length() <= 0){return strAlarmInfoList;} + + QString time;//一共有2项(时间,内容) + QString info; + QString oneTemp; + oneTemp.clear(); + + QFile file(filePath); + if (file.open(QIODevice::ReadOnly)) + { + QTextStream out(&file);//读 + + QStringList tempOption = out.readAll().split("\n"); + int tempSize = tempOption.count(); + + for (int i = 0; i < tempSize; i++)//tempOption文件里的所有行 + { + tempbar.clear(); + oneTemp = tempOption.at(i); + if(type == TYPE_DEBUGINFO) + { + tempbar= oneTemp.split("//");//获取每一行 以“//”号分开 + } + else + { + tempbar = oneTemp.split(",");//获取每一行 以“,”号分开 + } + //DateTime不显示 + if (oneTemp.indexOf(QString("DateTime")) != -1) + continue; + + time.clear(); + if(tempbar.size() >= 2) + { + time = tempbar.at(0); + } + info.clear(); + + if(time.length() > 0) + { + if(tempbar.size() >= 2) + { + info = tempbar.at(1); + } + //time.remove(" ");//清除空格 + if(type == TYPE_DEBUGINFO) + { + allinfo=time+"//"+info; + } + else + { + allinfo=time+","+info; + } + newTempOption.append(allinfo); + strInfoList << newTempOption[newTempOption.count()-1]; + } + //qDebug()<<"i"<= 0 ) && ((strInfoList.count() - 1 - i) < strInfoList.count()))) + if( ((strInfoList.count() - 1 - i) >= 0 && ((strInfoList.count() - 1 - i) < strInfoList.count()))) + { + strAlarmInfoList << strInfoList[strInfoList.count() -1- i]; //xcy 0313 日志倒序显示 + } + } + } + file.close(); + qDebug()<<"strAlarmInfoList.size()"< +#include +#include +#include +#include //csv使用到 +#include +#include +#include +#include +#include +#define EMB_MC_SW_ND 448 // 绣花机最大换色数 原为288,lxs20220803客户有一个花样需要448色序,进行更改 + +#define CSV_ERROR "csverro.csv" +#define CSV_BREAK "breakag.csv" +#define CSV_DEBUGINFO "debuginfo.csv" +#define CSV_PROGRESS "progress.csv" +#define BREAKINFOFILE "breakInfo" + +#define TYPE_ERROR 0 +#define TYPE_BREAK 1 +#define TYPE_DEBUGINFO 2 + +class Settings +{ +public: + Settings(); + ~Settings(); + +public: + void loadSetting(QString configfile); + inline QByteArray & getColorRgbArray() {return m_colorRGB;} + void writeToIniFile(const QMap& keyValueMap);//写入值到ini文件 + void writeOneToIniFile(QString key, QVariant value);//写入值到ini文件 + QVariant readFromIniFile(QString key);//从ini文件读取值 + bool ifKeyExists(QString key);//判断是否存在键值 + + void loadHMISetting(QString configfile); + void writeToInHMIiFile(QString key, QVariant value);//写入值到HMIini文件 + QVariant readFromInHMIiFile(QString key);//从HMIini文件读取值 + bool ifHMIKeyExists(QString key);//判断是否存在键值 + + void writeToCsv(QString strText,int type = 0); + QStringList readToCsv(int type = 0); + void clearToCsv(int type = 0); + void fileClear(QString filePath); +private: + QByteArray m_colorRGB; + QString m_configFile; + QString m_HMIconfigFile; + QSettings *m_pSettings; + QMutex m_mutex; // 用于线程安全 + +private: + void fillDefaultColor(); + void HSItoRGB(float h,float s,float i,float *r,float *g,float *b);//hsb转换成rgb + +}; + +#endif // SETTINGS_H diff --git a/sharedviews/brokenlinedialog.cpp b/sharedviews/brokenlinedialog.cpp new file mode 100644 index 0000000..ae51055 --- /dev/null +++ b/sharedviews/brokenlinedialog.cpp @@ -0,0 +1,159 @@ +#include "brokenlinedialog.h" +#include "ui_brokenlinedialog.h" + +BrokenLineDialog::BrokenLineDialog(QWidget *parent) : + QWidget(parent), + ui(new Ui::BrokenLineDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal );//用以设置窗口模态类型 ,ApplicationModal阻塞整个应用程序的所有窗口 + initWidget(); + initControl(); +} + +BrokenLineDialog::~BrokenLineDialog() +{ + delete ui; +} + +void BrokenLineDialog::initWidget() +{ + ui->labelContent->setText(""); + ui->labelContentInfo->setText(""); +} + +void BrokenLineDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + switch (g_emResolut) + { + case resolution1910: + initResolution1910(); + break; + case resolution1006: + initResolution1006(); + break; + default: + this->resize(1920,1080); + break; + } + initControlStyle();//初始化窗体控件样式 +} +void BrokenLineDialog::initResolution1910() +{ + //上状态栏 + this->resize(1322,820); + //this->move((1920-this->width())/2,(1080-this->height())/2); + this->move(192,62); + ui->frameBack->setGeometry(0,0,1322,820); + ui->labelTitle->setGeometry(20,15,900,56); + ui->labelContent->setGeometry(12,58,1300,700); + ui->labelContentInfo->setGeometry(12,58,1300,700); + ui->buttonOk->setGeometry(1110,710,174,60); +} + +void BrokenLineDialog::initResolution1006() +{ + //上状态栏 + + this->resize(710,460); + //this->move((1024-this->width())/2,(600-this->height())/2); + this->move(100,30); + + ui->frameBack->setGeometry(0,0,710,460); + ui->labelTitle->setGeometry(10,-5,500,56); + + ui->labelContent->setGeometry(15,56,680,340); + ui->labelContentInfo->setGeometry(15,56,680,340); + ui->buttonOk->setGeometry(590,400,96,40); +} +//初始化窗体控件样式 +void BrokenLineDialog::initControlStyle() +{ + SetControlStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //设置控件图标 + //背景图 + + ui->frameBack->setStyleSheet(TRANSPARENTSTYLE); + this->setStyleSheet(LABELWHITESTYLE); + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->labelTitle->setStyleSheet(LABELWHITESTYLE); + ui->labelTitle->setFont(fontNormal_1); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); +//数字 + ui->labelContent->setStyleSheet(LABELREDSTYLEBROKEN); // 断线机头 红色 字体加大 -rq + +// QFont font; +// font.setPixelSize(400); + //font.setFamily(FONTTYPE);//字体 +// ui->labelContent->setFont(font); + ui->labelContent->setFont(fontNormal_10); + ui->labelContent->setAlignment(Qt::AlignCenter);//文字水平垂直居中 + //ui->labelContent->setStyleSheet("font-size:400px"); + + // ui->labelContent->setAlignment(Qt::AlignHCenter); +// ui->labelContent->setAlignment(Qt::AlignVCenter); + + + ui->labelContentInfo->setStyleSheet(LABELREDSTYLEBROKEN); // 断线机头文字 红色 字体加大 -rq + QFont font;//设置断线文字大小 + if(g_emResolut == resolution1006 ) + { + font.setPixelSize(51); + } + else if (g_emResolut == resolution1910) + { + font.setPixelSize(101); + } + font.setFamily(FONTTYPE);//字体 + ui->labelContentInfo->setFont(font); + ui->labelContentInfo->setAlignment(Qt::AlignCenter);//文字水平垂直居中 + + ui->buttonOk->setWhiteBlueBottomStyle(); + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonOk->objectName()+"_1"),8); +} + +//设置标题 +void BrokenLineDialog::setTitleStr(QString str) +{ + ui->labelTitle->setText(str); +} + +//设置内容 +void BrokenLineDialog::setContentInfoStr(QString str) +{ + ui->labelContent->setText("");//数字的控件清空 + ui->labelContent->hide();//数字的控件隐藏 + ui->labelContentInfo->setText(str);//设置文字的控件内容 + ui->labelContentInfo->show();//文字的控件显示 +} + +void BrokenLineDialog::setContentStr(QString str) +{ + ui->labelContentInfo->setText(""); + ui->labelContentInfo->hide(); + ui->labelContent->setText(str); + ui->labelContent->show(); +} + +void BrokenLineDialog::show(int flag) +{ + if(flag == 1) + { + ui->labelContent->setStyleSheet(LABELREDSTYLEBROKENBLUE); // 断线机头 蓝色 字体加大 -rq + } + else if (flag == 3) + { + ui->labelContent->setStyleSheet(LABELBLACKSTYLE); // 断线机头 黑色 字体加大 -rq + } + QWidget::show(); +} + +void BrokenLineDialog::on_buttonOk_clicked() +{ + this->hide(); +} diff --git a/sharedviews/brokenlinedialog.h b/sharedviews/brokenlinedialog.h new file mode 100644 index 0000000..ba41031 --- /dev/null +++ b/sharedviews/brokenlinedialog.h @@ -0,0 +1,50 @@ +#ifndef BROKENLINEDIALOG_H +#define BROKENLINEDIALOG_H + +#include +#include +#include +#include "promptdialog.h" +#include "mybutton.h" +#include "setcontrolstyle.h" +//#include "Include/datafiledst.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +//#include "mctype/mainwidgetfunction.h" +#include +namespace Ui { +class BrokenLineDialog; +} + +class BrokenLineDialog : public QWidget +{ + Q_OBJECT + +public: + explicit BrokenLineDialog(QWidget *parent = 0); + ~BrokenLineDialog(); + +private slots: + + void on_buttonOk_clicked(); +private: + Ui::BrokenLineDialog *ui; + +private: + void initWidget(); + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution1910();//初始化窗体控件为1920x1080分辨率 + void initResolution1006();//初始化窗体控件为1024x600分辨率 + void initControlStyle();//初始化窗体控件样式 + +public: + //int m_flag= 0; + void setTitleStr(QString str);//设置标题 + void setContentInfoStr(QString str);//设置内容 + void setContentStr(QString str);//设置内容 + void show(int flag=0); +}; + +#endif // BROKENLINEDIALOG_H + + diff --git a/sharedviews/brokenlinedialog.ui b/sharedviews/brokenlinedialog.ui new file mode 100644 index 0000000..8afd2ad --- /dev/null +++ b/sharedviews/brokenlinedialog.ui @@ -0,0 +1,158 @@ + + + BrokenLineDialog + + + + 0 + 0 + 541 + 300 + + + + Form + + + + + 70 + 69 + 401 + 131 + + + + + Agency FB + 72 + 75 + true + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + 1 + + + Qt::AlignCenter + + + true + + + + + + 10 + 10 + 472 + 48 + + + + + + + Broken Line Prompt + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 450 + 250 + 71 + 31 + + + + + Agency FB + 9 + 50 + false + + + + Qt::NoFocus + + + + + + + + + + + + 0 + 0 + 541 + 301 + + + + background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 70 + 70 + 401 + 131 + + + + + Agency FB + 72 + 75 + true + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + 1 + + + Qt::AlignCenter + + + true + + + frameBack + labelContent + labelTitle + labelContentInfo + buttonOk + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/controlactionwidget.cpp b/sharedviews/controlactionwidget.cpp new file mode 100644 index 0000000..20b38a0 --- /dev/null +++ b/sharedviews/controlactionwidget.cpp @@ -0,0 +1,922 @@ +#include "controlactionwidget.h" +#include "ui_controlactionwidget.h" + +ControlActionWidget::ControlActionWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::ControlActionWidget), + m_itemPerPage(8), + m_btnPerRow(5) +{ + ui->setupUi(this); + + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + + m_speed = 0; + + this->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + + m_curPage = 0; + m_itemList.clear(); + m_allItemList.clear(); + initControl(); +} + +ControlActionWidget::~ControlActionWidget() +{ + delete ui; +} + +//初始化窗体控件,包括位置、尺寸、样式 +void ControlActionWidget::initControl() +{ + m_itemFrameList.clear(); + m_itemFrameList.append(ui->frame1); + m_itemFrameList.append(ui->frame2); + m_itemFrameList.append(ui->frame3); + m_itemFrameList.append(ui->frame4); + m_itemFrameList.append(ui->frame5); + ui->frame6->setVisible(false); + ui->frame7->setVisible(false); + ui->frame8->setVisible(false); + ui->frame9->setVisible(false); + ui->frame10->setVisible(false); + ui->frame11->setVisible(false); + ui->frame12->setVisible(false); + ui->frame6->setVisible(true);//显示 + ui->frame7->setVisible(true); + ui->frame8->setVisible(true); + m_itemFrameList.append(ui->frame6); + m_itemFrameList.append(ui->frame7); + m_itemFrameList.append(ui->frame8); + + m_itemLabelList.clear(); + m_itemLabelList.append(ui->label1); + m_itemLabelList.append(ui->label2); + m_itemLabelList.append(ui->label3); + m_itemLabelList.append(ui->label4); + m_itemLabelList.append(ui->label5); + m_itemLabelList.append(ui->label6); + m_itemLabelList.append(ui->label7); + m_itemLabelList.append(ui->label8); + m_itemLabelList.append(ui->label9); + m_itemLabelList.append(ui->label10); + m_itemLabelList.append(ui->label11); + m_itemLabelList.append(ui->label12); + + m_itemBtnList.clear(); + m_itemBtnList.append(ui->button1_1); + m_itemBtnList.append(ui->button1_2); + m_itemBtnList.append(ui->button1_3); + m_itemBtnList.append(ui->button1_4); + m_itemBtnList.append(ui->button1_5); + m_itemBtnList.append(ui->button2_1); + m_itemBtnList.append(ui->button2_2); + m_itemBtnList.append(ui->button2_3); + m_itemBtnList.append(ui->button2_4); + m_itemBtnList.append(ui->button2_5); + m_itemBtnList.append(ui->button3_1); + m_itemBtnList.append(ui->button3_2); + m_itemBtnList.append(ui->button3_3); + m_itemBtnList.append(ui->button3_4); + m_itemBtnList.append(ui->button3_5); + m_itemBtnList.append(ui->button4_1); + m_itemBtnList.append(ui->button4_2); + m_itemBtnList.append(ui->button4_3); + m_itemBtnList.append(ui->button4_4); + m_itemBtnList.append(ui->button4_5); + m_itemBtnList.append(ui->button5_1); + m_itemBtnList.append(ui->button5_2); + m_itemBtnList.append(ui->button5_3); + m_itemBtnList.append(ui->button5_4); + m_itemBtnList.append(ui->button5_5); + m_itemBtnList.append(ui->button6_1); + m_itemBtnList.append(ui->button6_2); + m_itemBtnList.append(ui->button6_3); + m_itemBtnList.append(ui->button6_4); + m_itemBtnList.append(ui->button6_5); + m_itemBtnList.append(ui->button7_1); + m_itemBtnList.append(ui->button7_2); + m_itemBtnList.append(ui->button7_3); + m_itemBtnList.append(ui->button7_4); + m_itemBtnList.append(ui->button7_5); + m_itemBtnList.append(ui->button8_1); + m_itemBtnList.append(ui->button8_2); + m_itemBtnList.append(ui->button8_3); + m_itemBtnList.append(ui->button8_4); + m_itemBtnList.append(ui->button8_5); + m_itemBtnList.append(ui->button9_1); + m_itemBtnList.append(ui->button9_2); + m_itemBtnList.append(ui->button9_3); + m_itemBtnList.append(ui->button9_4); + m_itemBtnList.append(ui->button9_5); + m_itemBtnList.append(ui->button10_1); + m_itemBtnList.append(ui->button10_2); + m_itemBtnList.append(ui->button10_3); + m_itemBtnList.append(ui->button10_4); + m_itemBtnList.append(ui->button10_5); + m_itemBtnList.append(ui->button11_1); + m_itemBtnList.append(ui->button11_2); + m_itemBtnList.append(ui->button11_3); + m_itemBtnList.append(ui->button11_4); + m_itemBtnList.append(ui->button11_5); + m_itemBtnList.append(ui->button12_1); + m_itemBtnList.append(ui->button12_2); + m_itemBtnList.append(ui->button12_3); + m_itemBtnList.append(ui->button12_4); + m_itemBtnList.append(ui->button12_5); + for(int var = 0; var < m_itemBtnList.size(); var++) + { + connect(m_itemBtnList.at(var), + SIGNAL(clicked(bool)), + this, + SLOT(slotItemBtnClicked()) + ); + + connect(m_itemBtnList.at(var), + SIGNAL(pressed()), + this, + SLOT(slotItemBtnPressed()) + ); + + connect(m_itemBtnList.at(var), + SIGNAL(released()), + this, + SLOT(slotItemBtnReleased()) + ); + } + + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void ControlActionWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemFrameList[i]->setGeometry(GLB_PARA_LEFT*factoryX,(GLB_PARA_TOP + i * GLB_PARA_HEIGHT +3)*factoryY,GLB_PARA_WIGHT*factoryX,(GLB_PARA_HEIGHT-3)*factoryY); + m_itemLabelList[i]->setGeometry(GLB_TAB_WIGHT*factoryX,GLB_ICON_TEXT*factoryY,(GLB_PARA_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_LBUT_HEIGHT*factoryY); + } + + int bgX = GLB_PARA_WIGHT - GLB_BAS_WIGHT * (m_btnPerRow-1) - GLB_SBUT_WIGHT * m_btnPerRow - GLB_TAB_WIGHT; + for(int i = 0; i < m_btnPerRow; i++) + { + for(int j = 0; j < m_itemPerPage; j++) + { + m_itemBtnList[m_btnPerRow*j+i]->setGeometry((bgX+i*(GLB_SBUT_WIGHT + GLB_BAS_WIGHT))*factoryX,GLB_BAS_WIGHT*factoryY,GLB_SBUT_WIGHT*factoryX,GLB_SBUT_HEIGHT*factoryY);//蓝色按钮大小位置 + } + } + + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonBack->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + +} + +//初始化窗体控件分辨率 +void ControlActionWidget::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,533*scaleX,24*scaleY); + + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemFrameList[i]->setGeometry(148*scaleX,99*scaleY + i * 48*scaleY,718*scaleX,48*scaleY); + m_itemLabelList[i]->setGeometry(10*scaleX,0*scaleY,340*scaleX,48*scaleY); + } + + for(int i = 0; i < m_btnPerRow; i++) + { + for(int j = 0; j < m_itemPerPage; j++) + { + m_itemBtnList[m_btnPerRow*j+i]->setGeometry(283*scaleX+i*86*scaleX,4*scaleY,80*scaleX,40*scaleY); + } + } + + ui->framePageBtn->setGeometry(584*scaleX,530*scaleY,427*scaleX,40*scaleY); + ui->labelPage->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonBack->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); +} + +//初始化窗体控件样式 +void ControlActionWidget::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(commonTextColour()); + + //条目frame + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemFrameList[i]->setStyleSheet(transparentStyle()); + } + + //条目label + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemLabelList[i]->setFont(fontSize_M()); + m_itemLabelList[i]->setStyleSheet(commonTextColour()); + } + + //条目按钮 + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setStyleSheet(textButtonStyle()); + m_itemBtnList[i]->setFont(fontSize_M()); + } + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonBack->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonBack->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonBack->objectName()+"_1")); + }else + { + ui->buttonBack->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonBack->objectName())); + } +} + +void ControlActionWidget::refreshUi(int idx) +{ + // m_itemList 所有的控制动作 + if(idx != 0) + { + m_itemList.clear(); + + for( int i= 0; i < m_allItemList.size();i++) + { + m_itemList.append(m_allItemList[i]); + } + } + + int itemNum,pageNums; + if (m_itemList.size() == 0) + { + itemNum = 0; + } + else + { + itemNum = m_itemList.size(); + } + + pageNums = (itemNum+m_itemPerPage-1) / m_itemPerPage; // 计算页数 + + if (m_curPage > pageNums) // 当前页 + { + m_curPage = pageNums; + } + if (m_curPage <= 1) + { + m_curPage = 1; + } + + int itemidx = (m_curPage-1) * m_itemPerPage; + + for (int i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + m_itemFrameList.at(i)->show(); + OutCtrlItem item = m_itemList.at(itemidx); + m_itemLabelList[i]->setText(item.m_name); + + m_itemBtnList[i*m_btnPerRow]->setText(item.m_btn1Str); + m_itemBtnList[i*m_btnPerRow+1]->setText(item.m_btn2Str); + m_itemBtnList[i*m_btnPerRow+2]->setText(item.m_btn3Str); + m_itemBtnList[i*m_btnPerRow+3]->setText(item.m_btn4Str); + m_itemBtnList[i*m_btnPerRow+4]->setText(item.m_btn5Str); + + m_itemBtnList[i*m_btnPerRow]->setVisible(item.m_btn1Visible); + m_itemBtnList[i*m_btnPerRow+1]->setVisible(item.m_btn2Visible); + m_itemBtnList[i*m_btnPerRow+2]->setVisible(item.m_btn3Visible); + m_itemBtnList[i*m_btnPerRow+3]->setVisible(item.m_btn4Visible); + m_itemBtnList[i*m_btnPerRow+4]->setVisible(item.m_btn5Visible); + + itemidx++; + } + else + { + m_itemFrameList.at(i)->hide(); + } + } + + // 翻页按钮 + if (m_curPage <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPage >= pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + if(pageNums == 0) + { + m_curPage = 0; + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPage).arg(pageNums);//页数: + ui->labelPage->setText(str); +} + +//按钮动作 +void ControlActionWidget::btnAction(int rowidx, int btnidx, int event) +{ + int nidx = (rowidx - 1) + (m_curPage - 1) * m_itemPerPage; + int size = m_itemList.size(); + if(size <= 0) + { + return; + } + + if(nidx >= size) + { + return; + } + + OutCtrlItem item = m_itemList[nidx]; + int def = item.m_def; + int fun = -1; + + switch(btnidx) + { + case 1: + switch(event) + { + case BTNCLICK: + fun = item.m_btn1ClickFun; + break; + case BTNPRE: + fun = item.m_btn1PreFun; + break; + case BTNREL: + fun = item.m_btn1RelFun; + break; + } + break; + case 2: + switch(event) + { + case BTNCLICK: + fun = item.m_btn2ClickFun; + break; + case BTNPRE: + fun = item.m_btn2PreFun; + break; + case BTNREL: + fun = item.m_btn2RelFun; + break; + } + break; + case 3: + switch(event) + { + case BTNCLICK: + fun = item.m_btn3ClickFun; + break; + case BTNPRE: + fun = item.m_btn3PreFun; + break; + case BTNREL: + fun = item.m_btn3RelFun; + break; + } + break; + case 4: + switch(event) + { + case BTNCLICK: + fun = item.m_btn4ClickFun; + break; + case BTNPRE: + fun = item.m_btn4PreFun; + break; + case BTNREL: + fun = item.m_btn4RelFun; + break; + } + break; + case 5: + switch(event) + { + case BTNCLICK: + fun = item.m_btn5ClickFun; + break; + case BTNPRE: + fun = item.m_btn5PreFun; + break; + case BTNREL: + fun = item.m_btn5RelFun; + break; + } + break; + default: + fun = -1; + break; + } + excuteOrder(def,fun); +} + +void ControlActionWidget::slotSpeed(int speed) // 手动换挡 +{ + m_speed = speed; +} + +//执行按钮动作 +void ControlActionWidget::excuteOrder(int def, int fun) +{ + if(def < 0 || fun < 0) + return; + PromptDialog promptDlg(this); + QString str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + switch(fun) + { + case OUTCONTROL_ENABLE: + g_pMachine->motoServoCtrl(def, UP_OPEN_ON); + break; + case OUTCONTROL_DISABLE: + g_pMachine->motoServoCtrl(def, DOWN_CLOSE_OFF); + break; + case OUTCONTROL_MS_ENABLE://主轴 + break; + case OUTCONTROL_MS_DISABLE: + break; + case OUTCONTROL_JOGP://电机点动正转 + { + if(m_speed == 1) // 手动换挡 + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 0); + } + } + break; + + case OUTCONTROL_RIGHTMOVE://右移 + { + if(m_speed == 1) // 手动换挡 + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 0); + } + } + break; + + case OUTCONTROL_FORWARD://前进 + if(m_speed == 1) // 手动换挡 + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_POSI, 0); + } + break; + + case OUTCONTROL_JOGN://电机点动反转 + if(m_speed == 1) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 0); + } + break; + + case OUTCONTROL_LEFTMOVE://左移 + if(m_speed == 1) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 0); + } + break; + + case OUTCONTROL_REVERSE://后退 + { + if(m_speed == 1) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 1); + } + else if(m_speed == 2) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 2); + } + else if(m_speed == 3) + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 3); + } + else + { + g_pMachine->motoMove(def, MT_MOVE_DIR_NEGA, 0); + } + } + break; + + case OUTCONTROL_STOP://电机点动停止 + { + g_pMachine->motoMove(def, MT_MOVE_DIR_STOP, 0); + + //QTime dieTime = QTime::currentTime().addSecs(sec);//延时sec秒 + QTime dieTime = QTime::currentTime().addMSecs(500);//延时msec毫秒 + while( QTime::currentTime() < dieTime ) + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + + //延时500毫秒再发一次,因为有时按钮抬起电机不会停 + g_pMachine->motoMove(def, MT_MOVE_DIR_STOP, 0); + } + break; + case OUTCONTROL_ZERO://电机归零 + g_pMachine->motoToZero(def); + break; + case OUTCONTROL_LEFT://电机位置前 + g_pMachine->outputCtrl(def, UP_OPEN_ON, 0); + break; + case OUTCONTROL_MIDDLE://电机位置中 + g_pMachine->outputCtrl(def, DOWN_CLOSE_OFF, 0); + break; + case OUTCONTROL_RIGHT://电机位置后 + g_pMachine->outputCtrl(def, OT_ACTION, 0); + break; + case OUTCONTROL_UP://气缸上升,输出控制方式的电机正转 + g_pMachine->outputCtrl(def, UP_OPEN_ON, 0); + break; + case OUTCONTROL_DOWN://气缸下降,输出控制方式的电机反转 + g_pMachine->outputCtrl(def, DOWN_CLOSE_OFF, 0); + break; + case MANUALACTION_RUN://手动动作执行 + g_pMachine->manualAction(def); + break; + case OUTCONTROL_OPEN://电磁阀开 + g_pMachine->outputCtrl(def, UP_OPEN_ON, 0); + break; + case OUTCONTROL_CLOSE://电磁阀合 + g_pMachine->outputCtrl(def, DOWN_CLOSE_OFF, 0); + break; + case OUTCONTROL_COCOSTOP://电磁阀停止 + g_pMachine->outputCtrl(def, OT_STOP, 0); + break; + case OUTCONTROL_STARTOIL://开始(如手动加油) + g_pMachine->manualOil(1); + break; + case OUTCONTROL_STOPOIL://停止(如手动加油) + g_pMachine->manualOil(0); + break; + case ALLTO_ZERO: // 全部归零 + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("All to zero"));//全部归零 + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + g_pMachine->allToZero(); + break; + + case OUTCONTROL_PULL://拉料 + { + if(m_speed == 1) // 手动换挡 + { + g_pMachine->pullMove(def, MT_MOVE_DIR_POSI, 1); + } + else if(m_speed == 2) + { + g_pMachine->pullMove(def, MT_MOVE_DIR_POSI, 2); + } + else if(m_speed == 3) + { + g_pMachine->pullMove(def, MT_MOVE_DIR_POSI, 3); + } + else + { + g_pMachine->pullMove(def, MT_MOVE_DIR_POSI, 0); + } + } + break; + + case OUTCONTROL_PULLBACK://退料 + { + if(m_speed == 1) + { + g_pMachine->pullMove(def, MT_MOVE_DIR_NEGA, 1); + } + else if(m_speed == 2) + { + g_pMachine->pullMove(def, MT_MOVE_DIR_NEGA, 2); + } + else if(m_speed == 3) + { + g_pMachine->pullMove(def, MT_MOVE_DIR_NEGA, 3); + } + else + { + g_pMachine->pullMove(def, MT_MOVE_DIR_NEGA, 0); + } + } + break; + + case OUTCONTROL_PULLSTOP://电机点动停止 + g_pMachine->pullMove(def, MT_MOVE_DIR_STOP, 0); + break; + + default: + break; + } +} + +//设置类型图标 +void ControlActionWidget::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +//设置主title +void ControlActionWidget::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +//设置副title +void ControlActionWidget::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +/** + * @brief 设置控制动作后面的反馈数据 + * @param def + * @param value + */ +void ControlActionWidget::setdefName(int showPriority, int value) +{ + for(int i = 0; i < m_itemList.size(); i++) + { + if(showPriority == m_itemList[i].m_showPriority){ + int pageOfDef = i/m_itemPerPage; + int indexOfDef = i%m_itemPerPage; + + if(pageOfDef + 1 == m_curPage){ + QString text = m_itemLabelList[indexOfDef]->text(); + double doubleVal = value*0.01; + QString resStr = text.left(text.indexOf(":")) + QString(":%1").arg(QString::number(doubleVal)); + m_itemLabelList[indexOfDef]->setText(resStr); + } + + } + } +} + +void ControlActionWidget::addItemList(QList itemList) +{ + m_itemList.append(itemList); + m_allItemList.append(itemList); +} + +//控制按钮被点击 +void ControlActionWidget::slotItemBtnClicked() +{ + MyButton *button = (MyButton*) this->sender() ; + + if(button == NULL) + { + return; + } + + //获取所触发按钮的行和按钮索引 + int rowIdx,btnIdx; + rowIdx = btnIdx = 1; + for(int i = 0; i < m_itemBtnList.size(); i++) + { + if(button == m_itemBtnList[i]) + { + rowIdx = i / m_btnPerRow + 1; + btnIdx = i % m_btnPerRow + 1; + btnAction(rowIdx,btnIdx,BTNCLICK); + break; + } + } +} + +//控制按钮按下 +void ControlActionWidget::slotItemBtnPressed() +{ + MyButton *button = (MyButton*) this->sender() ; + + if(button == NULL) + { + return; + } + + //获取所触发按钮的行和按钮索引 + int rowIdx,btnIdx; + rowIdx = btnIdx = 1; + for(int i = 0; i < m_itemBtnList.size(); i++) + { + if(button == m_itemBtnList[i]) + { + rowIdx = i / m_btnPerRow + 1; + btnIdx = i % m_btnPerRow + 1; + btnAction(rowIdx,btnIdx,BTNPRE); + break; + } + } +} + +//控制按钮抬起 +void ControlActionWidget::slotItemBtnReleased() +{ + MyButton *button = (MyButton*) this->sender() ; + + if(button == NULL) + { + return; + } + + //获取所触发按钮的行和按钮索引 + int rowIdx,btnIdx; + rowIdx = btnIdx = 1; + for(int i = 0; i < m_itemBtnList.size(); i++) + { + if(button == m_itemBtnList[i]) + { + rowIdx = i / m_btnPerRow + 1; + btnIdx = i % m_btnPerRow + 1; + btnAction(rowIdx,btnIdx,BTNREL); + break; + } + } +} + +void ControlActionWidget::on_buttonPgUp_clicked() +{ + m_curPage--; + refreshUi(); +} + +void ControlActionWidget::on_buttonPgDn_clicked() +{ + m_curPage++; + refreshUi(); +} + +void ControlActionWidget::on_buttonBack_clicked() +{ + this->hide(); +} + +void ControlActionWidget::mousePressEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mousePressX = e->x(); + m_mousePressY = e->y(); + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + } +} + +void ControlActionWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mouseReleaseX = e->x(); + m_mouseReleaseY = e->y(); + } + + int width = this->width(); + int height = this->height(); + if ((m_mousePressX >= 0 && m_mousePressX <= 100) && + ((m_mousePressY >= (height - 100)) && m_mousePressY <= height) && + ((m_mouseReleaseX >= (width - 100)) && m_mouseReleaseX <= width) && + ((m_mouseReleaseY >= (height - 100)) && m_mouseReleaseY <= height)) + { + MainWidgetFunction mainFunction; + QString usbPath;//优盘路径 + usbPath = mainFunction.detectUsb();//优盘检测 + if(usbPath.length() <= 0) + { + //优盘不存在 + return; + } + else + { + QPixmap pixmap=QPixmap::grabWindow(this->winId(),0,0,this->width(),this->height());//截屏存放在pixmap + QString name_pc = usbPath + "EMB" + // + QDateTime::currentDateTime().toString("yyyyMMdd") +//获取时期时间 + +"_"+ + QDateTime::currentDateTime().toString("hhmmss") + ".png"; + + pixmap.save(name_pc,"png"); // 路径 + } + } + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; +} diff --git a/sharedviews/controlactionwidget.h b/sharedviews/controlactionwidget.h new file mode 100644 index 0000000..f734ef1 --- /dev/null +++ b/sharedviews/controlactionwidget.h @@ -0,0 +1,88 @@ +#ifndef CONTROLACTIONWIDGET_H +#define CONTROLACTIONWIDGET_H + +#include +#include "items/outctrlitem.h" +#include "mybutton.h" +#include "setcontrolstyle.h" +#include +#include +#include "mctype/mainwidgetfunction.h" + +#include + +#define BORDER_RADIUS "5" + +namespace Ui { +class ControlActionWidget; +} + +class ControlActionWidget : public QWidget +{ + Q_OBJECT + +public: + explicit ControlActionWidget(QWidget *parent = 0); + ~ControlActionWidget(); + +private: + Ui::ControlActionWidget *ui; + + enum BTNEVENT { BTNCLICK = 1, BTNPRE, BTNREL}; + + int m_itemPerPage;//界面每页条目数 + int m_btnPerRow;//每行按钮数 + int m_curPage;//当前页数 + QList m_itemFrameList; + QList m_itemLabelList; + QList m_itemBtnList; + QList m_allItemList; + QList m_itemList; + + QTimer * m_motorTimer; // 电机停止命令多次发送 + int m_speed;//换挡速度 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initResolution_BlueVer(); + void initControlStyle();//初始化窗体控件样式 + + void btnAction(int rowidx, int btnidx, int event);//按钮动作,参数包括行、按钮索引、按钮事件 + void excuteOrder(int def,int fun);//执行按钮动作 + +public: + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + void setdefName(int def,int value); + + void refreshUi(int idx = 0); + +public: + void addItemList(QList itemList); + +private slots: + void slotItemBtnClicked();//控制按钮被点击 + void slotItemBtnPressed();//控制按钮按下 + void slotItemBtnReleased();//控制按钮抬起 + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + void on_buttonBack_clicked(); + +public slots: + void slotSpeed(int speed); + //鼠标事件 +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + int m_mousePressX; + int m_mousePressY; + int m_mouseReleaseX; + int m_mouseReleaseY; + +}; + +#endif // CONTROLACTIONWIDGET_H diff --git a/sharedviews/controlactionwidget.ui b/sharedviews/controlactionwidget.ui new file mode 100644 index 0000000..f661782 --- /dev/null +++ b/sharedviews/controlactionwidget.ui @@ -0,0 +1,1577 @@ + + + ControlActionWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + + + 0 + 0 + 1024 + 600 + + + + background-color: rgb(182, 182, 182); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 30 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 760 + 570 + 241 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + buttonPgUp + buttonPgDn + buttonBack + + + + + 110 + 10 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Control action + + + + + + 140 + 40 + 261 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Control action < Auxiliary function + + + + + + 20 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 1/1 + + + + + + 140 + 80 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 120 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 240 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 200 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 280 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 160 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 320 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 360 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 400 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 440 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 480 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + 140 + 520 + 760 + 32 + + + + background-color: rgb(239, 239, 239); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 4 + 331 + 16 + + + + TextLabel + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 350 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 430 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 510 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 590 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + 670 + 4 + 75 + 23 + + + + Qt::NoFocus + + + PushButton + + + + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/debuginfodialog.cpp b/sharedviews/debuginfodialog.cpp new file mode 100644 index 0000000..f56b921 --- /dev/null +++ b/sharedviews/debuginfodialog.cpp @@ -0,0 +1,230 @@ +#include "debuginfodialog.h" +#include "ui_debuginfodialog.h" + +DebugInfoDialog::DebugInfoDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::DebugInfoDialog), + m_itemPerPage(12) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setAttribute(Qt::WA_TranslucentBackground, true);//设置窗体背景透明 + setWindowModality(Qt::ApplicationModal); + connect(g_pMachine, SIGNAL(siDebugInfo()), this, SLOT(slotDebugInfo())); + + initDialog(); + initControl(); +} + +DebugInfoDialog::~DebugInfoDialog() +{ + delete ui; +} + +void DebugInfoDialog::initDialog() +{ + m_curPages = 1;//当前页数 + m_pageNums = 1;//总页数 + m_infoList.clear(); +} + +void DebugInfoDialog::initControl() +{ + m_DebugInfoLabelList.append(ui->label1); + m_DebugInfoLabelList.append(ui->label2); + m_DebugInfoLabelList.append(ui->label3); + m_DebugInfoLabelList.append(ui->label4); + m_DebugInfoLabelList.append(ui->label5); + m_DebugInfoLabelList.append(ui->label6); + m_DebugInfoLabelList.append(ui->label7); + m_DebugInfoLabelList.append(ui->label8); + m_DebugInfoLabelList.append(ui->label9); + m_DebugInfoLabelList.append(ui->label10); + m_DebugInfoLabelList.append(ui->label11); + m_DebugInfoLabelList.append(ui->label12); + + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 + //refreshUi(); +} + +//初始化窗体控件为任意分辨率 +void DebugInfoDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(650*factoryX,513*factoryY); + this->move(101*factoryX+g_mainWidgetPos.x(),36*factoryY+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,650*factoryX,513*factoryY); + ui->labelMainTitle->setGeometry(10*factoryX,2*factoryY,300*factoryX,28*factoryY); + for(int i = 0; i < m_itemPerPage; i++) + { + m_DebugInfoLabelList[i]->setGeometry(10*factoryX,(34 + i * 35)*factoryY,630*factoryX,32*factoryY); + } + ui->labelPage->setGeometry(10*factoryX,466*factoryY,200*factoryX,40*factoryY); + ui->buttonPgUp->setGeometry(340*factoryX,462*factoryY,90*factoryX,40*factoryY); + ui->buttonPgDn->setGeometry(446*factoryX,462*factoryY,90*factoryX,40*factoryY); + ui->buttonCancel->setGeometry(552*factoryX,462*factoryY,90*factoryX,40*factoryY); +} + +//初始化窗体控件样式 +void DebugInfoDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + //QString style1 = "background-color: rgb(62, 62, 62);outline:none;border:0px;border-radius:" + borderRadius() + "px;"; + QString style1 = "background-color: rgb(246, 242, 239);outline:none;border:0px;border-radius:" + borderRadius() + "px;"; + QString style1_1 = "background-color: rgb(240, 245, 249);outline:none;border:0px;border-radius:" + borderRadius() + "px;"; + + ui->frameBack->setStyleSheet(style1_1); + if(g_emTheme == theme2) + { + ui->frameBack->setStyleSheet(frameBackStyle()); + } + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(classIconTextColour()); + + //todo 布线机部分缺少相应代码需进行补充完善 + for(int i = 0; i < m_DebugInfoLabelList.size(); i++) + { + m_DebugInfoLabelList[i]->setFont(fontSize_M()); + } + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(classIconTextColour()); + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName())); +} + +void DebugInfoDialog::addListInfo() +{ +// for(int i = 0; i < 100; i++) +// { +// m_infoList.append("1234qfdhdjdnfjdisjdfj"); +// } + m_infoList = g_pSettings->readToCsv(TYPE_DEBUGINFO);//读取 QStringList + refreshUi(); +} + +void DebugInfoDialog::refreshUi() +{ + int itemNum; + if (m_infoList.size() <= 0) + { + itemNum = 0; + + for (int i = 0; i < m_itemPerPage; i++) + { + m_DebugInfoLabelList.at(i)->hide(); + } + ui->labelPage->setText(tr("pageNum: 0/0"));//页数: 0/0 + ui->buttonPgUp->setEnabled(false); + ui->buttonPgDn->setEnabled(false); + //ui->buttonOk->setEnabled(false); + + return; + } + else + { + itemNum = m_infoList.size(); + } + + m_pageNums = (itemNum + m_itemPerPage - 1)/m_itemPerPage;// 计算页数 + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages <= 1 && itemNum != 0) + { + m_curPages = 1; + } + + int itemidx = (m_curPages - 1) * m_itemPerPage; + + for (int i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + //设置图标和文件夹名称 + m_DebugInfoLabelList[i]->setText(m_infoList.at(itemidx)); + m_DebugInfoLabelList.at(i)->show(); + + itemidx++; + } + else + { + m_DebugInfoLabelList.at(i)->hide(); + } + } + + // 翻页按钮 + if (m_curPages <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPages >= m_pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + // 页信息 + if(m_pageNums == 0) + { + m_curPages = 0; + } + + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPage->setText(str); +} + +void DebugInfoDialog::slotDebugInfo() +{ + DebugInfo info;//调试信息 + char mDebugInfoStr[1024+1]; + + info = g_pMachine->getDebugInfo(); + memcpy(mDebugInfoStr, info.debugInfoStr, 1024); + mDebugInfoStr[1024] = 0; + + QString strDebugInfoStr; + strDebugInfoStr.sprintf("%s", mDebugInfoStr); + QString strCurTime = QDateTime::currentDateTime().toString("yyyy/MM/dd/ hh:mm:ss");//时间 + QString strMessage; + strMessage = QString("%1//%2").arg(strCurTime).arg(strDebugInfoStr);//时间,内容 + m_infoList.insert(0,strMessage); + + //m_infoList = g_pSettings->readToCsv(TYPE_DEBUGINFO);//读取 QStringList + refreshUi(); +} + +void DebugInfoDialog::on_buttonCancel_clicked() +{ + done(0); +} + +void DebugInfoDialog::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshUi(); +} + +void DebugInfoDialog::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshUi(); +} diff --git a/sharedviews/debuginfodialog.h b/sharedviews/debuginfodialog.h new file mode 100644 index 0000000..dabe0b1 --- /dev/null +++ b/sharedviews/debuginfodialog.h @@ -0,0 +1,47 @@ +#ifndef DEBUGINFODIALOG_H +#define DEBUGINFODIALOG_H + +#include +#include +#include +#include "setcontrolstyle.h" +#include "mybutton.h" + + +namespace Ui { +class DebugInfoDialog; +} + +class DebugInfoDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DebugInfoDialog(QWidget *parent = 0); + ~DebugInfoDialog(); +public: + void initDialog(); + void refreshUi(); + void addListInfo(); +private: + Ui::DebugInfoDialog *ui; +private: + QList m_DebugInfoLabelList; + QStringList m_infoList; + int m_itemPerPage; + int m_curPages;//当前页数 + int m_pageNums;//总页数 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 +public slots: + void slotDebugInfo(); +private slots: + void on_buttonCancel_clicked(); + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); +}; + +#endif // DEBUGINFODIALOG_H diff --git a/sharedviews/debuginfodialog.ui b/sharedviews/debuginfodialog.ui new file mode 100644 index 0000000..a93d79a --- /dev/null +++ b/sharedviews/debuginfodialog.ui @@ -0,0 +1,371 @@ + + + DebugInfoDialog + + + + 0 + 0 + 702 + 603 + + + + Dialog + + + + + + + + 0 + 0 + 701 + 600 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 580 + 560 + 75 + 23 + + + + Qt::NoFocus + + + + + + + + + + + + 500 + 560 + 75 + 23 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 560 + 75 + 23 + + + + Qt::NoFocus + + + + + + + + + + + + 10 + 570 + 101 + 16 + + + + PageNums: 1/1 + + + + + + 10 + 10 + 72 + 15 + + + + DebugInfo: + + + + + + 10 + 40 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 70 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 100 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 130 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 160 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 190 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 220 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 250 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 280 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 310 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 340 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + 10 + 370 + 680 + 21 + + + + background-color: rgb(255, 255, 255);border:1px solid rgb(189,189,189);border-radius:2px; +color: rgb(0, 0, 0); + + + + + + true + + + + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/fileselectdialog.cpp b/sharedviews/fileselectdialog.cpp new file mode 100644 index 0000000..99a9597 --- /dev/null +++ b/sharedviews/fileselectdialog.cpp @@ -0,0 +1,219 @@ +#include "fileselectdialog.h" +#include "ui_fileselectdialog.h" + +FileSelectDialog::FileSelectDialog(QString filePath, QWidget *parent) : + QDialog(parent), + ui(new Ui::FileSelectDialog), + m_filePath(filePath), + m_itemPerPage(8) +{ + ui->setupUi(this); + setWindowFlags(Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + initControl(); + initData(); + refreshUi(); + m_fileName.clear(); +} + +FileSelectDialog::~FileSelectDialog() +{ + delete ui; +} + +void FileSelectDialog::initControl() +{ + + m_itemBtnList.clear(); + m_itemBtnList.append(ui->button1); + m_itemBtnList.append(ui->button2); + m_itemBtnList.append(ui->button3); + m_itemBtnList.append(ui->button4); + m_itemBtnList.append(ui->button5); + m_itemBtnList.append(ui->button6); + m_itemBtnList.append(ui->button7); + m_itemBtnList.append(ui->button8); + + + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void FileSelectDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + + for(int i = 0; i < m_itemPerPage; i++)//白色按下的效果 + { + m_itemBtnList[i]->setGeometry(153*factoryX,(96 + i * 53)*factoryY,718*factoryX,53*factoryY); + QString style1 = "QPushButton{outline: none;border:0px;border-radius:" + borderRadius() + "px;background-color:rgba(255, 255, 255, 0);color: rgb(255, 255, 255);}"; + m_itemBtnList[i]->setStyleSheet(style1); + m_itemBtnList[i]->setTopImage(NULL); + } + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); +} + +void FileSelectDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->parent()->objectName()); + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + + + //条目 + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList[i]->setLabelFont(fontSize_M()); + connect(m_itemBtnList[i], SIGNAL(clicked(bool)), this, SLOT(btnclicked())); + } + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonOk->objectName())); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName())); + } +} + +void FileSelectDialog::refreshUi() +{ + //清空全部按钮数据 + foreach (QPushButton* button, m_itemBtnList) { + button->setText(""); + button->setEnabled(false); + button->setVisible(false); + } + + //计算页码范围 + m_pageNums = m_fileNameList.size() / m_itemPerPage;//向上取整 总页数 + m_pageNums = (m_fileNameList.size() % m_itemPerPage == 0) ? m_pageNums : m_pageNums + 1; + + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages < 1) + { + m_curPages = 1; + } +// qDebug()<<"m_pageNums" < m_fileNameList.size() - 1) + { + break; + } + else{ + QString str = m_fileNameList[index]; + m_itemBtnList[i]->setText(str); + m_itemBtnList[i]->setEnabled(true); + m_itemBtnList[i]->setVisible(true); + } + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPage->setText(str); + ui->labelPage->setStyleSheet(commonTextColour()); + +} + +void FileSelectDialog::initData() +{ + m_fileNameList.clear(); + QDir dir(m_filePath); + m_curPages = 0; + m_pageNums = 0; + // 打开文件所在的路径 + if(!dir.exists()) + { + qDebug() << "dirpath not exist, name=" << m_filePath; + dir.mkdir(m_filePath);//创建花样文件夹 + } + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); // 设置类型过滤器 + dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase); // 设置排序方式 + + QFileInfoList fileList = dir.entryInfoList(); + int count = fileList.count(); + for(int i = 0; i < count ; i++){ + QFileInfo fileInfo = fileList[i]; + if(fileInfo.suffix().toUpper() == "HS"){ + QString str = fileInfo.fileName(); + m_fileNameList.append(str); + qDebug()<sender(); + qDebug()<< pBtn->text(); + + for(int i = 0; i < m_itemPerPage; i++)//白色按下的效果 + { + QString style1 = "QPushButton{outline: none;border:0px;border-radius:" + borderRadius() + "px;background-color:rgba(255, 255, 255, 0);color: rgb(255, 255, 255);}"; + m_itemBtnList[i]->setStyleSheet(style1); + } + QString style1 = "QPushButton{outline: none;border:0px;border-radius:" + borderRadius() + "px;background-color:rgba(255, 255, 255, 50);color: rgb(255, 255, 255);}"; + pBtn->setStyleSheet(style1); + m_fileName = pBtn->text(); +} + +QString FileSelectDialog::getFileName() +{ + return m_fileName; +} + +void FileSelectDialog::on_buttonOk_clicked() +{ + done(1); +} + +void FileSelectDialog::on_buttonCancel_clicked() +{ + done(0); +} + +void FileSelectDialog::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshUi(); +} + +void FileSelectDialog::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshUi(); +} diff --git a/sharedviews/fileselectdialog.h b/sharedviews/fileselectdialog.h new file mode 100644 index 0000000..fe06c6b --- /dev/null +++ b/sharedviews/fileselectdialog.h @@ -0,0 +1,54 @@ +#ifndef FILESELECTDIALOG_H +#define FILESELECTDIALOG_H + +#include +#include "setcontrolstyle.h" +#include "sharedviews/mybutton.h" + +#include + +namespace Ui { +class FileSelectDialog; +} + +class FileSelectDialog : public QDialog +{ + Q_OBJECT + +public: + explicit FileSelectDialog(QString filePath, QWidget *parent = 0); + ~FileSelectDialog(); + +private slots: + void on_buttonOk_clicked(); + + void on_buttonCancel_clicked(); + + void on_buttonPgDn_clicked(); + + void on_buttonPgUp_clicked(); + +private: + Ui::FileSelectDialog *ui; + QString m_filePath; + int m_itemPerPage; + QList m_itemBtnList; + int m_curPages;//花样选择界面当前页数 + int m_pageNums;//总页数 + QList m_fileNameList;//花样选择界面花样文件列表 + QString m_fileName; //目标文件名 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + void refreshUi(); + void initData(); + +public slots: + void btnclicked(); + QString getFileName(); + +}; + +#endif // FILESELECTDIALOG_H diff --git a/sharedviews/fileselectdialog.ui b/sharedviews/fileselectdialog.ui new file mode 100644 index 0000000..748cab3 --- /dev/null +++ b/sharedviews/fileselectdialog.ui @@ -0,0 +1,330 @@ + + + FileSelectDialog + + + + 0 + 0 + 1105 + 609 + + + + Dialog + + + + + 90 + 220 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 60 + 760 + 32 + + + + Qt::NoFocus + + + Qt::LeftToRight + + + + + + + + + + + + 90 + 140 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 180 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 100 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 300 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 340 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 260 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 770 + 570 + 321 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 240 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + buttonPgUp + buttonPgDn + buttonOk + buttonCancel + + + + + 20 + 10 + 1024 + 600 + + + + background-color: rgb(182, 182, 182); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 1/1 + + + + frameBack + button5 + button1 + button3 + button4 + button2 + button7 + button8 + button6 + framePageBtn + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/headspacingsheetdialog.cpp b/sharedviews/headspacingsheetdialog.cpp new file mode 100644 index 0000000..b8083d3 --- /dev/null +++ b/sharedviews/headspacingsheetdialog.cpp @@ -0,0 +1,578 @@ +#include "headspacingsheetdialog.h" +#include "ui_headspacingsheetdialog.h" + +#define ROW_NUM 10 //按钮行数 +#define COLUMN_NUM 5 //按钮列数 + +HeadSpacingSheetDialog::HeadSpacingSheetDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::HeadSpacingSheetDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + initWidget(); + initControl(); + + memset(&m_data, 0, sizeof(DsrHeadEx62)); + m_dataNums = 0; + refreshPageUi(); +} + +HeadSpacingSheetDialog::~HeadSpacingSheetDialog() +{ + delete ui; +} + + +void HeadSpacingSheetDialog::refreshPageUi() +{ + //清空全部按钮数据 + foreach (QPushButton* button, m_sheetBtnList) { + button->setText(""); + button->setEnabled(false); + button->setVisible(false); + } + + //计算页码范围 + m_pageNums = m_dataNums / ROW_NUM;//向上取整 总页数 + m_pageNums = (m_dataNums % ROW_NUM == 0) ? m_pageNums : m_pageNums + 1; + + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages < 1) + { + m_curPages = 1; + } + + //刷新列值 + for(int i = 0; i < ROW_NUM; i++) + { + int rowNum = i + 1 + (m_curPages -1) * ROW_NUM; + //如果超过最大值则不显示 + if(rowNum > m_dataNums){ + m_sheetVLabelList[i]->setVisible(false); + } + else{ + m_sheetVLabelList[i]->setText(QString("%1").arg(rowNum)); + m_sheetVLabelList[i]->setFont(fontSize_M()); + m_sheetVLabelList[i]->setVisible(true); + m_sheetVLabelList[i]->setStyleSheet(titleTextColour()); + m_sheetVLabelList[i]->setAlignment(Qt::AlignRight); + m_sheetVLabelList[i]->setAlignment(Qt::AlignCenter); + } + } + + //显示已存在的数据 + for(int i = 0; i < ROW_NUM; i++){ + int labelIdx = (m_curPages - 1) * ROW_NUM + i; + if(labelIdx > m_dataNums - 1) + { + //超过机头间距总段数 + break; + } + else + { + m_sheetBtnList[i * COLUMN_NUM + 0 ]->setText(charToQString(m_data.headEnableSpacing[labelIdx].iswork)); + m_sheetBtnList[i * COLUMN_NUM + 1 ]->setText(intDiv10(m_data.headEnableSpacing[labelIdx].distance1_2)); + m_sheetBtnList[i * COLUMN_NUM + 2 ]->setText(intDiv10(m_data.headEnableSpacing[labelIdx].distance1_3)); + m_sheetBtnList[i * COLUMN_NUM + 3 ]->setText(intDiv10(m_data.headEnableSpacing[labelIdx].distance1_4)); + m_sheetBtnList[i * COLUMN_NUM + 4 ]->setText(intDiv10(m_data.headEnableSpacing[labelIdx].distance1_5)); + + m_sheetBtnList[i * COLUMN_NUM + 0 ]->setEnabled(true); + m_sheetBtnList[i * COLUMN_NUM + 1 ]->setEnabled(true); + m_sheetBtnList[i * COLUMN_NUM + 2 ]->setEnabled(true); + m_sheetBtnList[i * COLUMN_NUM + 3 ]->setEnabled(true); + m_sheetBtnList[i * COLUMN_NUM + 4 ]->setEnabled(true); + + m_sheetBtnList[i * COLUMN_NUM + 0 ]->setVisible(true); + m_sheetBtnList[i * COLUMN_NUM + 1 ]->setVisible(true); + m_sheetBtnList[i * COLUMN_NUM + 2 ]->setVisible(true); + m_sheetBtnList[i * COLUMN_NUM + 3 ]->setVisible(true); + m_sheetBtnList[i * COLUMN_NUM + 4 ]->setVisible(true); + } + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPageNum->setText(str); +} + +void HeadSpacingSheetDialog::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +void HeadSpacingSheetDialog::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +void HeadSpacingSheetDialog::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +void HeadSpacingSheetDialog::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshPageUi(); +} + +void HeadSpacingSheetDialog::slotSheetBtnClicked() +{ + MyButton *button = (MyButton*) this->sender() ; + int index = m_sheetBtnList.indexOf(button); + int rowIndex = index / COLUMN_NUM; + int column = index % COLUMN_NUM; + + // qDebug()<< QString("点击了第%1个按钮").arg(index); + // qDebug()<< rowIndex ; //行 + // qDebug()<< column; //列 + + int listIndex = rowIndex + (m_curPages - 1) * ROW_NUM; + qDebug()<< "listIndex:" << listIndex; + + if(column == 0) //机头开关设置 按bit位 + { + //获取bit位的数据,存入内存 + McHeadDialog mcHeadDialog(this); + mcHeadDialog.setChar(m_data.headEnableSpacing[listIndex].iswork); + int result = mcHeadDialog.exec(); + if(result == 1) + { + unsigned char headIsWork = mcHeadDialog.getChar(); + m_data.headEnableSpacing[listIndex].iswork = headIsWork; //修改内存的值 + button->setText(charToQString(headIsWork)); + } + } + else + { + //机头间距参数设置 + NumerInputDialog ndlg(this); + ndlg.setTitleStr("Step distance");//跨步距离 + ndlg.setUnitStr("0.1mm"); + ndlg.setValueAndRange((int)button->text().toDouble()*10, 0, 50000, 1); // 界面中的数*10 为内存中的实际值 + int rslt = ndlg.exec(); + + if(rslt == 1){ + s32 val = ndlg.getValue(); // 0.1mm 界面输入500.1 此时的数是5001,但是界面上还是需要显示500.1 + //修改界面的值 + button->setText(intDiv10(val)); + + //修改内存的值 + HeadTable *item = &m_data.headEnableSpacing[listIndex]; + switch (column) + { + case 1: + item->distance1_2 = val; + break; + case 2: + item->distance1_3 = val; + break; + case 3: + item->distance1_4 = val; + break; + case 4: + item->distance1_5 = val; + break; + case 5: + item->distance1_6 = val; + break; + case 6: + item->distance1_7 = val; + break; + case 7: + item->distance1_8 = val; + break; + + default: + break; + } + } + + } + +} + +void HeadSpacingSheetDialog::setHeadData(DsrHeadEx62 data) +{ + m_data = data; + m_curPages = 1; + refreshPageUi(); +} + +DsrHeadEx62 HeadSpacingSheetDialog::getHeadData() +{ + return m_data; +} + +void HeadSpacingSheetDialog::initDsrFileInfo(QString fileName) +{ + QFileInfo fileInfo(fileName); + QString suffer = fileInfo.suffix().toUpper(); + if(suffer != "DSR"){ + return ; + } + //根据文件名加载 + m_fileName = fileName; + DataFileDsr dsr; + dsr.initFile(m_fileName); + dsr.convertDataToEmbAbs(); + m_data = dsr.get62ExHead(); + m_dataNums = dsr.getStepNums(); + refreshPageUi(); +} + +void HeadSpacingSheetDialog::setStepNums(int dataNums) +{ + m_dataNums = dataNums; + refreshPageUi(); +} + +QString HeadSpacingSheetDialog::detectUsb() +{ + QString usbPath = ""; + +#ifdef Q_OS_LINUX + QDir dir(LINUXUSBPATH); + if(!dir.exists()) + { + usbPath = ""; + } + else + { + usbPath = LINUXUSBPATH; + } +#endif + +#ifdef Q_OS_WIN + QFileInfoList list = QDir::drives(); + + for(int i = 0; iframeSheet); + m_sheetBtnList.append(buttonSheet); + connect(buttonSheet, + SIGNAL(clicked()), + this, + SLOT(slotSheetBtnClicked()) + ); + } + } + + for(int i = 0; i < COLUMN_NUM; i++) + { + QLabel *labelH = new QLabel(this); + labelH->setAlignment(Qt::AlignCenter); //设置居中 + m_sheetHLabelList.append(labelH); + } + + for(int i = 0; i < ROW_NUM; i++) + { + QLabel *labelV = new QLabel(this); + m_sheetVLabelList.append(labelV); + } +} + +void HeadSpacingSheetDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void HeadSpacingSheetDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->labelPageNum->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->frameSheet->setGeometry(10 *factoryX,120*factoryY,1000*factoryX,420*factoryY); + + ui->buttonParaImport->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_MICON_SIZE))*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_MICON_SIZE)*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonParaExport->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_MICON_SIZE*2))*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_MICON_SIZE)*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPageNum->setFont(fontSize_M()); + ui->labelPageNum->setStyleSheet(titleTextColour()); + + for(int i = 0; i < ROW_NUM; i++) + { + for(int j = 0; j < COLUMN_NUM; j++) + { + m_sheetBtnList[i*COLUMN_NUM+j]->setGeometry((100+j*160)*factoryX , (30+i*38) *factoryY, 150*factoryX, 32*factoryY); + } + } + + for(int i = 0; i < COLUMN_NUM; i++) + { + m_sheetHLabelList[i]->setGeometry((180 + i*156) *factoryX, 94*factoryY, 70*factoryX, 40*factoryY); + } + + for(int i = 0; i < ROW_NUM; i++) + { + m_sheetVLabelList[i]->setGeometry(30*factoryX, (149+i*38)*factoryY, 72*factoryX, 32*factoryY); + } +} + + +void HeadSpacingSheetDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + ui->labelPageNum->setText(tr("PageNum: 0/0"));//页数: 0/0 + ui->frameBack->setStyleSheet(transparentStyle()); + QString str = setControlStyle.getStyleSheet(this->objectName()); + ui->frameBack->setStyleSheet(str); + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName())); + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonOk->objectName())); + } + + ui->buttonParaExport->setStyleSheet(backIconStyle());; + ui->buttonParaExport->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonParaExport->objectName())); + + ui->buttonParaImport->setStyleSheet(backIconStyle());; + ui->buttonParaImport->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonParaImport->objectName())); + + + for(int i = 0; i < COLUMN_NUM; i++) + { + if(i == 0){ + m_sheetHLabelList[i]->setText(QString("1")); + } + else + { + m_sheetHLabelList[i]->setText(QString("1-%1").arg(i+1)); + } + m_sheetHLabelList[i]->setFont(fontSize_M()); + m_sheetHLabelList[i]->setStyleSheet(titleTextColour()); + m_sheetHLabelList[i]->setAlignment(Qt::AlignCenter); + m_sheetHLabelList[i]->setAlignment(Qt::AlignBottom); + } + + for(int i = 0; i < ROW_NUM; i++) + { + m_sheetVLabelList[i]->setText(QString("%1").arg(i+1)); + m_sheetVLabelList[i]->setFont(fontSize_M()); + m_sheetVLabelList[i]->setStyleSheet(titleTextColour()); + m_sheetVLabelList[i]->setAlignment(Qt::AlignRight); + m_sheetVLabelList[i]->setAlignment(Qt::AlignCenter); + } + + ui->frameSheet->setStyleSheet(transparentStyle()); + for(int i = 0; i < ROW_NUM; i++) + { + for(int j = 0; j < COLUMN_NUM; j++) + { + m_sheetBtnList[i*COLUMN_NUM+j]->setStyleSheet(headButtonStyle()); + m_sheetBtnList[i*COLUMN_NUM+j]->setFont(fontSize_M()); + } + } +} + +void HeadSpacingSheetDialog::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshPageUi(); +} + +void HeadSpacingSheetDialog::on_buttonOk_clicked() +{ + //数据保存到源文件 + QFile file(m_fileName); + if(file.open(QIODevice::ReadWrite)) + { + QByteArray fileData(sizeof(DsrHeadEx62), 0); + memcpy(fileData.data(), (char*)(&m_data), sizeof(DsrHeadEx62)); + file.seek(sizeof(DsrHead)); + qDebug()<<"HeadSpacingSheetDialog::on_buttonOk_clicked: file.pos:"< charBit(data); + std::string stdStr = to_1string(charBit); + reverse(stdStr.begin(),stdStr.end()); + QString bitStr = QString::fromStdString(stdStr); + return bitStr.left(5); +} diff --git a/sharedviews/headspacingsheetdialog.h b/sharedviews/headspacingsheetdialog.h new file mode 100644 index 0000000..7af1e06 --- /dev/null +++ b/sharedviews/headspacingsheetdialog.h @@ -0,0 +1,90 @@ +#ifndef HEADSPACINGSHEETDIALOG_H +#define HEADSPACINGSHEETDIALOG_H + +#include +#include "qmath.h" +#include +#include +#include +#include +#include +#include "mcheaddialog.h" +#include "setcontrolstyle.h" +#include "promptdialog.h" +#include "datafile/datafiledsr.h" +#include "sharedviews/fileselectdialog.h" +#include "sharedviews/promptdialog.h" + + +template +std::string to_1string(const std::bitset& b) +{ + return b.template + to_string, allocator >(); +} + +namespace Ui { +class HeadSpacingSheetDialog; +} + +class HeadSpacingSheetDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HeadSpacingSheetDialog(QWidget *parent = 0); + ~HeadSpacingSheetDialog(); + +private: + Ui::HeadSpacingSheetDialog *ui; + +private: + s16 m_reType;//x、y类型 + int m_btnPerPage;//每页按钮数 + int m_curPages;//花样选择界面当前页数 + int m_pageNums;//总页数 + QList m_sheetBtnList;//表格按钮个数 + QList m_sheetHLabelList;//横向label + QList m_sheetVLabelList;//纵向label + QList m_itemXList;//条目数 + QList m_itemYList;//条目数 + DsrHeadEx62 m_data; //数据 + int m_dataNums; //总跨步数 + QString m_fileName; + +public: + void refreshPageUi();//刷新界面显示 + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + +private slots: + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void on_buttonPgDn_clicked(); + void on_buttonPgUp_clicked(); + + void on_buttonParaExport_clicked(); + void on_buttonParaImport_clicked(); + + QString intDiv10(int num); //返回整数除10之后保留1位小数的QString + QString charToQString(char data); + +public slots: + void slotSheetBtnClicked();//表格中按钮被点击 + void setHeadData(DsrHeadEx62 data); + DsrHeadEx62 getHeadData(); + //解析文件信息 + void initDsrFileInfo(QString fileName); + void setStepNums(int dataNums); + QString detectUsb(); + +private: + void initWidget(); + void initControl(); + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + +}; + +#endif // HEADSPACINGSHEETDIALOG_H diff --git a/sharedviews/headspacingsheetdialog.ui b/sharedviews/headspacingsheetdialog.ui new file mode 100644 index 0000000..b661e4c --- /dev/null +++ b/sharedviews/headspacingsheetdialog.ui @@ -0,0 +1,264 @@ + + + HeadSpacingSheetDialog + + + + 0 + 0 + 1024 + 600 + + + + Dialog + + + + + 30 + 120 + 901 + 381 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 40 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 0/0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 30 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 160 + 20 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title + + + + + + 140 + 50 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title < Title + + + + + + 480 + 560 + 531 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 290 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 450 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 370 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 210 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + + 260 + 550 + 81 + 41 + + + + background-color: rgb(176, 176, 176); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 710 + 30 + 151 + 28 + + + + + + + + + + 530 + 30 + 151 + 28 + + + + + + + frameBack + frameSheet + labelPageNum + buttonTypeLogo + labelMainTitle + labelSubTitle + framePageBtn + buttonParaExport + buttonParaImport + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/knifegapparadialog.cpp b/sharedviews/knifegapparadialog.cpp new file mode 100644 index 0000000..33513ee --- /dev/null +++ b/sharedviews/knifegapparadialog.cpp @@ -0,0 +1,190 @@ +#include "knifegapparadialog.h" +#include "ui_knifegapparadialog.h" + +KnifeGapParaDialog::KnifeGapParaDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::KnifeGapParaDialog),m_column(25),m_row(20) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + m_pModel = new QStandardItemModel(m_row, m_column, this); + memset(&m_knifeGapData, 0x00, sizeof(KnifeGapPara)); + + initWidget(); + initControl(); + +} + +KnifeGapParaDialog::~KnifeGapParaDialog() +{ + delete ui; +} + +void KnifeGapParaDialog::initWidget() +{ + +} + +void KnifeGapParaDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +void KnifeGapParaDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->labelPageNum->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT-GLB_EDGE_WIGHT*2)*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->frameSheet->setGeometry(10 *factoryX,100*factoryY,1000*factoryX,425*factoryY); + ui->tableView->setGeometry(0,0,ui->frameSheet->width(),ui->frameSheet->height()); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPageNum->setFont(fontSize_M()); + ui->labelPageNum->setStyleSheet(titleTextColour()); + +} + +void KnifeGapParaDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + ui->labelPageNum->setText(tr("PageNum: 0/0"));//页数: 0/0 + ui->frameBack->setStyleSheet(transparentStyle()); + QString str = setControlStyle.getStyleSheet(this->objectName()); + ui->frameBack->setStyleSheet(str); + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + ui->buttonOk->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } + + //不显示前三个按钮 + ui->buttonPgUp->setVisible(false); + ui->buttonPgDn->setVisible(false); + ui->buttonOk->setVisible(false); + + // 设置视图的属性 + ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //触发器 点击无事件 + ui->tableView->setAlternatingRowColors(true); //交替颜色 +// ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +// ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + // 设置QTableView的边框、网格线颜色和选择行的颜色 + ui->tableView->setStyleSheet("QTableView {" + "border: 1px solid #444444;" // 设置边框颜色和宽度 + "gridline-color: #444444;" // 设置网格线颜色 + "}" + "QTableView::item:selected {" + "background-color: #888888;" // 设置选择项的背景色 + "color: #ffffff;" // 设置选择项的文字颜色 + "}" + "QHeaderView::section {" + "background-color: #555555;" // 设置表头的背景色 + "color: #ffffff;" // 设置表头的文字颜色 + "padding: 4px;" // 设置表头内边距 + "border: 1px solid #444444;" // 设置表头边框颜色和宽度 + "}" + "QScrollBar:vertical {" + "width: 15px;" // 设置垂直滚动条宽度 + "}"); + + // 填充模型 + for(int row = 0; row < m_row; row++) { + for(int column = 0; column < m_column; column++) { + QModelIndex index = m_pModel->index(row, column); + m_pModel->itemFromIndex(index)->setTextAlignment(Qt::AlignCenter);//居中显示 + m_pModel->setData(index, QVariant(m_knifeGapData.GapArray[row][column])); + } + } + + ui->tableView->setModel(m_pModel); + +} + +void KnifeGapParaDialog::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +void KnifeGapParaDialog::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +void KnifeGapParaDialog::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +void KnifeGapParaDialog::recvData(int type, int id) +{ + //点了主板的按钮后,现在这个g_pMachine就是对应主板的 + if (type != DCMD_SEND_MOTO_GAINPARA) + return; + if (id != 0) + return; + + //得到当前主板的参数 + KnifeGapPara para = g_pMachine->getGainPara(); + memcpy(&m_knifeGapData, ¶, sizeof(KnifeGapPara)); + m_row = m_knifeGapData.cellx; + m_column = m_knifeGapData.celly; + + m_pModel->setRowCount(m_row); + m_pModel->setColumnCount(m_column); + + for(int row = 0; row < m_row; row++) + { + for(int column = 0; column < m_column; column++) + { + QModelIndex index = m_pModel->index(row, column); + m_pModel->setData(index, QVariant(m_knifeGapData.GapArray[row][column])); + } + } +} + +void KnifeGapParaDialog::on_buttonCancel_clicked() +{ + done(0); +} diff --git a/sharedviews/knifegapparadialog.h b/sharedviews/knifegapparadialog.h new file mode 100644 index 0000000..53814ed --- /dev/null +++ b/sharedviews/knifegapparadialog.h @@ -0,0 +1,49 @@ +#ifndef KNIFEGAPPARADIALOG_H +#define KNIFEGAPPARADIALOG_H + +#include +#include +#include "setcontrolstyle.h" +#include "machine/comm/datadef.h" +#include "main.h" + +namespace Ui { +class KnifeGapParaDialog; +} + +class KnifeGapParaDialog : public QDialog +{ + Q_OBJECT + +public: + explicit KnifeGapParaDialog(QWidget *parent = 0); + ~KnifeGapParaDialog(); + +private: + Ui::KnifeGapParaDialog *ui; + +private: + KnifeGapPara m_knifeGapData; + QStandardItemModel *m_pModel; + int m_column; + int m_row; + +private: + void initWidget(); + void initControl(); + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + +public: + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + +public slots: + void recvData(int type, int id); + +private slots: + void on_buttonCancel_clicked(); +}; + +#endif // KNIFEGAPPARADIALOG_H diff --git a/sharedviews/knifegapparadialog.ui b/sharedviews/knifegapparadialog.ui new file mode 100644 index 0000000..93a2c85 --- /dev/null +++ b/sharedviews/knifegapparadialog.ui @@ -0,0 +1,246 @@ + + + KnifeGapParaDialog + + + + 0 + 0 + 1024 + 600 + + + + Dialog + + + + + 40 + 20 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 40 + 90 + 941 + 431 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 901 + 391 + + + + + + + + 490 + 560 + 531 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 290 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 450 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 370 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 210 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + + 50 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 0/0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 170 + 20 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title + + + + + + 270 + 550 + 81 + 41 + + + + background-color: rgb(176, 176, 176); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 150 + 50 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title < Title + + + labelPageNum + frameBack + framePageBtn + buttonTypeLogo + labelSubTitle + labelMainTitle + frameSheet + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/linegenerwidget.cpp b/sharedviews/linegenerwidget.cpp new file mode 100644 index 0000000..b319804 --- /dev/null +++ b/sharedviews/linegenerwidget.cpp @@ -0,0 +1,1011 @@ +#include "linegenerwidget.h" +#include "ui_linegenerwidget.h" + +LineGenerWidget::LineGenerWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::LineGenerWidget) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + // 创建一个QGraphicsView + m_view = new MyGraphicsView(this,GRIDSIZE254); + connect(m_view, SIGNAL(siCurrentIndex(int)), this, SLOT(slotShowCurrentIdx(int))); + + ui->labelSizeInfo->setText(tr("Each grid is 1 inch"));//每个格子为1英寸 + QString str= tr("Current number of needles: ") + QString("%1").arg(0);//当前针数: + ui->labelIndexInfo->setText(str); + initResolution(); + initControlStyle(); + + m_XMoveValue = 0; + m_YMoveValue = 0; +} + +LineGenerWidget::~LineGenerWidget() +{ + if(m_view != NULL) + { + delete m_view; + m_view = NULL; + } + delete ui; +} + +//初始化窗体控件为任意分辨率 +void LineGenerWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0,0,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBtn->setGeometry(790*factoryX,10*factoryY,223*factoryX,581*factoryY); + + // 设置QGraphicsView的位置和大小 + m_view->setGeometry(10*factoryX, 10*factoryY, 771*factoryX, 551*factoryY); // 假设整个窗口用来显示图形 + + ui->pushBtnPre1->setGeometry(121*factoryX, 10*factoryY, 86*factoryX, 40*factoryY); + ui->pushBtnNext1->setGeometry(16*factoryX, 10*factoryY, 86*factoryX, 40*factoryY); + ui->pushBtnPre10->setGeometry(121*factoryX, 60*factoryY, 86*factoryX, 40*factoryY); + ui->pushBtnNext10->setGeometry(16*factoryX, 60*factoryY, 86*factoryX, 40*factoryY); + + ui->pushBtnLine->setGeometry(16*factoryX,254*factoryY,86*factoryX,32*factoryY); + ui->pushBtnArc->setGeometry(121*factoryX,254*factoryY,86*factoryX,32*factoryY); + ui->pushBtnAdsorptionVertex->setGeometry(16*factoryX,296*factoryY,86*factoryX,32*factoryY); + ui->pushBtnRevoke->setGeometry(121*factoryX,296*factoryY,86*factoryX,32*factoryY); + + ui->labelX->setGeometry(5*factoryX, 108*factoryY, 15*factoryX, 40*factoryY); + ui->pushButtonXValue->setGeometry(20*factoryX, 108*factoryY, 50*factoryX, 40*factoryY); + ui->labelXUnit->setGeometry(75*factoryX, 108*factoryY, 25*factoryX, 40*factoryY); + ui->pushButtonXAdd->setGeometry(110*factoryX, 108*factoryY, 50*factoryX, 40*factoryY); + ui->pushButtonXDec->setGeometry(170*factoryX, 108*factoryY, 50*factoryX, 40*factoryY); + + ui->labelY->setGeometry(5*factoryX, 155*factoryY, 15*factoryX, 40*factoryY); + ui->pushButtonYValue->setGeometry(20*factoryX, 155*factoryY, 50*factoryX, 40*factoryY); + ui->labelYUnit->setGeometry(75*factoryX, 155*factoryY, 25*factoryX, 40*factoryY); + ui->pushButtonYAdd->setGeometry(110*factoryX, 155*factoryY, 50*factoryX, 40*factoryY); + ui->pushButtonYDec->setGeometry(170*factoryX, 155*factoryY, 50*factoryX, 40*factoryY); + + ui->labelStepLen->setGeometry(5*factoryX, 205*factoryY, 100*factoryX, 40*factoryY); + ui->pushBtnSetLen->setGeometry(110*factoryX, 205*factoryY, 50*factoryX, 40*factoryY); + ui->labelStepLenUnit->setGeometry(165*factoryX, 205*factoryY, 25*factoryX, 40*factoryY); + + ui->pushBtnEnlarge->setGeometry(16*factoryX, 339*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnNarrow->setGeometry(154*factoryX, 339*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnAuto->setGeometry(85*factoryX, 408*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnLeft->setGeometry(16*factoryX, 408*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnRight->setGeometry(154*factoryX, 408*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnUp->setGeometry(85*factoryX, 339*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnDn->setGeometry(85*factoryX, 477*factoryY, 53*factoryX, 53*factoryY); + ui->pushBtnDrag->setGeometry(16*factoryX, 477*factoryY, 53*factoryX, 53*factoryY); //结束本图元绘制 + ui->pushBtnNeedleLayoutPreview->setGeometry(154*factoryX,477*factoryY,53*factoryX,53*factoryY); //排针预览 + + ui->pushBtnOk->setGeometry(16*factoryX, 545*factoryY, 80*factoryX, 30*factoryY); + ui->pushBtnCancel->setGeometry(127*factoryX, 545*factoryY, 80*factoryX, 30*factoryY); + + ui->frameDown->setGeometry(10*factoryX,560*factoryY,771*factoryX,31*factoryY); + ui->labelIndexInfo->setGeometry(370*factoryX,5*factoryY,291*factoryX,21*factoryY); + ui->labelSizeInfo->setGeometry(10*factoryX,5*factoryY,291*factoryX,21*factoryY); + double value = static_cast(m_view->getMaxSegmentLength())/10; + ui->pushBtnSetLen->setText(QString::number(value)); +} + +//设置按钮颜色 天蓝色渐变 +void LineGenerWidget::setButtonColorForSkyBlue(QPushButton *button) +{ + QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}"; + style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #E8E8E8, stop: 1 #B3B3B3);border: none;color:rgb(0,0,0);}"; + style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 rgb(247, 180, 61), stop: 1 rgb(222, 162, 55));border: none;color:rgb(0,0,0);}"; + button->setStyleSheet(style); +} + +//按钮颜色天空蓝--清空文本设置icon +void LineGenerWidget::setBlueButtonStyleClearTextAndSettingsIcon(QPushButton *button) +{ + QString iconName = ":/images/LineGenerWidget/"+button->objectName()+".png"; + button->setIcon(QIcon(iconName)); + button->setIconSize(7*QSize(returnMinimumSize(button)/8, 7*returnMinimumSize(button)/8)); + button->setText(""); + QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}"; + style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + button->setStyleSheet(style); +} + +//按钮颜色橘色--清空文本设置icon +void LineGenerWidget::setOrangeButtonStyleSettingsIcon(QPushButton *button) +{ + QString iconName = ":/images/LineGenerWidget/"+button->objectName()+".png"; + button->setIcon(QIcon(iconName)); + button->setIconSize(QSize(returnMinimumSize(button), returnMinimumSize(button))); + button->setText(""); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + button->setStyleSheet(style); +} + +void LineGenerWidget::setPatternNeedleWi(PatternNeedleLayoutWidget *widgetPtr) +{ + m_pPatternNeedleWi = widgetPtr; +} + +//初始化窗体控件的样式 +void LineGenerWidget::initControlStyle() +{ + ui->labelIndexInfo->setFont(fontSize_M()); + ui->labelSizeInfo->setFont(fontSize_M()); + + ui->frameBack->setStyleSheet("QFrame {" + "background-color: rgb(0, 0, 0);" + "}"); + ui->frameBtn->setStyleSheet("background-color:rgb(67, 67, 67);border-radius: "+borderRadius()+"px;"); + + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnEnlarge); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnNarrow); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnPre1); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnNext1); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnPre10); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnNext10); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnAuto); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnLeft); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnRight); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnUp); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushBtnDn); + + setButtonColorForSkyBlue(ui->pushBtnLine); + setButtonColorForSkyBlue(ui->pushBtnArc); + setButtonColorForSkyBlue(ui->pushBtnNeedleLayoutPreview); + setButtonColorForSkyBlue(ui->pushBtnAdsorptionVertex); + setButtonColorForSkyBlue(ui->pushBtnRevoke); + setButtonColorForSkyBlue(ui->pushBtnDrag); + + setButtonColorForSkyBlue(ui->pushButtonXValue); + setButtonColorForSkyBlue(ui->pushButtonXAdd); + setButtonColorForSkyBlue(ui->pushButtonXDec); + ui->pushButtonXValue->setFont(fontSize_M()); + QFont size(FONTTYPE,g_fontsize + 4, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + ui->pushButtonXAdd->setFont(size); + ui->pushButtonXDec->setFont(size); + ui->labelX->setFont(fontSize_M()); + ui->labelX->setStyleSheet(stateTextColour()); + ui->labelXUnit->setFont(fontSize_M()); + ui->labelXUnit->setStyleSheet(stateTextColour()); + + setButtonColorForSkyBlue(ui->pushButtonYValue); + setButtonColorForSkyBlue(ui->pushButtonYAdd); + setButtonColorForSkyBlue(ui->pushButtonYDec); + ui->pushButtonYValue->setFont(fontSize_M()); + + ui->pushButtonYAdd->setFont(size); + ui->pushButtonYDec->setFont(size); + ui->labelY->setFont(fontSize_M()); + ui->labelY->setStyleSheet(stateTextColour()); + ui->labelYUnit->setFont(fontSize_M()); + ui->labelYUnit->setStyleSheet(stateTextColour()); + + ui->labelStepLen->setFont(fontSize_M()); + ui->labelStepLen->setStyleSheet(stateTextColour()); + setButtonColorForSkyBlue(ui->pushBtnSetLen); + ui->labelStepLenUnit->setFont(fontSize_M()); + ui->labelStepLenUnit->setStyleSheet(stateTextColour()); + + ui->pushBtnLine->setFont(fontSize_M()); + ui->pushBtnArc->setFont(fontSize_M()); + ui->pushBtnNeedleLayoutPreview->setFont(fontSize_M()); + ui->pushBtnAdsorptionVertex->setFont(fontSize_M()); + ui->pushBtnSetLen->setFont(fontSize_M()); + ui->pushBtnDrag->setFont(fontSize_M()); + ui->pushBtnRevoke->setFont(fontSize_M()); + + setOrangeButtonStyleSettingsIcon(ui->pushBtnCancel); + setOrangeButtonStyleSettingsIcon(ui->pushBtnOk); + + m_view->setStyleSheet("QGraphicsView {" + "border-top-left-radius: "+borderRadius()+"px;" // 左下角圆角 + "border-top-right-radius: "+borderRadius()+"px;" // 右下角圆角 + "}"); + ui->frameDown->setStyleSheet("QFrame {" + "border-bottom-left-radius: "+borderRadius()+"px;" // 左下角圆角 + "border-bottom-right-radius: "+borderRadius()+"px;" // 右下角圆角 + "}"); + ui->labelIndexInfo->setStyleSheet("color:rgb(255,255,255)"); + ui->labelSizeInfo->setStyleSheet("color:rgb(255,255,255)"); +} + +//返回一个按钮-高和宽最小的一个数值 +int LineGenerWidget::returnMinimumSize(QPushButton *button) +{ + // 确保指针不是 nullptr,以避免在按钮未正确初始化时导致的问题 + if (button == NULL) { + return 0; // 或者抛出异常或处理这种情况 + } + // 使用三元运算符来返回宽度和高度中的较大值 + return button->width() < button->height() ? button->width() : button->height(); +} + +QByteArray LineGenerWidget::creatQuiDat() +{ + int minX = S32_MAX; + int maxX = S32_MIN; + int minY = S32_MAX; + int maxY = S32_MIN; + int maxY1 = S32_MIN; + + QList lineList = m_view->getLineItemList(); + QList pathList = m_view->getPathItemList(); + + int firstFlag = 0; + for(int i = 0; i < lineList.size(); i++) + { + for(int j = 0; j < lineList[i].points.size(); j++) + { + double x = lineList[i].points[j].x()*100.0; + double y = lineList[i].points[j].y()*100.0; + lineList[i].points[j].setX(x); + lineList[i].points[j].setY(y); + if(maxY1 < lineList[i].points[j].y()) + { + maxY1 = lineList[i].points[j].y(); + } + } + } + for(int i = 0; i < pathList.size(); i++) + { + for(int j = 0; j < pathList[i].points.size(); j++) + { + double x = pathList[i].points[j].x()*100.0; + double y = pathList[i].points[j].y()*100.0; + pathList[i].points[j].setX(x); + pathList[i].points[j].setY(y); + if(maxY1 < pathList[i].points[j].y()) + { + maxY1 = pathList[i].points[j].y(); + } + } + } + qDebug()<<"maxY1"<= lineList.size()+pathList.size()+200) + { + break;//避免陷入死循环 + } + if(idx > lineList.size()+pathList.size()) + { + break; + } + for(int i = 0; i < lineList.size(); i++) + { + if(lineList[i].order == idx) + { + unsigned short int type = lineList[i].type; + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int pointsSize = lineList[i].points.size(); + ch1 = static_cast(pointsSize & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((pointsSize >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + for(int j = 0; j < lineList[i].points.size(); j++) + { + unsigned short int x = lineList[i].points[j].x(); + if(firstFlag == 0) + { + firstX = x; + firstFlag = 1; + } + endX = x; + lastP.setX(x); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = maxY1-lineList[i].points[j].y(); + lastP.setY(y); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + qDebug()<<"line px"< x) {minX = x;} + if (maxX < x) {maxX = x;} + if (minY > y) {minY = y;} + if (maxY < y) {maxY = y;} + } + idx++; + } + } + + for(int i = 0; i < pathList.size(); i++) + { + if(pathList[i].order == idx) + { + unsigned short int type = pathList[i].type; + if((pathList[i].points.size() == 3 && type == QUI_TYPE_ARC) || + (pathList[i].points.size() == 4 && type == QUI_TYPE_BES))//圆弧固定为3个点,贝塞尔为4个点 + { + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + for(int j = 0; j < pathList[i].points.size(); j++) + { + unsigned short int x = pathList[i].points[j].x(); + if(firstFlag == 0) + { + firstX = x; + firstFlag = 1; + } + endX = x; + lastP.setX(x); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = maxY1-pathList[i].points[j].y(); + lastP.setY(y); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + qDebug()<<"arc px"< x) {minX = x;} + if (maxX < x) {maxX = x;} + if (minY > y) {minY = y;} + if (maxY < y) {maxY = y;} + } + } + idx++; + } + } + add++; + } + + //如果起点和终点x不一致,则添加一段跨步,使起点x和终点x相等 + if(firstX != endX) + { + unsigned short int type = QUI_TYPE_STEP; + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int pointsSize = 2; + ch1 = static_cast(pointsSize & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((pointsSize >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + //第一个点 + unsigned short int x = lastP.x(); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = lastP.y(); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + qDebug()<<"end x1"<(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + y = lastP.y(); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + qDebug()<<"end x2"<(end & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((end >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + QuiFileHead quiHead; + memset((char*)&quiHead,0,sizeof(QuiFileHead)); + + quiHead.scanX = maxX - minX; + quiHead.scanY = maxY - minY; + quiHead.rollaYUpDn = 0; + quiHead.unit = 0x00; + quiHead.ver = 0x01; + quiHead.leftRightLen = m_pPatternNeedleWi->getLeftRightNeedleSpace();//左右针间距 + quiHead.HStep = m_pPatternNeedleWi->getNeedlesSpace();//针与针之间间距 + quiHead.VStep12 = m_pPatternNeedleWi->getNeedleLayoutSpace12();//针排间距 + quiHead.VStep23 = m_pPatternNeedleWi->getNeedleLayoutSpace23();//针排间距 + + memcpy((char*)&quiHead.arrayNeedle1,(char*)m_pPatternNeedleWi->getarrayNeedle1(),sizeof(unsigned char[LAYOUTNEEDLENUM])); + memcpy((char*)&quiHead.arrayNeedle2,(char*)m_pPatternNeedleWi->getarrayNeedle2(),sizeof(unsigned char[LAYOUTNEEDLENUM])); + memcpy((char*)&quiHead.arrayNeedle3,(char*)m_pPatternNeedleWi->getarrayNeedle3(),sizeof(unsigned char[LAYOUTNEEDLENUM])); + + quiHead.normalStep = ui->pushBtnSetLen->text().toInt()*100; + fileData.insert(0, (char*)&quiHead, sizeof(QuiFileHead)); + + return fileData; +} + +//放大 +void LineGenerWidget::on_pushBtnEnlarge_clicked() +{ + m_view->enlargeView(); +} + +//缩小 +void LineGenerWidget::on_pushBtnNarrow_clicked() +{ + m_view->narrowView(); +} + +void LineGenerWidget::on_pushBtnPre1_clicked() +{ + m_view->forwardAndBackward(1); +} + +void LineGenerWidget::on_pushBtnNext1_clicked() +{ + m_view->forwardAndBackward(-1); +} + +void LineGenerWidget::on_pushBtnPre10_clicked() +{ + m_view->forwardAndBackward(10); +} + +void LineGenerWidget::on_pushBtnNext10_clicked() +{ + m_view->forwardAndBackward(-10); +} + +void LineGenerWidget::on_pushBtnLine_clicked() +{ + ui->pushBtnLine->setChecked(true); + ui->pushBtnArc->setChecked(false); + ui->pushBtnDrag->setChecked(false); + m_view->setShapeType(TYPE_LINE); +} + +void LineGenerWidget::on_pushBtnArc_clicked() +{ + ui->pushBtnArc->setChecked(true); + ui->pushBtnLine->setChecked(false); + ui->pushBtnDrag->setChecked(false); + m_view->setShapeType(TYPE_ARC); +} + +void LineGenerWidget::on_pushBtnUp_clicked() +{ + m_view->moveScene(0,10); +} + +void LineGenerWidget::on_pushBtnDn_clicked() +{ + m_view->moveScene(0,-10); +} + +void LineGenerWidget::on_pushBtnLeft_clicked() +{ + m_view->moveScene(10,0); +} + +void LineGenerWidget::on_pushBtnRight_clicked() +{ + m_view->moveScene(-10,0); +} + +void LineGenerWidget::on_pushBtnAuto_clicked() +{ + m_view->autoView(); +} + +//保存文件 +void LineGenerWidget::on_pushBtnOk_clicked() +{ + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Do you want to save as a new file?");//是否保存为一个新文件? + promptDlg.setContentStr(str); + + if(promptDlg.exec() == 1) + { +// QByteArray dat = creatDsrDat(); + QByteArray dat = creatQuiDat(); + + QDir apppath(qApp->applicationDirPath()); + QString filePath; + + WordsInputDialog wordInputDlg; + wordInputDlg.clean(); + wordInputDlg.setTitleStr(tr("Name"));//命名 + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { + //文件名称 + QString name = wordInputDlg.getInputStr(); + filePath = apppath.path() + apppath.separator() + PATTERNPATH + apppath.separator() + name + ".qui"; + } + + //保存成qui文件 + QFile file(filePath); + + if(file.exists())//文件已经存在 + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("This file already exists!");//此文件已经存在! + dlg.setContentStr(str); + dlg.exec(); + file.close(); + return; + } + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << filePath; + filePath.clear(); + } + else + { + file.write(dat); +#ifdef Q_OS_LINUX + system("sync"); +#endif + file.close(); + } + } + + ui->pushBtnLine->setChecked(false); + ui->pushBtnArc->setChecked(false); + m_view->cleanView(); + this->hide(); +} + +void LineGenerWidget::on_pushBtnCancel_clicked() +{ + ui->pushBtnLine->setChecked(false); + ui->pushBtnArc->setChecked(false); + m_view->cleanView(); + this->hide(); +} + +void LineGenerWidget::slotShowCurrentIdx(int idx) +{ + QString str= tr("Current number of needles: ") + QString("%1").arg(idx);//当前针数: + ui->labelIndexInfo->setText(str); +} + +//排针预览 +void LineGenerWidget::on_pushBtnNeedleLayoutPreview_clicked() +{ + QByteArray datArray = creatAbsDat(); + emit siNeedleLayoutPreview(datArray); +// m_pPatternNeedleWi->showTempView(datArray); +} + +QByteArray LineGenerWidget::creatDsrDat() +{ + double unit = 100.0; + + double minX = S32_MAX; + double maxX = S32_MIN; + double minY = S32_MAX; + double maxY = S32_MIN; + + QList list = m_view->getPointList(); + + //dsr数据 + QByteArray datArray; + datArray.clear(); + + DsrStep absItemDat; + memset((char*)&absItemDat,0,sizeof(DsrStep)); + + s32 prex = 0; + s32 prey = 0; + s32 curx = 0; + s32 cury = 0; + + //保存为dsr文件 + for(int i = 0; i < list.size(); i++) + { + QPointF point = list[i]->pos(); + + absItemDat.ctrl = DSR_SEWING; + absItemDat.attr = 0; + absItemDat.dx = 0 - point.x() * unit; + absItemDat.dy = 0 - point.y() * unit; + + curx = absItemDat.dx; + cury = absItemDat.dy; + + int ddx = curx - prex; + int ddy = cury - prey; + double tar = atan2(ddy,ddx); + absItemDat.dr = (tar * 10000+0.5*(tar>0?1:-1)); + + if (minX > absItemDat.dx) { minX = absItemDat.dx;} + if (maxX < absItemDat.dx) { maxX = absItemDat.dx;} + if (minY > absItemDat.dy) { minY = absItemDat.dy;} + if (maxY < absItemDat.dy) { maxY = absItemDat.dy;} + + datArray.append((char*)&absItemDat,sizeof(DsrStep)); + + prex = curx;//bin + prey = cury;//bin + } + + //添加结束码 + absItemDat.ctrl = DATA_END; + absItemDat.attr = 0; + datArray.append((char*)&absItemDat,sizeof(DsrStep)); + + //生成文件头 + DsrHead dsrHead; + memset((char*)&dsrHead,0,sizeof(DsrHead)); + int itemNums = datArray.length() / sizeof(DsrStep); + //重新生成文件头 + float ver = DSR_VERSION_5; + dsrHead.verCode = *((DWORD*)(&ver)); + dsrHead.stitches = itemNums; + dsrHead.xyUnit = 1; + + dsrHead.rangePx = maxX-minX; + dsrHead.rangePy = maxY-minY; + dsrHead.rangeNx = minX-minX; + dsrHead.rangeNy = minY-minY; + + dsrHead.startX = 0; + dsrHead.startY = 0; + dsrHead.anchorX = 0; + dsrHead.anchorY = 0; + dsrHead.dataBegin = sizeof(DsrHead); + dsrHead.stepSize = itemNums*sizeof(DsrStep); // 数据字节数 + datArray.insert(0,(char*)&dsrHead,sizeof(DsrHead)); + + return datArray; +} + +QByteArray LineGenerWidget::creatAbsDat() +{ + double unit = 100.0; + + double minX; + double maxX; + double minY; + double maxY; + + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + QList lineList = m_view->getLineItemList(); + QList pathList = m_view->getPathItemList(); + + //dsr数据 + QByteArray datArray; + datArray.clear(); + + DsAbsItem absItemDat; + memset((char*)&absItemDat,0,sizeof(DsAbsItem)); + + s32 prex = 0; + s32 prey = 0; + + s32 curx,cury; + curx = cury = 0; + + s32 anchorX,anchorY,beginX,beginY; + anchorX = anchorY = beginX = beginY = 0; + + //保存为dsr + //y向取反,并按顺序保存 + int idx = 1;//序号 + int add = 0; + while(1) + { + if(add >= lineList.size()+pathList.size()+200) + { + break;//避免陷入死循环 + } + if(idx > lineList.size()+pathList.size()) + { + break; + } + for(int i = 0; i < lineList.size(); i++) + { + if(lineList[i].order == idx) + { + for(int j = 0; j < lineList[i].points.size(); j++) + { + QPointF point = lineList[i].points[j]; + + absItemDat.ctrl = DATA_SEWING; + absItemDat.attr = 0; + absItemDat.ax = point.x() * unit; + absItemDat.ay = point.y() * unit * -1;//change,y取反 + + curx = absItemDat.ax; + cury = absItemDat.ay; + + int ddx = curx - prex; + int ddy = cury - prey; + double tar = atan2(ddy,ddx); + absItemDat.ar = (tar * 10000+0.5*(tar>0?1:-1)); + + if (minX > absItemDat.ax) { minX = absItemDat.ax;} + if (maxX < absItemDat.ax) { maxX = absItemDat.ax;} + if (minY > absItemDat.ay) { minY = absItemDat.ay;} + if (maxY < absItemDat.ay) { maxY = absItemDat.ay;} + + if(lineList[i].order == 1 && j == 0)//第一个图元的第一个点 + { + anchorX = absItemDat.ax; + beginX = absItemDat.ax; + + anchorY = absItemDat.ay; + beginY = absItemDat.ay; + } + + datArray.append((char*)&absItemDat,sizeof(DsAbsItem)); + + prex = curx;//bin + prey = cury;//bin + } + idx++; + } + } + + for(int i = 0; i < pathList.size(); i++) + { + if(pathList[i].order == idx) + { + unsigned short int type = pathList[i].type; + if((pathList[i].points.size() == 3 && type == QUI_TYPE_ARC) || + (pathList[i].points.size() == 4 && type == QUI_TYPE_BES))//圆弧固定为3个点,贝塞尔为4个点 + { + if(pathList[i].points.size() == 3 && type == QUI_TYPE_ARC) + { + double threex[3], threey[3]; + threex[0] = pathList[i].points[0].x() * unit; + threex[1] = pathList[i].points[1].x() * unit; + threex[2] = pathList[i].points[2].x() * unit; + threey[0] = pathList[i].points[0].y() * unit * -1; + threey[1] = pathList[i].points[1].y() * unit * -1; + threey[2] = pathList[i].points[2].y() * unit * -1; + calcCurve(threex, threey, ui->pushBtnSetLen->text().toInt()*unit, datArray, DATA_SEWING); + } + + for(int j = 0; j < pathList[i].points.size(); j++) + { + QPointF point = pathList[i].points[j]; + double ax = point.x() * unit; + double ay = point.y() * unit * -1;//change,y取反 + + curx = ax; + cury = ay; + + if (minX > ax) { minX = ax;} + if (maxX < ax) { maxX = ax;} + if (minY > ay) { minY = ay;} + if (maxY < ay) { maxY = ay;} + + prex = curx;//bin + prey = cury;//bin + } + } + idx++; + } + } + add++; + } + + + //添加结束码 + memset((char*)&absItemDat, 0, sizeof(DsrStep)); // 重置 absItemDat + absItemDat.ctrl = DATA_END; + absItemDat.attr = 0; + datArray.append((char*)&absItemDat,sizeof(DsAbsItem)); + + //生成文件头 + DataDs16FileHead dhead; + dhead.dataSize = datArray.size(); // 数据字节数 + dhead.itemNums = datArray.size()/sizeof(DsAbsItem); // 数据项个数 + dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 + dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 + dhead.dataChecksum = calcCheckSum32((u8 *)(datArray.data()) , datArray.length()); // 数据累加校验和 + dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) + u32 fileID = 0; + fileID = calcCheckSum32((u8 *)(datArray.data()) , datArray.length()); // 原始数据累加校验和 + dhead.fileid = fileID; //中间数据的 fileid = + + dhead.anchorX = anchorX; // 定位点坐标X + dhead.anchorY = anchorY; // 定位点坐标Y + dhead.beginX = beginX; // 数据起点坐标X + dhead.beginY = beginY; // 数据起点坐标Y + dhead.beginR = 0; + dhead.minX = minX; + dhead.maxX = maxX; + dhead.minY = minY; + dhead.maxY = maxY; // 轮廓范围,使用重新计算之后的值 + + datArray.insert(0,(char*)&dhead,sizeof(dhead)); + + return datArray; +} + +void LineGenerWidget::refreshView() +{ + m_view->restoreView(); + QWidget::show(); +} + +void LineGenerWidget::on_pushBtnAdsorptionVertex_clicked() +{ + if(ui->pushBtnAdsorptionVertex->isChecked()) + { + ui->pushBtnAdsorptionVertex->setChecked(true); + m_view->setAdsorption(true);//吸附 + } + else + { + ui->pushBtnAdsorptionVertex->setChecked(false); + m_view->setAdsorption(false);//不吸附 + } +} + +void LineGenerWidget::on_pushBtnDrag_clicked() +{ + ui->pushBtnLine->setChecked(false); + ui->pushBtnArc->setChecked(false); + ui->pushBtnAdsorptionVertex->setChecked(false); + ui->pushBtnDrag->setChecked(true); + m_view->setShapeType(TYPE_DRAG); +} + +void LineGenerWidget::on_pushBtnSetLen_clicked() +{ + NumerInputDialog ndlg(this); + ndlg.setTitleStr(tr("Step Length"));//针步长度 + ndlg.setUnitStr(tr("mm")); + ndlg.setValueAndRange(m_view->getMaxSegmentLength(), 20, 80, 1); + if (ndlg.exec())//输入弹窗点击了确认 + { + m_view->setMaxSegmentLength(ndlg.getValue()); + } + double value = static_cast(m_view->getMaxSegmentLength())/10; + ui->pushBtnSetLen->setText(QString::number(value)); +} + +void LineGenerWidget::on_pushButtonXValue_clicked() +{ + int rslt=0; + m_XMoveValue= ui->pushButtonXValue->text().toDouble()*10; + NumerInputDialog ndlg(this); + ndlg.setTitleStr("X compensation value setting"); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_XMoveValue, 0, 100, 1); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_XMoveValue)//更改后的值不等于之前存的值 + { + m_XMoveValue = val/10.0; + } + } + ui->pushButtonXValue->setText(QString::number(m_XMoveValue)); +} + +void LineGenerWidget::on_pushButtonXAdd_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(m_XMoveValue,0); + } +} + +void LineGenerWidget::on_pushButtonXDec_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0-m_XMoveValue,0); + } +} + +void LineGenerWidget::on_pushButtonYValue_clicked() +{ + int rslt=0; + m_YMoveValue= ui->pushButtonYValue->text().toDouble()*10; + NumerInputDialog ndlg(this); + ndlg.setTitleStr("Y compensation value setting"); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_YMoveValue, 0, 100, 1); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_YMoveValue)//更改后的值不等于之前存的值 + { + m_YMoveValue = val/10.0; + } + } + ui->pushButtonYValue->setText(QString::number(m_YMoveValue)); +} + +void LineGenerWidget::on_pushButtonYAdd_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0,m_YMoveValue); + } +} + +void LineGenerWidget::on_pushButtonYDec_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0,0-m_YMoveValue); + } +} + +//撤销(去掉)最后一个点 +void LineGenerWidget::on_pushBtnRevoke_clicked() +{ + if(m_view != NULL) + { + ui->pushBtnArc->setChecked(false); + ui->pushBtnLine->setChecked(false); + ui->pushBtnDrag->setChecked(true); + m_view->revokeLastItem(); + } +} diff --git a/sharedviews/linegenerwidget.h b/sharedviews/linegenerwidget.h new file mode 100644 index 0000000..a0b782a --- /dev/null +++ b/sharedviews/linegenerwidget.h @@ -0,0 +1,84 @@ +#ifndef LINEGENERWIDGET_H +#define LINEGENERWIDGET_H + +#include +#include +#include "view/mygraphicsview.h" +#include "main.h" +#include "sharedviews/promptdialog.h" +#include "sharedviews/wordsinputdialog.h" +#include "datafile/datafilequi.h" +#include "sharedviews/patternneedlelayoutwidget.h" + +namespace Ui { +class LineGenerWidget; +} + +class LineGenerWidget : public QWidget +{ + Q_OBJECT + +public: + explicit LineGenerWidget(QWidget *parent = 0); + ~LineGenerWidget(); + + void setPatternNeedleWi(PatternNeedleLayoutWidget * WidgetPtr); + +private slots: + void on_pushBtnEnlarge_clicked(); + void on_pushBtnNarrow_clicked(); + void on_pushBtnPre1_clicked(); + void on_pushBtnNext1_clicked(); + void on_pushBtnPre10_clicked(); + void on_pushBtnNext10_clicked(); + void on_pushBtnLine_clicked(); + void on_pushBtnArc_clicked(); + void on_pushBtnUp_clicked(); + void on_pushBtnDn_clicked(); + void on_pushBtnLeft_clicked(); + void on_pushBtnRight_clicked(); + void on_pushBtnAuto_clicked(); + void on_pushBtnOk_clicked(); + void on_pushBtnCancel_clicked(); + void slotShowCurrentIdx(int idx); + void on_pushBtnNeedleLayoutPreview_clicked(); + + void on_pushBtnAdsorptionVertex_clicked(); + void on_pushBtnDrag_clicked(); + void on_pushBtnSetLen_clicked(); + + void on_pushButtonXValue_clicked(); + void on_pushButtonXAdd_clicked(); + void on_pushButtonXDec_clicked(); + void on_pushButtonYValue_clicked(); + void on_pushButtonYAdd_clicked(); + void on_pushButtonYDec_clicked(); + + void on_pushBtnRevoke_clicked(); + +private: + Ui::LineGenerWidget *ui; + MyGraphicsView *m_view; + PatternNeedleLayoutWidget *m_pPatternNeedleWi;//花样排针预览窗体 + double m_XMoveValue; //X移动距离 + double m_YMoveValue; //Y移动距离 + +private: + void initResolution(); + void setButtonColorForSkyBlue(QPushButton *button); + void setBlueButtonStyleClearTextAndSettingsIcon(QPushButton *button); + void setOrangeButtonStyleSettingsIcon(QPushButton *button); + void initControlStyle(); + int returnMinimumSize(QPushButton *button); + QByteArray creatQuiDat(); + QByteArray creatDsrDat(); + QByteArray creatAbsDat(); + +public: + void refreshView(); + +signals: + void siNeedleLayoutPreview(QByteArray &dat);//排针预览 +}; + +#endif // LINEGENERWIDGET_H diff --git a/sharedviews/linegenerwidget.ui b/sharedviews/linegenerwidget.ui new file mode 100644 index 0000000..2946eb4 --- /dev/null +++ b/sharedviews/linegenerwidget.ui @@ -0,0 +1,527 @@ + + + LineGenerWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + + + 799 + 10 + 211 + 571 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 360 + 71 + 41 + + + + Enlarge + + + + + + 10 + 10 + 72 + 40 + + + + -1 + + + + + + 120 + 539 + 80 + 31 + + + + Cancel + + + + + + 10 + 539 + 80 + 31 + + + + Ok + + + + + + 150 + 420 + 48 + 48 + + + + Right + + + + + + 130 + 60 + 72 + 40 + + + + +10 + + + + + + 130 + 10 + 72 + 40 + + + + +1 + + + + + + 130 + 360 + 71 + 41 + + + + Narrow + + + + + + 80 + 480 + 48 + 48 + + + + Down + + + + + + 10 + 420 + 48 + 48 + + + + Left + + + + + + 80 + 360 + 48 + 48 + + + + Up + + + + + + 80 + 420 + 48 + 48 + + + + Auto + + + + + + 10 + 60 + 72 + 40 + + + + -10 + + + + + + 10 + 270 + 91 + 40 + + + + Line + + + true + + + + + + 120 + 270 + 81 + 40 + + + + Arc + + + true + + + + + + 150 + 480 + 51 + 51 + + + + NLPreview + + + + + + 10 + 320 + 91 + 31 + + + + Adsorption + + + true + + + + + + 10 + 490 + 61 + 31 + + + + Mobile board + + + true + + + + + + 90 + 210 + 61 + 31 + + + + 2 + + + + + + 26 + 110 + 60 + 40 + + + + 0.0 + + + + + + 116 + 160 + 40 + 40 + + + + + + + + + + + 166 + 160 + 40 + 40 + + + + - + + + + + + 90 + 110 + 20 + 40 + + + + mm + + + + + + 6 + 110 + 14 + 40 + + + + X + + + + + + 116 + 110 + 40 + 40 + + + + + + + + + + + 6 + 160 + 14 + 40 + + + + Y + + + + + + 166 + 110 + 40 + 40 + + + + - + + + + + + 26 + 160 + 60 + 40 + + + + 0.0 + + + + + + 90 + 160 + 20 + 40 + + + + mm + + + + + + 6 + 210 + 71 + 40 + + + + Step Length + + + + + + 160 + 210 + 20 + 40 + + + + mm + + + + + + 120 + 320 + 81 + 31 + + + + Revoke + + + false + + + + + + + 20 + 550 + 771 + 31 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 5 + 291 + 21 + + + + TextLabel + + + + + + 370 + 5 + 291 + 21 + + + + TextLabel + + + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + frameBack + frameBtn + frameDown + + + + diff --git a/sharedviews/mcheaddialog.cpp b/sharedviews/mcheaddialog.cpp new file mode 100644 index 0000000..5b823c3 --- /dev/null +++ b/sharedviews/mcheaddialog.cpp @@ -0,0 +1,258 @@ +#include "mcheaddialog.h" +#include "ui_mcheaddialog.h" + +McHeadDialog::McHeadDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::McHeadDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + setAttribute(Qt::WA_TranslucentBackground, true);//设置窗体背景透明 + + initWidget(); + initControl(); +} + +McHeadDialog::~McHeadDialog() +{ + delete ui; +} + +void McHeadDialog::on_buttonOk_clicked() +{ + done(1); +} + +void McHeadDialog::on_buttonCancel_clicked() +{ + done(0); +} + +void McHeadDialog::updataUi(int btnIndex, MyButton *button) +{ + if(btnIndex > 8 || btnIndex < 0) + return; + bitset<8> charBit(m_mcHeadSw); + m_mcHeadSw = setBit(m_mcHeadSw, btnIndex, !charBit[btnIndex]); + + bitset<8> charBitFan(m_mcHeadSw); + cout << charBitFan << endl; + + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + if(charBitFan.test(btnIndex)) // 建议使用test + {button->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);");} + else + {button->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);");} +} + +void McHeadDialog::refreshUi() +{ + bitset<8> charBit(m_mcHeadSw); + if (charBit[0] == 1) + { + ui->pushButton->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + if(charBit[1] == 1) + { + ui->pushButton_2->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_2->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[2] == 1) + { + ui->pushButton_3->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_3->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[3] == 1) + { + ui->pushButton_4->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_4->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[4] == 1) + { + ui->pushButton_5->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_5->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[5] == 1) + { + ui->pushButton_6->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_6->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[6] == 1) + { + ui->pushButton_7->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_7->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + + if(charBit[7] == 1) + { + ui->pushButton_8->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));border-radius:" + borderRadius() + "px;color:rgb(255,255,255);"); + } + else + { + ui->pushButton_8->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(100, 100, 100));border-radius:" + borderRadius() + "px;color:rgb(234, 234, 234);"); + } + +} + +char McHeadDialog::setBit(char data, int setoff, bool value) +{ + bitset<8> charBit(data); + charBit.set(setoff, value); + char res = (char)charBit.to_ulong(); + return res; +} + +void McHeadDialog::setChar(char data) +{ + m_mcHeadSw = data; + refreshUi(); +} + +unsigned char McHeadDialog::getChar() +{ + return m_mcHeadSw; +} + +void McHeadDialog::on_pushButton_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 0), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_2_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 1), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_3_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 2), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_4_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 3), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_5_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 4), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_6_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 5), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_7_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 6), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::on_pushButton_8_clicked() +{ + MyButton *button = (MyButton*) this->sender() ; + QMetaObject::invokeMethod(this, "updataUi", Qt::DirectConnection, Q_ARG(int , 7), Q_ARG(MyButton *, button)); +} + +void McHeadDialog::initWidget() +{ + m_sheetBtnList.append(ui->pushButton); + m_sheetBtnList.append(ui->pushButton_2); + m_sheetBtnList.append(ui->pushButton_3); + m_sheetBtnList.append(ui->pushButton_4); + m_sheetBtnList.append(ui->pushButton_5); +// m_sheetBtnList.append(ui->pushButton_6); +// m_sheetBtnList.append(ui->pushButton_7); +// m_sheetBtnList.append(ui->pushButton_8); + ui->pushButton_6->setVisible(false); + ui->pushButton_7->setVisible(false); + ui->pushButton_8->setVisible(false); + // QList btns = this->findChildren(); +} + +void McHeadDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void McHeadDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX, 0*factoryY, GLB_SCR_WIGHT*factoryX, GLB_SCR_HEIGHT*factoryY); + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + int bgX = (GLB_SCR_WIGHT - GLB_LBUT_WIGHT*m_sheetBtnList.size() - GLB_BAS_WIGHT * (m_sheetBtnList.size() -1))/2; + for(int i = 0; i < m_sheetBtnList.size(); i++){ + m_sheetBtnList[i]->setGeometry((bgX+i*(GLB_LBUT_WIGHT + GLB_BAS_WIGHT))*factoryX, GLB_SCR_HEIGHT/2*factoryY, GLB_LBUT_WIGHT*factoryX, GLB_LBUT_HEIGHT*factoryY); + m_sheetBtnList[i]->setText(QString("%1").arg(i+1)); + m_sheetBtnList[i]->setFont(fontSize_M()); + m_sheetBtnList[i]->setStyleSheet(titleTextColour()); + } +} + +void McHeadDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + ui->frameBack->setStyleSheet(transparentStyle()); + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} diff --git a/sharedviews/mcheaddialog.h b/sharedviews/mcheaddialog.h new file mode 100644 index 0000000..599407a --- /dev/null +++ b/sharedviews/mcheaddialog.h @@ -0,0 +1,55 @@ +#ifndef MCHEADDIALOG_H +#define MCHEADDIALOG_H + +#include +#include "setcontrolstyle.h" + +#include +#include + +using namespace std; +#include "mybutton.h" + +namespace Ui { +class McHeadDialog; +} + +class McHeadDialog : public QDialog +{ + Q_OBJECT + +public: + explicit McHeadDialog(QWidget *parent = 0); + ~McHeadDialog(); + +private slots: + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void on_pushButton_clicked(); + void on_pushButton_2_clicked(); + void on_pushButton_3_clicked(); + void on_pushButton_4_clicked(); + void on_pushButton_5_clicked(); + void on_pushButton_6_clicked(); + void on_pushButton_7_clicked(); + void on_pushButton_8_clicked(); + +public slots: + void initWidget(); + void initControl(); + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + + void updataUi(int btnIndex, MyButton *button); + void refreshUi(); + char setBit(char data, int setoff, bool value); + void setChar(char data); + unsigned char getChar(); + +private: + Ui::McHeadDialog *ui; + unsigned char m_mcHeadSw; //机头开关参数 bit位1-8 , 0关闭 1开启 + QList m_sheetBtnList; +}; + +#endif // MCHEADDIALOG_H diff --git a/sharedviews/mcheaddialog.ui b/sharedviews/mcheaddialog.ui new file mode 100644 index 0000000..2bfdfca --- /dev/null +++ b/sharedviews/mcheaddialog.ui @@ -0,0 +1,213 @@ + + + McHeadDialog + + + + 0 + 0 + 1024 + 600 + + + + Dialog + + + + + 820 + 200 + 93 + 28 + + + + PushButton + + + + + + 80 + 200 + 93 + 28 + + + + PushButton + + + + + + 190 + 200 + 93 + 28 + + + + PushButton + + + + + + 300 + 200 + 93 + 28 + + + + PushButton + + + + + + 620 + 200 + 93 + 28 + + + + PushButton + + + + + + 410 + 200 + 93 + 28 + + + + PushButton + + + + + + 720 + 200 + 93 + 28 + + + + PushButton + + + + + + 520 + 200 + 93 + 28 + + + + PushButton + + + + + + 40 + 450 + 120 + 80 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 480 + 560 + 531 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 450 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 370 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + frameBack + pushButton_8 + pushButton + pushButton_2 + pushButton_3 + pushButton_6 + pushButton_4 + pushButton_7 + pushButton_5 + framePageBtn + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/mybutton.cpp b/sharedviews/mybutton.cpp new file mode 100644 index 0000000..4dde230 --- /dev/null +++ b/sharedviews/mybutton.cpp @@ -0,0 +1,315 @@ +#include "mybutton.h" + +MyButton::MyButton(QWidget *parent):QPushButton(parent) +{ + labelImage = NULL; + labelImage = new QLabel(this); + + labelName = NULL; + labelName = new QLabel(this); + + labelValue = NULL; + labelValue = new QLabel(this); +} + +MyButton::~MyButton() +{ + if(labelImage != NULL) + { + delete labelImage; + } + + if(labelName != NULL) + { + delete labelName; + } + + if(labelValue != NULL) + { + delete labelValue; + } +} + +//设置顶图 +void MyButton::setTopImage(QString imagePath,short int y) +{ + setTopImage(imagePath,y,0); +} + +void MyButton::setTopImage(QString imagePath, short y, short x) +{ + setTopImage(imagePath,0,0,x,y); +} + +void MyButton::setTopImage(QString imagePath, short x, short y, short width, short height) +{ + //label加载图片( 方法1) + //QPixmap pix; + //pix.load(imagePath); + //labelImage->setPixmap(pix); + + labelName->hide(); + labelValue->hide(); + labelImage->show(); + + labelImage->setGeometry(x, y, this->width()+width, this->height()+height); + QString style = "outline: none;background-color: rgba(255, 255, 255, 0);border-image: url(" + imagePath + ");border:0px;"; + labelImage->setStyleSheet(style); +} + +void MyButton::setShortCutTopImage(QString imagePath, QPoint point) +{ + labelName->hide(); + labelValue->hide(); + labelImage->show(); + + labelImage->setGeometry(point.x(),point.y(),this->width(),this->height()); + QString style = "outline: none;background-color: rgba(255, 255, 255, 0);border-image: url(" + imagePath + ");border:0px;"; + labelImage->setStyleSheet(style); +} + +void MyButton::setPreviewImage(QImage image) +{ + //label加载图片 + QPixmap pix = QPixmap::fromImage(image); + labelImage->setPixmap(pix); +} + +//设置条目左侧图标 +void MyButton::setItemLeftIcon(QString imagePath) +{ + labelImage->move(0,0); + QString style = "outline: none;background-color: rgba(255, 255, 255, 0);border-image: url(" + imagePath + ");border:0px;"; + labelImage->setStyleSheet(style); +} + +void MyButton::setLabelValueImage(QString imagePath,int scaleW, int scaleH) +{ + if(imagePath.length() <= 0) + { + QPixmap npix; + labelValue->setPixmap(npix); + return; + } + QImage image; + image.load(imagePath); + QPixmap pix = QPixmap::fromImage(image); + + if(scaleW != 0 && scaleH != 0) + { + QPixmap pix1 = pix.scaled(scaleW,scaleH); + labelValue->setPixmap(pix1); + } + else + { + labelValue->setPixmap(pix); + } + /* + labelValue->setAlignment(Qt::AlignLeft); + labelValue->setAlignment(Qt::AlignBottom); + QString style = "background-color: rgba(255, 255, 255, 0);border:0px;image: url(" + imagePath + ");"; + labelValue->setStyleSheet(style); + */ +} + +//设置底层图片(按下、抬起、失效) +void MyButton::setBottomImage(QString imagePath) +{ +//第一种加载图片的方法 +// QPixmap pix; +// pix.load(imageRelPath); +// int w = this->width(); +// int h = this->height(); +// this->setIconSize(QSize(w,h)); +// this->setIcon(pix); + + //第二种加载图片的方法 + QString style = "QPushButton{outline: none;background-color: rgba(255, 255, 255, 0);border-image: url(" + imagePath + "_p0.png" + ");border:0px;}"; + style += "QPushButton:pressed{outline: none;border-image: url(" + imagePath + "_p1.png" + ");}"; + style += "QPushButton:disabled{outline: none;border-image: url(" + imagePath + "_p2.png" + ");}"; + style += "QPushButton:checked{outline: none;border-image: url(" + imagePath + "_p1.png" + ");}"; + //style += "QPushButton:disabled{background-color: rgba(220, 220, 220, 50);}"; + this->setStyleSheet(style); +} + +#if(0) +//设置控制动作界面底层图片(按下、抬起),并设置文字前景色 +void MyButton::setControlWidgetBtnBottomImage(QString imagePath, QString color) +{ + QString style = "QPushButton{outline: none;"+ color + "border-image: url(" + imagePath + "_p0.png" + ");border:0px;}"; + style += "QPushButton:pressed{outline: none;border-image: url(" + imagePath + "_p1.png" + ");}"; + style += "QPushButton:disabled{outline: none;border-image: url(" + imagePath + "_p2.png" + ");}"; + //style += "QPushButton:disabled{background-color: rgba(220, 220, 220, 50);}"; + this->setStyleSheet(style); +} +#endif + +//设置主按钮底层图片 +void MyButton::setCheckedBottomImage(QString imagePath) +{ + //第二种加载图片的方法 + QString style = "QPushButton{outline: none;border-image: url(" + imagePath + "_p0.png" + ");border:0px;}"; + style += "QPushButton:disabled{outline: none;border-image: url(" + imagePath + "_p2.png" + ");}"; + style += "QPushButton:checked{outline: none;border-image: url(" + imagePath + "_p1.png" + ");}"; + this->setStyleSheet(style); +} + +//设置按钮logo(按钮是没有点击事件的) +void MyButton::setUnPreBtnLogo(QString tStyle) +{ + labelName->hide(); + labelValue->hide(); + labelImage->hide(); + + if(tStyle.length() <= 0) + { + return; + } + this->setStyleSheet(titleIconStyle(tStyle)); +} + + +//初始化label条目名称和条目值(参数设置) +void MyButton::initLeftNameRightValue(QRect rectName, QRect rectValue, int right) +{ + labelImage->hide(); + + QString style = "QLabel {outline: none;background-color: rgba(255, 255, 255,0);color: black;}" + "QLabel:disabled {color: rgb(80, 80, 80);}";//失效时字体颜色 + + labelName->setGeometry(rectName); + labelName->setStyleSheet(commonTextColour()); + labelName->setAlignment(Qt::AlignLeft); + labelName->setAlignment(Qt::AlignBottom); + + labelValue->setGeometry(rectValue); + labelValue->setStyleSheet(commonTextColour()); + if(right == 0) + { + labelValue->setAlignment(Qt::AlignLeft | Qt::AlignBottom); + } + else + { + labelValue->setAlignment(Qt::AlignRight | Qt::AlignBottom); + } + + QString style1 = "QPushButton{outline: none;border:0px;border-radius:0px;background-color:rgba(255, 255, 255, 0);}"; + style1 += "QPushButton:pressed{outline: none;background-color: rgba(255, 255, 255, 50);}"; + this->setStyleSheet(style1); +} + +//初始化label图标显示和条目名称(文件导入) +void MyButton::initLeftImageRightName(QRect rectImage, QRect rectName) +{ + labelValue->hide(); + labelImage->show(); + + labelImage->setGeometry(rectImage); + labelImage->setAlignment(Qt::AlignHCenter); + labelImage->setAlignment(Qt::AlignBottom); + + labelName->setGeometry(rectName); + labelName->setStyleSheet(commonTextColour()); + labelName->setAlignment(Qt::AlignLeft); + labelName->setAlignment(Qt::AlignBottom); + + QString style1 = "QPushButton{outline: none;border:0px;border-radius:0px;background-color:rgba(255, 255, 255, 0);}"; + style1 += "QPushButton:checked{outline: none;background-color: rgba(255, 255, 255, 50);}"; + this->setStyleSheet(style1); +} + +void MyButton::initUpImageDownName(QRect rectImage, QRect rectName) +{ + labelValue->hide(); + labelImage->show(); + + labelImage->setGeometry(rectImage); + labelImage->setAlignment(Qt::AlignCenter); + labelImage->setStyleSheet("outline: none;background-color: rgba(255, 255, 255, 0);"); + + labelName->setGeometry(rectName); + labelName->setStyleSheet(commonTextColour()); + labelName->setAlignment(Qt::AlignTop); + labelName->setAlignment(Qt::AlignHCenter); +// labelName->setWordWrap(true); +} + +void MyButton::initLabelValue(QRect rectValue) +{ + labelValue->setGeometry(rectValue); + labelValue->setAlignment(Qt::AlignCenter); +} + +//设置label字体 +void MyButton::setLabelFont(QFont font) +{ + labelName->setFont(font); + labelValue->setFont(font); + //labelValue->show(); +} + +void MyButton::setLabelNameFont(QFont font) +{ + labelName->setFont(font); +} + +void MyButton::setLabelValueFont(QFont font) +{ + labelValue->setFont(font); +} + +//设置条目名称 +void MyButton::setLabelName(QString name) +{ + labelName->setText(name); + labelName->show(); +} + +void MyButton::setLabelNameStyle(QString style) +{ + labelName->setStyleSheet(style); +} + +//设置条目值 +void MyButton::setLabelValue(QString value) +{ + labelValue->setText(value); + labelValue->show(); +} + +void MyButton::setLabelValueStyle(QString style) +{ + labelValue->setStyleSheet(style); +} + +void MyButton::setLabelImage(QString style) +{ + labelImage->setStyleSheet(style); +} + +void MyButton::setMainBtnBottomStyle() +{ + QString style = "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(215, 243, 254));border-radius:"+borderRadius()+"px;}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + this->setStyleSheet(style); +} + +void MyButton::setDirectionButtonStyle() +{ + QString style = "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(204, 234, 244));border-radius:"+borderRadius()+"px;}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + this->setStyleSheet(style); +} + +void MyButton::setRevDirectionButtonStyle() +{ + QString style = "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(204, 234, 244));border-radius:"+borderRadius()+"px;}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + this->setStyleSheet(style); +} diff --git a/sharedviews/mybutton.h b/sharedviews/mybutton.h new file mode 100644 index 0000000..a2ebad4 --- /dev/null +++ b/sharedviews/mybutton.h @@ -0,0 +1,75 @@ +#ifndef MYBUTTON_H +#define MYBUTTON_H + +//#include +#include +#include +#include +#include "setcontrolstyle.h" + + +//自定义的按钮类,按钮上有一个Label,用于显示双层图片 +class MyButton : public QPushButton +{ +public: + MyButton(QWidget *parent=0); + ~MyButton(); + +public: + QLabel *labelImage;//顶层logo + QLabel *labelName;//参数设置按钮的条目名称 + QLabel *labelValue;//参数设置按钮的条目值 + +public: + void setTopImage(QString imagePath,short int y = 0);//设置顶层图片 + void setTopImage(QString imagePath,short int y,short int x); + void setTopImage(QString imagePath,short int x,short int y,short int width, short int height); + void setShortCutTopImage(QString imagePath,QPoint point);//设置快捷按钮顶层图片 + + void setPreviewImage(QImage image);//设置花样选择预览图片 + void setItemLeftIcon(QString imagePath);//设置条目左侧图标 + void setLabelValueImage(QString imagePath,int scaleW = 0, int scaleH = 0);//设置开关图片 + + //设置底层图片(按下、抬起、失效) + void setBottomImage(QString imagePath); + + + //设置绿色渐变底层按钮样式 + void setGreenGradientBottomStyle(QString str); + +#if(0) + //设置控制动作界面底层图片(按下、抬起),并设置文字前景色 + void setControlWidgetBtnBottomImage(QString imagePath,QString color); +#endif + + //设置主按钮底层图片(选中、失效) + void setCheckedBottomImage(QString imagePath); + + + //设置按钮logo(按钮是没有点击事件的) + void setUnPreBtnLogo(QString tStyle); + + void initLeftNameRightValue(QRect rectName, QRect rectValue, int right = 0);//初始化label条目名称和条目值(参数设置) + void initLeftImageRightName(QRect rectImage, QRect rectName);//初始化label图标显示和条目名称(文件导入) + void initUpImageDownName(QRect rectImage,QRect rectName);//初始化label图标和名称(花样选择) + void initLabelValue(QRect rectValue);//初始化labelValue + + void setLabelFont(QFont font);//设置label字体 + void setLabelNameFont(QFont font);//设置label字体 + void setLabelValueFont(QFont font);//设置label字体 + + void setLabelName(QString name);//设置条目名称 + void setLabelNameStyle(QString style);//设置条目名称样式 + void setLabelValue(QString value);//设置条目值 + void setLabelValueStyle(QString style);//设置条目值样式 + void setLabelImage(QString style);//设置图片 + + void setBtnBackColor(QString style); + void setImageBackColor(QString style); + void setLabelImageChecked(QString style); + void setMainBtnBottomStyle(); + void setDirectionButtonStyle(); + void setRevDirectionButtonStyle(); +}; + +#endif // MYBUTTON_H diff --git a/sharedviews/numerinputdialog.cpp b/sharedviews/numerinputdialog.cpp new file mode 100644 index 0000000..0b44d86 --- /dev/null +++ b/sharedviews/numerinputdialog.cpp @@ -0,0 +1,911 @@ +#include "numerinputdialog.h" +#include "ui_numerinputdialog.h" + +NumerInputDialog::NumerInputDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::NumerInputDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + setAttribute(Qt::WA_TranslucentBackground, true);//设置窗体背景透明 + + initDialog(); + initControl(); +} + +NumerInputDialog::~NumerInputDialog() +{ + delete ui; +} + +QString NumerInputDialog::getShowString(int64_t val, int pointflag) +{ + double value = val; + + if (pointflag < 0) + { + pointflag = 0; + } + else if (pointflag > 5) + { + pointflag = 5; + } + + for (int i = 1; i < pointflag; i++) + { + value /= 10; + } + + QString str; + if (pointflag == 0) + { + str.sprintf("%.0f", value); + } + else if (pointflag == 1) + { + str.sprintf("%.0f", value); + str += "."; + } + else if (pointflag == 2) + { + str.sprintf("%.1f", value); + } + else if (pointflag == 3) + { + str.sprintf("%.2f", value); + } + else if (pointflag == 4) + { + str.sprintf("%.3f", value); + } + else // if (pointflag >= 5) + { + str.sprintf("%.4f", value); + } + return str; +} + +QString NumerInputDialog::getShowStringPublic(int64_t val, int pointflag) +{ + double value = val; + + if (pointflag < 0) + { + pointflag = 0; + } + else if (pointflag > 5) + { + pointflag = 5; + } + + for (int i = 1; i < pointflag; i++) + { + value /= 10; + } + + QString str; + if (pointflag == 0) + { + str.sprintf("%.0f", value); + } + else if (pointflag == 1) + { + str.sprintf("%.0f", value); + str += "."; + } + else if (pointflag == 2) + { + str.sprintf("%.1f", value); + } + else if (pointflag == 3) + { + str.sprintf("%.2f", value); + } + else if (pointflag == 4) + { + str.sprintf("%.3f", value); + } + else // if (pointflag >= 5) + { + str.sprintf("%.4f", value); + } + return str; +} + +int NumerInputDialog::checkValueRange(int64_t val, int pointflag) +{ + int i, xsws; + int64_t min, max; + min = m_min; + max = m_max; + + xsws = pointflag - 1; + if (xsws < 0) + { + xsws = 0; + } + xsws = m_afterPoint - xsws; + if (xsws < 0) + { + xsws = 0; + } + + for (i = 0; i < xsws; i++) + { + min /= 10; + max /= 10; + } + + if (val < min || val > max) + { + return 1; + } + return 0; +} + +int64_t NumerInputDialog::fixValue(int64_t val, int pointflag) +{ + int i, xsws; + int64_t min, max; + min = m_min; + max = m_max; + + xsws = pointflag - 1; + if (xsws < 0) + { + xsws = 0; + } + xsws = m_afterPoint - xsws; + if (xsws < 0) + { + xsws = 0; + } + + for (i = 0; i < xsws; i++) + { + min /= 10; + max /= 10; + } + + if (val < min) + { + val = min; + } + if (val > max) + { + val = max; + } + + return val; +} + +int NumerInputDialog::getPointMuti(int pointflag) +{ + int muti = 1; + for (int i = 1; i < pointflag; i++) + { + muti *= 10; + } + return muti; +} + +void NumerInputDialog::showValue() +{ + ui->labelValue->setText(getShowString(m_value, m_pointFlag)); + + QString str = ui->labelValue->text(); + + // 修复判断数值范围时,无法正确区分小数点的问题 + int val = m_value; + int i; + if (m_pointFlag <= 1) + { + for (i=0; i 0 && val >= m_min && val <= m_max) + { + ui->buttonOk->setEnabled(true); + } + else + { + ui->buttonOk->setEnabled(false); + } +} + +void NumerInputDialog::showRange() +{ + QString min, max, def; + + if (m_afterPoint == 0) + { + min = getShowString(m_min, 0); + max = getShowString(m_max, 0); + def = getShowString(m_defVal, 0); + } + else + { + min = getShowString(m_min, m_afterPoint+1); + max = getShowString(m_max, m_afterPoint+1); + def = getShowString(m_defVal, m_afterPoint+1); + } + + QString rangeStr = "(" + min + "~" + max + ")" + m_unitStr; + ui->labelRange->setText(rangeStr); +} + +void NumerInputDialog::addNum(int num) +{ + if (((m_pointFlag < 5) && + ((m_afterPoint == 0) || (m_pointFlag < m_afterPoint + 1)) && + ((m_value > -100000000) && (m_value < 100000000)) && // 修复数值太大时显示错乱的问题 + 1 ) || + (m_defFlag == 0) || + 0 ) + { + int64_t val; + int pflag; + + if (m_defFlag == 0) + {// 第一次按数字键,从0开始计数,解决每次修改值之前都需要按C键的问题 + m_value = 0; + m_pointFlag = 0; + m_defFlag = 1; + } + val = m_value; + pflag = m_pointFlag; + + if (num < 0) + { + num = 0; + } + else if (num > 9) + { + num = 9; + } + + val *= 10; + val += num*((m_value<0)?-1:1); + + if (pflag != 0) + { + pflag++; + if (pflag > 5) + { + pflag = 5; + } + } + + //if (checkValueRange(val, pflag) == 0) + { + m_value = val; + m_pointFlag = pflag; + } + } +} + +void NumerInputDialog::changeValue(int weights) +{ + int64_t val; + //int pflag; + + val = m_value; + + m_defFlag = 0; // 初始值 + if (weights > -1 && weights < 1) // 小数 + { + + } + + //pflag = m_pointFlag; + val += weights*getPointMuti(m_pointFlag); + + //if (checkValueRange(val, pflag) == 0) + { + // val = fixValue(val, m_pointFlag); + // if (val != m_value) + { + m_value = val; + showValue(); + } + } +} + +//初始化窗体 +void NumerInputDialog::initDialog() +{ + setTitleStr(""); + m_value = 0; + m_min = 0; + m_max = 0; + m_afterPoint = 0; + m_defVal = 0; + m_defFlag = 0; + m_pointFlag = 0; + m_unitStr.clear(); + + m_leftNumberBtnList.clear(); + m_leftNumberBtnList.append(ui->buttonPlusMinus); + m_leftNumberBtnList.append(ui->buttonClean); + m_leftNumberBtnList.append(ui->buttonDelete); + m_leftNumberBtnList.append(ui->buttonNum7); + m_leftNumberBtnList.append(ui->buttonNum8); + m_leftNumberBtnList.append(ui->buttonNum9); + m_leftNumberBtnList.append(ui->buttonNum4); + m_leftNumberBtnList.append(ui->buttonNum5); + m_leftNumberBtnList.append(ui->buttonNum6); + m_leftNumberBtnList.append(ui->buttonNum1); + m_leftNumberBtnList.append(ui->buttonNum2); + m_leftNumberBtnList.append(ui->buttonNum3); + m_leftNumberBtnList.append(ui->buttonNum00); + m_leftNumberBtnList.append(ui->buttonNum0); + m_leftNumberBtnList.append(ui->buttonPoint); + + m_rightNumberBtnList.clear(); + m_rightNumberBtnList.append(ui->buttonDec1000); + m_rightNumberBtnList.append(ui->buttonInc1000); + m_rightNumberBtnList.append(ui->buttonDec100); + m_rightNumberBtnList.append(ui->buttonInc100); + m_rightNumberBtnList.append(ui->buttonDec10); + m_rightNumberBtnList.append(ui->buttonInc10); + m_rightNumberBtnList.append(ui->buttonDec1); + m_rightNumberBtnList.append(ui->buttonInc1); + m_rightNumberBtnList.append(ui->buttonDec01); + m_rightNumberBtnList.append(ui->buttonInc01); +} + +//初始化窗体控件,包括位置、尺寸、样式 +void NumerInputDialog::initControl() +{ + if(g_emTheme == theme2) + { + //根据不同分辨率设置控件的位置和尺寸 + initResolution_BlueVer(); + } + else + { + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体分辨率 +void NumerInputDialog::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + this->resize(584*scaleX,448*scaleY); + this->move((1024*scaleX-this->width())/2,(600*scaleY-this->height())/2); + + ui->frameBack->setGeometry(0,0,584*scaleX,448*scaleY); + ui->labelTitle->setGeometry(0*scaleX,0,584*scaleX,44*scaleY); + ui->labelValue->setGeometry(22*scaleX,74*scaleY,310*scaleX,44*scaleY); + ui->labelRange->setGeometry(340*scaleX,74*scaleY,224*scaleX,44*scaleY); + + for(int i = 0; i < 5; i++) + { + for(int j = 0; j < 3; j ++) + { + m_leftNumberBtnList[i*3+j]->setGeometry(23*scaleX+j*107*scaleX,129*scaleY+i*52*scaleY,96*scaleX,40*scaleY); + } + } + + for(int i = 0; i < 5; i++) + { + for(int j = 0; j < 2; j ++) + { + if(g_emResolut == resolution0804) + { + m_rightNumberBtnList[i*2+j]->setGeometry((344+j*120)*scaleX,(129+i*52)*scaleY,96*scaleX,40*scaleY); + } + else + { + m_rightNumberBtnList[i*2+j]->setGeometry((364+j*107)*scaleX,(129+i*52)*scaleY,96*scaleX,40*scaleY); + } + } + } + + ui->buttonOk->setGeometry(365*scaleX,389*scaleY,96*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(471*scaleX,389*scaleY,96*scaleX,40*scaleY); + if(g_emResolut == resolution0804) + { + ui->buttonOk->setGeometry(344*scaleX,389*scaleY,96*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(464*scaleX,389*scaleY,96*scaleX,40*scaleY); + } +} + +//初始化窗体控件为任意分辨率 +void NumerInputDialog::initResolution() +{ +#define FRAME_LEFT (203) // 小窗口 +#define FRAME_TOP (59) +#define FRAME_WIGHT (620) +#define FRAME_HEIGHT (479) + +#define TITLE_HEIGHT (46) // 标题栏高度 +#define TITLE_LEFT (367) // 分栏左 + +#define NUM_LEFT (21) // 数值左 +#define NUM_TOP (84) // 数值 +#define NUM_WIGHT (324) // 数值宽度 +#define NUM_HEIGHT (42) // 数值高度 + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + int xval = 0; + int xval2 = 0; + if(g_emResolut == resolution0804) + { + xval = 20; + xval2 = 4; + } + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX+xval,GLB_SCR_HEIGHT*factoryY); + + ui->labelTitle->setGeometry((FRAME_LEFT+GLB_EDGE_WIGHT)*factoryX,(FRAME_TOP+(TITLE_HEIGHT-GLB_TEXT_HEIGHT)/2-6)*factoryY,(FRAME_WIGHT-GLB_TAB_WIGHT*2)*factoryX,(GLB_TEXT_L_HEIGHT+xval2)*factoryY); + ui->labelValue->setGeometry((FRAME_LEFT+NUM_LEFT+GLB_TAB_WIGHT-xval)*factoryX,(FRAME_TOP+NUM_TOP+GLB_ICON_TEXT - xval +xval2*5)*factoryY,(NUM_WIGHT-GLB_TAB_WIGHT*2+2*xval)*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelRange->setGeometry((FRAME_LEFT+TITLE_LEFT+xval)*factoryX,(FRAME_TOP+NUM_TOP+NUM_HEIGHT-GLB_TEXT_HEIGHT - 2*xval + xval/2 +xval2*8)*factoryY,(FRAME_WIGHT-TITLE_LEFT-GLB_TAB_WIGHT)*factoryX,GLB_TEXT_HEIGHT*factoryY); + + int bgX,bgY; + bgX = FRAME_LEFT + NUM_LEFT; + bgY = FRAME_TOP + NUM_TOP+NUM_HEIGHT + GLB_EDGE_WIGHT; + + for(int i = 0; i < 5; i++) + { + for(int j = 0; j < 3; j ++) + { + m_leftNumberBtnList[i*3+j]->setGeometry(((bgX+j*(GLB_LBUT_WIGHT +GLB_BAS_WIGHT+xval2)+xval2))*factoryX,(bgY+i*(GLB_LBUT_HEIGHT + GLB_BAS_WIGHT))*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + } + } + + double val = 0; + + bgX = FRAME_LEFT + TITLE_LEFT + GLB_EDGE_WIGHT; + for(int i = 0; i < 5; i++) + { + for(int j = 0; j < 2; j ++) + { + if(j == 1) + { + if(g_emResolut == resolution0804) + { + val = 0.01; + } + } + else + { + val = 0; + } + m_rightNumberBtnList[i*2+j]->setGeometry((bgX+j*(GLB_LBUT_WIGHT +GLB_BAS_WIGHT))*(factoryX+val),(bgY+i*(GLB_LBUT_HEIGHT + GLB_BAS_WIGHT))*factoryY,GLB_LBUT_WIGHT*(factoryX),GLB_LBUT_HEIGHT*factoryY); + } + } + + ui->buttonOk->setGeometry((bgX+0*(GLB_LBUT_WIGHT +GLB_BAS_WIGHT))*factoryX,(bgY+5*(GLB_LBUT_HEIGHT + GLB_BAS_WIGHT)+GLB_BAS_WIGHT)*factoryY, + GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + if(g_emResolut == resolution0804) + { + val = 0.01; + } + ui->buttonCancel->setGeometry((bgX+1*(GLB_LBUT_WIGHT +GLB_BAS_WIGHT))*(factoryX+val),(bgY+5*(GLB_LBUT_HEIGHT + GLB_BAS_WIGHT)+GLB_BAS_WIGHT)*factoryY, + GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + +} + +//初始化窗体控件样式 +void NumerInputDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + if(g_emTheme == theme2) + { + ui->frameBack->setStyleSheet(frameBackStyle()); + ui->labelTitle->setStyleSheet(titleTextColour2()); + }else + { + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->labelTitle->setStyleSheet(transparentStyle()); + } + for(int i = 0; i < m_leftNumberBtnList.size(); i++) + { + m_leftNumberBtnList[i]->setStyleSheet(numButtonStyle()); + m_leftNumberBtnList[i]->setFont(fontSize_M()); + } + + for(int i = 0; i < m_rightNumberBtnList.size(); i++) + { + m_rightNumberBtnList[i]->setStyleSheet(numButtonStyle()); + m_rightNumberBtnList[i]->setFont(fontSize_M()); + } + + ui->labelTitle->setFont(fontSize_L()); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); + + ui->labelValue->setStyleSheet(numValue()); + ui->labelValue->setFont(fontSize_L()); + + ui->labelRange->setStyleSheet(noteTextColour()); + ui->labelRange->setFont(fontSize_M()); + ui->labelRange->setAlignment(Qt::AlignLeft); + ui->labelRange->setAlignment(Qt::AlignVCenter); + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + +//设置标题 +void NumerInputDialog::setTitleStr(QString str) +{ + ui->labelTitle->setText(str); +} + +void NumerInputDialog::setUnitStr(QString str) +{ + m_unitStr = str; + // showRange(); +} + +void NumerInputDialog::setValueAndRange(int64_t val, int64_t min, int64_t max, int afterpoint, int defen, int64_t defvalue) +{ + m_value = val; + m_min = min; + m_max = max; + m_afterPoint = afterpoint; + + if (m_min < -999999999) + { + m_min = -999999999; // 这个值看起来更舒服些 + } + if (m_max > 999999999) + { + m_max = 999999999; // 这个值看起来更舒服些 + } + if (m_min > m_max) + { + double tmp = m_min; + m_min = m_max; + m_max = tmp; + } + + if (m_afterPoint < 0) + { + m_afterPoint = 0; + } + if (m_afterPoint > 4) + { + m_afterPoint = 4; + } + + if (m_value < m_min) + { + m_value = m_min; + } + if (m_value > m_max) + { + m_value = m_max; + } + + if (m_afterPoint != 0) + { + m_pointFlag = m_afterPoint + 1; + } + else + { + m_pointFlag = 0; + } + + m_defFlag = defen; + m_defVal = defvalue; + + showRange(); + showValue(); +} + +int64_t NumerInputDialog::getValue() +{ + int i, j; + int64_t val = m_value; + i = m_pointFlag; + j = m_afterPoint; + if (j != 0) + { + j += 1; + } + + while (i < j) + { + if (i != 0) + { + val *= 10; + } + i++; + } + + return val; +} + +void NumerInputDialog::on_buttonClean_clicked() +{ + m_pointFlag = 0; + m_value = 0; + m_defFlag = 0; + showValue(); +} + +void NumerInputDialog::on_buttonNum00_clicked() +{ + addNum(0); + addNum(0); + showValue(); +} + +void NumerInputDialog::on_buttonDelete_clicked() +{ + m_defFlag = 1; + + if (m_pointFlag != 1) + { + int64_t val; + int pflag; + val = m_value; + pflag = m_pointFlag; + val /= 10; + pflag--; + if (pflag < 0) + { + pflag = 0; + } + //if (checkValueRange(val, pflag) == 0) + { + m_value = val; + } + } + if (m_pointFlag != 0) + { + m_pointFlag--; + } + showValue(); +} + +void NumerInputDialog::on_buttonNum7_clicked() +{ + addNum(7); + showValue(); +} + +void NumerInputDialog::on_buttonNum8_clicked() +{ + addNum(8); + showValue(); +} + +void NumerInputDialog::on_buttonNum9_clicked() +{ + addNum(9); + showValue(); +} + +void NumerInputDialog::on_buttonNum4_clicked() +{ + addNum(4); + showValue(); +} + +void NumerInputDialog::on_buttonNum5_clicked() +{ + addNum(5); + showValue(); +} + +void NumerInputDialog::on_buttonNum6_clicked() +{ + addNum(6); + showValue(); +} + +void NumerInputDialog::on_buttonNum1_clicked() +{ + addNum(1); + showValue(); +} + +void NumerInputDialog::on_buttonNum2_clicked() +{ + addNum(2); + showValue(); +} + +void NumerInputDialog::on_buttonNum3_clicked() +{ + addNum(3); + showValue(); +} + +void NumerInputDialog::on_buttonPlusMinus_clicked() +{ + int64_t val; + val = m_value; + val *= -1; + //if (checkValueRange(val, m_pointFlag) == 0) + { + m_value = val; + showValue(); + } +} + +void NumerInputDialog::on_buttonNum0_clicked() +{ + addNum(0); + showValue(); +} + +void NumerInputDialog::on_buttonPoint_clicked() +{ + if (m_pointFlag == 0 && m_afterPoint != 0) + { + m_pointFlag = 1; + showValue(); + } +} + +void NumerInputDialog::on_buttonDec1000_clicked() +{ + changeValue(-1000); +} + +void NumerInputDialog::on_buttonInc1000_clicked() +{ + changeValue(1000); +} + +void NumerInputDialog::on_buttonDec100_clicked() +{ + changeValue(-100); +} + +void NumerInputDialog::on_buttonInc100_clicked() +{ + changeValue(100); +} + +void NumerInputDialog::on_buttonDec10_clicked() +{ + changeValue(-10); +} + +void NumerInputDialog::on_buttonInc10_clicked() +{ + changeValue(10); +} + +void NumerInputDialog::on_buttonDec1_clicked() +{ + changeValue(-1); +} + +void NumerInputDialog::on_buttonInc1_clicked() +{ + changeValue(1); +} + +void NumerInputDialog::on_buttonDec01_clicked() +{ + if (m_afterPoint != 0) + { + + m_defFlag = 0; + int64_t val; + int pflag, muti; + + int dir; + int weights = -1; + muti = 1; + + //dir = m_value > 0 ? 1:-1; + dir = m_value > 0 ? 1:1; + val = m_value; + pflag = m_pointFlag; + + if (m_pointFlag <= 1) // 是整数 + { + val *= 10; + pflag = 2; // 转换为1位小数 + } + else // 小数 + { + for (int i = 2; i < m_pointFlag; i++) + { + muti *= 10; + } + } + + val += weights * dir * muti; + + //if (checkValueRange(val, pflag) == 0) + { + // val = fixValue(val, pflag); + m_value = val; + m_pointFlag = pflag; + showValue(); + } + } +} + +void NumerInputDialog::on_buttonInc01_clicked() +{ + if (m_afterPoint != 0) + { + + m_defFlag = 0; + int64_t val; + int pflag, muti; + int dir; + int weights = 1; + + //dir = m_value > 0 ? 1:-1; + dir = m_value > 0 ? 1:1; + muti = 1; + + val = m_value; + pflag = m_pointFlag; + + if (m_pointFlag <= 1) // 是整数 + { + val *= 10; + pflag = 2; // 转换为1位小数 + } + else // 小数 + { + + for (int i = 2; i < m_pointFlag; i++) + { + muti *= 10; + } + } + + val += weights * dir * muti; + + //if (checkValueRange(val, pflag) == 0) + { + // val = fixValue(val, pflag); + m_value = val; + m_pointFlag = pflag; + showValue(); + } + } +} + +void NumerInputDialog::on_buttonOk_clicked() +{ + done(1); +} + +void NumerInputDialog::on_buttonCancel_clicked() +{ + done(0); +} diff --git a/sharedviews/numerinputdialog.h b/sharedviews/numerinputdialog.h new file mode 100644 index 0000000..69bf219 --- /dev/null +++ b/sharedviews/numerinputdialog.h @@ -0,0 +1,104 @@ +#ifndef NUMERINPUTDIALOG_H +#define NUMERINPUTDIALOG_H + +#include +#include "mybutton.h" +#include "setcontrolstyle.h" + +#define NUM_BAK_LAG 100 // 数据撤销次数 + +namespace Ui { +class NumerInputDialog; +} + +class NumerInputDialog : public QDialog +{ + Q_OBJECT + +public: + explicit NumerInputDialog(QWidget *parent = 0); + ~NumerInputDialog(); + + QString getShowStringPublic(int64_t val, int pointflag); + +private: + Ui::NumerInputDialog *ui; + +private: + int64_t m_value; + int64_t m_min; + int64_t m_max; + int m_afterPoint; + int64_t m_defVal; + +private: + int m_defFlag; + int m_pointFlag; // 小数点标志 + QString m_unitStr; + QList m_leftNumberBtnList; + QList m_rightNumberBtnList; + +private: + int64_t m_valuebak[NUM_BAK_LAG]; // 数值恢复备份 + int m_pointFlagbak[NUM_BAK_LAG]; // 小数点恢复备份 + int m_bakIdx; // 数组索引 + +private: + QString getShowString(int64_t val, int pointflag); + int checkValueRange(int64_t val, int pointflag); + int64_t fixValue( int64_t val, int pointflag); + int getPointMuti(int pointflag); + void showValue(); + void showRange(); + void addNum(int num); + void changeValue(int weights); + + void bakValue(); // 备份撤销数据 + void chkbakValue(); // 校验备份撤销数据 + void rebakValue(); // 恢复备份撤销数据 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + + void initControlStyle_BlueVer(); + void initResolution_BlueVer(); +public: + void initDialog();//初始化窗体 + void setTitleStr(QString str);//设置标题 + void setUnitStr(QString str); + void setValueAndRange(int64_t val, int64_t min, int64_t max, int afterpoint, int defen = 0, int64_t defvalue = 1); + int64_t getValue(); + +private slots: + void on_buttonClean_clicked(); + void on_buttonNum00_clicked(); + void on_buttonDelete_clicked(); + void on_buttonNum7_clicked(); + void on_buttonNum8_clicked(); + void on_buttonNum9_clicked(); + void on_buttonNum4_clicked(); + void on_buttonNum5_clicked(); + void on_buttonNum6_clicked(); + void on_buttonNum1_clicked(); + void on_buttonNum2_clicked(); + void on_buttonNum3_clicked(); + void on_buttonPlusMinus_clicked(); + void on_buttonNum0_clicked(); + void on_buttonPoint_clicked(); + void on_buttonDec1000_clicked(); + void on_buttonInc1000_clicked(); + void on_buttonDec100_clicked(); + void on_buttonInc100_clicked(); + void on_buttonDec10_clicked(); + void on_buttonInc10_clicked(); + void on_buttonDec1_clicked(); + void on_buttonInc1_clicked(); + void on_buttonDec01_clicked(); + void on_buttonInc01_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); +}; + +#endif // NUMERINPUTDIALOG_H diff --git a/sharedviews/numerinputdialog.ui b/sharedviews/numerinputdialog.ui new file mode 100644 index 0000000..0575d22 --- /dev/null +++ b/sharedviews/numerinputdialog.ui @@ -0,0 +1,1052 @@ + + + NumerInputDialog + + + + 0 + 0 + 545 + 467 + + + + Dialog + + + + + 120 + 116 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + C + + + false + + + + + + 340 + 114 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -1000 + + + false + + + + + + 440 + 408 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 440 + 114 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + +1000 + + + false + + + + + + 340 + 288 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -1 + + + false + + + + + + 220 + 232 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 6 + + + false + + + + + + 119 + 174 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 8 + + + false + + + + + + 330 + 70 + 131 + 21 + + + + + + + (0~3000)rmp + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 440 + 230 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + +10 + + + false + + + + + + 20 + 348 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 00 + + + false + + + + + + 220 + 174 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 9 + + + false + + + + + + 22 + 64 + 284 + 44 + + + + background-color: rgb(255, 255, 255); + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 440 + 172 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + +100 + + + false + + + + + + 440 + 288 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + +1 + + + false + + + + + + 220 + 348 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 340 + 172 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -100 + + + false + + + + + + 119 + 232 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 5 + + + false + + + + + + 340 + 408 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 18 + 174 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 7 + + + false + + + + + + 18 + 232 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 4 + + + false + + + + + + 0 + 0 + 545 + 48 + + + + + + + Number input + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 220 + 116 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 18 + 116 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -/+ + + + false + + + + + + 119 + 290 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 2 + + + false + + + + + + 119 + 348 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 0 + + + false + + + + + + 18 + 290 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 1 + + + false + + + + + + 440 + 346 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + +0.1 + + + false + + + + + + 220 + 290 + 92 + 50 + + + + + 61 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + 3 + + + false + + + + + + 340 + 346 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -0.1 + + + false + + + + + + 340 + 230 + 92 + 50 + + + + + 90 + 10 + + + + + 200 + 80 + + + + Qt::NoFocus + + + + + + -10 + + + false + + + + + + 0 + 0 + 545 + 467 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + frameBack + buttonClean + buttonDec1000 + buttonCancel + buttonInc1000 + buttonDec1 + buttonNum6 + buttonNum8 + labelRange + buttonInc10 + buttonNum00 + buttonNum9 + labelValue + buttonInc100 + buttonInc1 + buttonPoint + buttonDec100 + buttonNum5 + buttonOk + buttonNum7 + buttonNum4 + labelTitle + buttonDelete + buttonPlusMinus + buttonNum2 + buttonNum0 + buttonNum1 + buttonInc01 + buttonNum3 + buttonDec01 + buttonDec10 + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/parametersetdialog.cpp b/sharedviews/parametersetdialog.cpp new file mode 100644 index 0000000..06ad201 --- /dev/null +++ b/sharedviews/parametersetdialog.cpp @@ -0,0 +1,2231 @@ +#include "parametersetdialog.h" +#include "ui_parametersetdialog.h" + +ParameterSetDialog::ParameterSetDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ParameterSetDialog), + m_itemPerPage(8) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + this->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + m_setedFlag = 0; + m_rootCurPage = 0; + + //获取网卡ID + m_networkCardID.clear(); + QList interfaces = QNetworkInterface::allInterfaces(); + if(interfaces.size() == 1) + { + QNetworkInterface item = interfaces.at(0); + m_networkCardID = item.hardwareAddress(); + } + else + { + int nCnt = interfaces.count(); + for(int i = 0; i < nCnt; i++) + { + //QNetworkInterface item = interfaces.at(i); + //m_networkCardID = item.hardwareAddress(); + + // 如果此网络接口被激活并且正在运行并且不是回环地址,则就是我们需要找的Mac地址 + if(interfaces[i].flags().testFlag(QNetworkInterface::IsUp) && + interfaces[i].flags().testFlag(QNetworkInterface::IsRunning) && + !interfaces[i].flags().testFlag(QNetworkInterface::IsLoopBack)) + { + m_networkCardID = interfaces[i].hardwareAddress(); + qDebug()<button1); + m_itemBtnList.append(ui->button2); + m_itemBtnList.append(ui->button3); + m_itemBtnList.append(ui->button4); + m_itemBtnList.append(ui->button5); + + ui->button6->setVisible(true);//显示 + ui->button7->setVisible(true); + ui->button8->setVisible(true); + m_itemBtnList.append(ui->button6); + m_itemBtnList.append(ui->button7); + m_itemBtnList.append(ui->button8); + + ui->button9->setVisible(false); + ui->button10->setVisible(false); + ui->button11->setVisible(false); + ui->button12->setVisible(false); + + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void ParameterSetDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->frameRightUp->setGeometry(0*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_MICON_SIZE)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonParaRestore->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_MICON_SIZE))*factoryX,0*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonReturn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_MICON_SIZE*2))*factoryX,0*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + + //内容的位置 + QRect rectName(GLB_TAB_WIGHT*factoryX,GLB_ICON_TEXT*factoryY,(GLB_PARA_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_LBUT_HEIGHT*factoryY); + QRect rectValue(GLB_TAB_WIGHT*factoryX,GLB_ICON_TEXT*factoryY,(GLB_PARA_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_LBUT_HEIGHT*factoryY); + for(int i = 0; i < m_itemPerPage; i++)//白色按下的效果 + { + m_itemBtnList[i]->setGeometry(GLB_PARA_LEFT*factoryX,(GLB_PARA_TOP + i * GLB_PARA_HEIGHT +3)*factoryY,GLB_PARA_WIGHT*factoryX,(GLB_PARA_HEIGHT-3)*factoryY); + m_itemBtnList[i]->initLeftNameRightValue(rectName,rectValue,1); + } + + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY, (GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); +} + +//初始化窗体分辨率 +void ParameterSetDialog::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,336*scaleX,24*scaleY); + + ui->frameRightUp->setGeometry(590*scaleX,4*scaleY,440*scaleX,61*scaleY); + ui->buttonReturn->setGeometry(370*scaleX,0,50*scaleX,50*scaleY); + + QRect rectName(40*scaleX,0,400*scaleY,46*scaleY); + QRect rectValue(460*scaleX,0,220*scaleX,46*scaleY); + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList[i]->setGeometry(148*scaleX,(100 + i * 48)*scaleY,718*scaleX,48*scaleY); + m_itemBtnList[i]->initLeftNameRightValue(rectName,rectValue,1); + } + + ui->framePageBtn->setGeometry(584*scaleX,530*scaleY,427*scaleX,40*scaleY); + ui->labelPage->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(0,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonOk->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); +} + +//初始化窗体控件样式 +void ParameterSetDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(commonTextColour()); + //右上方 + ui->frameRightUp->setStyleSheet(transparentStyle()); + ui->buttonParaRestore->setStyleSheet(backIconStyle()); + ui->buttonParaRestore->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonParaRestore->objectName())); + ui->buttonReturn->setStyleSheet(backIconStyle());; + ui->buttonReturn->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonReturn->objectName())); + + //条目 + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList[i]->setLabelFont(fontSize_M()); + // m_itemBtnList[i]->setStyleSheet(commonTextColour()); + } + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + +void ParameterSetDialog::refreshUi() +{ + ui->buttonOk->setVisible(true);//再进入界面时,刷新界面确认按钮就显示 + ui->labelRepetitions->setVisible(false);//先隐藏 + + if(m_paraType == PARA_TYPE_HMICONFIGURATION)//等于界面配置 + { + refreshProductType();//刷新产品类型 + } + + if (m_itemList.size() <= 0)//参数列表 + { + for (int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList.at(i)->hide(); + } + ui->labelPage->setText(tr("PageNum: 0/0")); + ui->buttonPgUp->setEnabled(false); + ui->buttonPgDn->setEnabled(false); + ui->buttonOk->setEnabled(false); + ui->frameRightUp->setVisible(false); + + return;//下边的代码不执行 + } + + if(m_itemPerPage <= 0) + { + return; + } + + ui->buttonOk->setEnabled(true); + QString split1 = ":"; + QString split2 = ";"; + QString str; + + //----------- + int itemNum, pageNums; + itemNum = m_itemList.size();//列表总个数 + pageNums = (itemNum+m_itemPerPage-1) / m_itemPerPage;//一共有的页数 + + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + if (m_rootCurPage > pageNums) // 当前页 + { + m_rootCurPage = pageNums; + } + if (m_rootCurPage <= 1) + { + m_rootCurPage = 1; + } + + } + else + { + if (m_curPage > pageNums) // 当前页 + { + m_curPage = pageNums; + } + if (m_curPage <= 1) + { + m_curPage = 1; + } + } + + // 条目信息 + int i, itemidx; + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + itemidx = (m_rootCurPage-1) * m_itemPerPage; + } + else + { + itemidx = (m_curPage-1) * m_itemPerPage; + } + + + for (i = 0; i < m_itemPerPage; i++) + { + if (itemidx < m_itemList.size()) + { + const ParaItem & item = m_itemList.at(itemidx); + + if (item.readonly != 0) // 只读,不能设置 + { + m_itemBtnList.at(i)->show(); + m_itemBtnList.at(i)->setEnabled(false); + } + else + { + //超级用户选择工作参数开关型后回到遍历设置会显示开关,以下代码隐藏开关 + if(item.valueType == PARA_VALUE_TYPE_CLICK) + { + m_itemBtnList.at(i)->setLabelValueImage(""); + } + m_itemBtnList.at(i)->show(); + m_itemBtnList.at(i)->setEnabled(true); + } + + m_itemBtnList.at(i)->setLabelName(item.paraName); + + if (item.valueType == PARA_VALUE_TYPE_INT) // = 1, 数字输入型 + { + str = getValueStr(item.value, item.afterPoint);//显示的是默认参数 + str += " " + item.unitStr; + // qDebug()<< item.value << item.afterpoint << item.unitstr; + m_itemBtnList.at(i)->setLabelValue(str);//设置参数显示的值,没连上就显示的默认参数 + m_itemBtnList.at(i)->show(); + } + else if (item.valueType == PARA_VALUE_TYPE_SW) // = 2, 开关选择型 + { + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + QString path; + path = setControlStyle.getBottomStyleSheet1(""); + + if (item.value != 0)//打开 + { + path += "switchOn_logo.png"; + } + else + { + path += "switchOff_logo.png"; + } + + m_itemBtnList.at(i)->setLabelValueImage(path); + } + else if (item.valueType == PARA_VALUE_TYPE_LIST) // = 3, 列表选择型 + { + QStringList vallist; + if(item.selList.indexOf(split1) == -1) + { + // 没找到 二级分割 + vallist = item.selList.split(split2, QString::SkipEmptyParts); + if (vallist.size() <= 0) + { + str = ""; + } + else + { + int selIdx = item.selIdx; + if (selIdx < 0) + { + selIdx = 0; + } + if (selIdx >= vallist.size()) + { + selIdx = vallist.size() - 1; + } + str = vallist.at(selIdx); + } + } + else + { + // 二级分割 + vallist = item.selList.split(split2, QString::SkipEmptyParts); + if (vallist.size() <= 0) + { + str = ""; + } + else + { + int miniIndex = vallist.first().split(split1, QString::SkipEmptyParts).at(1).toInt(); + int maxIndex = vallist.last().split(split1, QString::SkipEmptyParts).at(1).toInt(); + + //int selIdx = item.value; + int selIdx = item.selIdx; + if (selIdx < miniIndex) + { + selIdx = miniIndex; + } + if (selIdx >= maxIndex) + { + selIdx = maxIndex; + } + for (int var = 0; var < vallist.size(); ++var) + { + QStringList sublist = vallist.at(var).split(split1, QString::SkipEmptyParts); + if(sublist.at(1).toInt() == selIdx) + { + str = sublist.at(0); + } + } + } + } + if((m_paraType == PARA_TYPE_PATTERN && item.indexInPara == SET_ROTATESTYLE) || //旋转式样 + (m_paraType == PARA_TYPE_PATTERN && item.indexInPara == SET_HORIZONTALSTYLE) || //水平翻转 + (m_paraType == PARA_TYPE_PATTERN && item.indexInPara == SET_VERTICALSTYLE)) //垂直翻转 + { + //旋转式样加载P的图片 + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + QString path = setControlStyle.getSharedBottomStyleSheet("") + str + "_logo.png"; + if(g_emResolut == resolution1910) + { + m_itemBtnList.at(i)->setLabelValueImage(path,32,32); + } + else + { + m_itemBtnList.at(i)->setLabelValueImage(path); + } + } + else + { + m_itemBtnList.at(i)->setLabelValue(str); + } + } + else if (item.valueType == PARA_VALUE_TYPE_STRINPUT) // = 4, 字符串输入型 + { + str = item.valueStr; + m_itemBtnList.at(i)->setLabelValue(str); + m_itemBtnList.at(i)->show(); + } + else // = 0, 无值 + { + m_itemBtnList.at(i)->setLabelValue(""); + } + itemidx++; + } + else + { + m_itemBtnList.at(i)->setEnabled(false); + m_itemBtnList.at(i)->hide(); + } + } + + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + // 超级用户界面按钮 + if (m_rootCurPage <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + + if (m_rootCurPage >= pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + } + else + { + // 按钮 + if (m_curPage <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + + if (m_curPage >= pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + } + + // 页信息 + QString strPage; + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + strPage = tr("pageNum: ") + QString("%1/%2").arg(m_rootCurPage).arg(pageNums);//页数: + } + else + { + strPage = tr("pageNum: ") + QString("%1/%2").arg(m_curPage).arg(pageNums);//页数: + } + + ui->labelPage->setText(strPage); + + if(m_paraType == PARA_TYPE_ROOT) + { + //ui->buttonOk->setEnabled(false); + ui->buttonOk->setEnabled(true);//增加了界面调试模式,超级用户界面按钮可用 + } + + if(m_paraType == PARA_TYPE_MACH || + m_paraType == PARA_TYPE_WORK)//机头板参数或换色板参数或机器参数或工作参数(机器参数或工作参数为超级用户目录下的) + { + ui->frameRightUp->setVisible(true); + ui->buttonParaRestore->setVisible(true);//恢复默认参数按钮 + if(g_emMacType==MACHINE_FLYSHUTTLE) + { + ui->buttonParaRestore->setVisible(false);//恢复默认参数按钮 + } + ui->buttonReturn->setVisible(true);//返回上一级按钮或重置反复绣次数 + } + else if( m_paraType == PARA_TYPE_HMICONFIGURATION||//界面配置 + m_paraType == PARA_TYPE_IOTCONFIGURATION //物联网配置 + ) + { + ui->frameRightUp->setVisible(true); + ui->buttonParaRestore->setVisible(false); + ui->buttonReturn->setVisible(true);//返回上一级按钮 + } + else + { + ui->frameRightUp->setVisible(false); + } + //超级用户界面配置 + if(m_paraType == PARA_TYPE_HMICONFIGURATION) + { + ui->buttonOk->setEnabled(true); + } +} + +QString ParameterSetDialog::getValueStr(int64_t val, int afterpoint) +{ + QString str; + double value = val; + if (afterpoint <= 0) + { + str.sprintf("%.0f", value); + } + else if (afterpoint == 1) + { + value /= 10; + str.sprintf("%.1f", value); + } + else if (afterpoint == 2) + { + value /= 100; + str.sprintf("%.2f", value); + } + else if (afterpoint == 3) + { + value /= 1000; + str.sprintf("%.3f", value); + } + else // if (afterpoint >= 4) + { + value /= 10000; + str.sprintf("%.4f", value); + } + return str; +} + +void ParameterSetDialog::changeValue(int buttenidx) +{ +#if(0) + //等于机器参数或工作参数 + if(((m_paraType & PARA_TYPE_MACH) == PARA_TYPE_MACH) || + ((m_paraType & PARA_TYPE_WORK) == PARA_TYPE_WORK)) + { + if(g_emUser != repair)//权限不够先登录 + { + emit siUserLogin(repair); + if(g_emUser != repair)//发送登录信号后,权限如果还没改变就返回 + return; + } + } +#endif + + QString split1 = ":"; + QString split2 = ";"; + + if (buttenidx < 0 || buttenidx >= m_itemPerPage) + { + return ; + } + + int itemidx; + int selIdx = 0; + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + itemidx = (m_rootCurPage-1) * m_itemPerPage; + } + else + { + itemidx = (m_curPage-1) * m_itemPerPage; + } + + itemidx += buttenidx; + + if (itemidx < m_itemList.size()) + { + int chgflag = 0; + QString newStrValue; + const ParaItem & item = m_itemList.at(itemidx); + const s32 oldValue = item.value;//等于这个列表现在的值 + s32 newvalue = item.value;//等于这个列表现在的值 + newStrValue = item.valueStr; + + if (item.valueType == PARA_VALUE_TYPE_INT) // 数字型 + { + int rslt; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(item.paraName); + ndlg.setUnitStr(item.unitStr); + ndlg.setValueAndRange(item.value, item.minVal, item.maxVal, item.afterPoint); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != newvalue) + { + if(item.paraType == PARA_TYPE_PATTERN) + { + if((item.indexInPara == SET_SCANX)||(item.indexInPara == SET_SCANY))//更改后的值不等于之前存的值 + { + if(getItemValue(SET_EQUAL) == 1) + { //等比缩放 调整x或y之后自动调整另一个的比例 + s32 x1 = getItemValue(SET_SCANX); //缩放x + s32 y1 = getItemValue(SET_SCANY); //缩放y + float pro = (float)x1/y1; + if(item.indexInPara == SET_SCANX)//缩放x + { + s32 y = (1/pro)*val; + setItemValue(SET_SCANY, y);//缩放y + }else if(item.indexInPara == SET_SCANY)//缩放y + { + s32 x = pro*val; + setItemValue(SET_SCANX, x);//缩放x + }; + } + else + { + if(item.indexInPara == SET_SCANX)//缩放x + { + setItemValue(SET_SCANX, val);//缩放x + }else if(item.indexInPara == SET_SCANY)//缩放y + { + setItemValue(SET_SCANY, val);//缩放y + }; + } + } + } + + chgflag = 1; + newvalue = val; + } + } + } + else if (item.valueType == PARA_VALUE_TYPE_SW) // 开关型 + { + if (oldValue == 0) + { + newvalue = 1; + } + else + { + newvalue = 0; + } + chgflag = 1; + } + else if (item.valueType == PARA_VALUE_TYPE_LIST) + { + QStringList vallist; + + if(item.selList.indexOf(split2) == -1) + { //没找到 二级分割 + vallist = item.selList.split(split1, QString::SkipEmptyParts); + if (vallist.size() > 0) + { + selIdx = item.selIdx + 1; + if (selIdx < 0) + { + selIdx = 0; + } + if (selIdx >= vallist.size()) // 循环选择 + { + selIdx = 0; + } + chgflag = 1; + } + } + else + { + //二级分割 注意 key 是 int val是字符串 + //分清楚 key 并不是 字符串的index 需要区分 + vallist = item.selList.split(split2, QString::SkipEmptyParts); + if (vallist.size() <= 0) + { + return; + } + else + { + // 使用 qmap 组成key: val + int miniVal = vallist.first().split(split1, QString::SkipEmptyParts).at(1).toInt(); + int maxVal = vallist.last().split(split1, QString::SkipEmptyParts).at(1).toInt(); + QMap seachDat ; + + for (int var = 0; var < vallist.size(); ++var) + { + QStringList mapDatList = vallist.at(var).split(split1, QString::SkipEmptyParts); + seachDat.insert(mapDatList.at(1).toInt(),mapDatList.at(0)); + } + + selIdx = item.selIdx; + + if(seachDat.contains(selIdx)) + { + //存在这个key + + } + else + { + //不存在这个key 用默认值存储 + selIdx = item.defValue; + } + + //找到下一个val vallist seach_dat + + for (int var = 0; var < vallist.size(); ++var) + { + if( vallist.at(var).split(split1, QString::SkipEmptyParts).at(1).toInt() == selIdx) + { + var++ ; + if( var >= vallist.size()) + { + var = 0 ; + } + selIdx = vallist.at(var).split(split1, QString::SkipEmptyParts).at(1).toInt(); + break; + } + } + if (selIdx < miniVal) + { + selIdx = miniVal; + } + if (selIdx > maxVal) + { + selIdx = maxVal; + } + chgflag = 1; + } + } + } + else if (item.valueType == PARA_VALUE_TYPE_STRINPUT) // 字符输入型 + { + PassWordDialog passWordDlg(this); + QString str(""); + passWordDlg.setTitleStr(tr("Input"),-1);//输入 + passWordDlg.setShowIfVisible(true); + int rslt = passWordDlg.exec(); + if(rslt == 1) + { + str = passWordDlg.getInputStr(); + if (str != item.valueStr) + { + chgflag = 1; + newStrValue = str; + } + } + } + else if (item.valueType == PARA_VALUE_TYPE_CLICK) // 点击触发型 + { + s16 fun = item.indexInPara; + execItemClickEvent(fun); + return; + } + + if (chgflag != 0) + { + if(item.valueType == PARA_VALUE_TYPE_LIST) + { + m_itemList[itemidx].selIdx = selIdx; + m_itemList[itemidx].value = selIdx; + } + else if(item.valueType == PARA_VALUE_TYPE_STRINPUT) + { + m_itemList[itemidx].valueStr = newStrValue; + } + else + { + m_itemList[itemidx].value = newvalue;//列表里的值等于弹窗输入的值 + + } + // qDebug()<< " newvalue " << newvalue; + refreshUi();//在这个函数里刷新 + } + } +} + +//刷新参数值 +void ParameterSetDialog::refreshValue() +{ + m_mcParaValues = m_mcParaValues; + m_wkParaValues = m_wkParaValues; + + for (int i = 0; i < m_itemList.size(); i++) + { + int type = m_itemList[i].paraType; + int idx = m_itemList.at(i).indexInPara; + int bitInWord = m_itemList[i].bitInWord; + s32 mcTempValue = m_mcParaValues.buf[idx]; + s32 wkTempValue = m_wkParaValues.buf[idx]; + + if (idx < PARA_NUM) + { + if (type == PARA_TYPE_MACH) + { + // ljs++ + if (bitInWord == 0) + { + m_itemList[i].value = mcTempValue;//列表里的值,变成主控里的值 + if(m_itemList[i].valueType == PARA_VALUE_TYPE_LIST) + { + m_itemList[i].selIdx = mcTempValue; + } + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if ((mcTempValue & bitval) == 0) + { + m_itemList[i].selIdx = 0; + m_itemList[i].value = 0; + } + else + { + m_itemList[i].selIdx = 1; + m_itemList[i].value = 1; + } + } + } + else if (type == PARA_TYPE_WORK) + { + // ljs++ + if (bitInWord == 0) + { + m_itemList[i].value = wkTempValue; + if(m_itemList[i].valueType == PARA_VALUE_TYPE_LIST) + { + m_itemList[i].selIdx = wkTempValue; + } + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if ((wkTempValue & bitval) == 0) + { + m_itemList[i].selIdx = 0; + m_itemList[i].value = 0; + } + else + { + m_itemList[i].selIdx = 1; + m_itemList[i].value = 1; + } + } + } + } + } +} + +//收到下位机参数改变信号的槽 +void ParameterSetDialog::paraChange(int type, int id) +{ + //点了主板的按钮后,现在这个g_pMachine就是对应主板的 + if (type == SEW_MCPARA_MACH) + { + if (id == 0) + { //得到当前主板的参数 + memcpy(&m_mcParaValues, &g_pMachine->getMcPara(), sizeof(ParaStruct)); + + m_setedFlag |= 0x01;//当前的主板 收到参数包 的标志改变 + } + } + else if (type == SEW_MCPARA_WORK) + { + if (id == 0) + { + memcpy(&m_wkParaValues, &g_pMachine->getWkPara(), sizeof(ParaStruct)); + m_setedFlag |= 0x02; + } + } + + m_mcParaValues = m_mcParaValues; + m_wkParaValues = m_wkParaValues; + + //等于机器参数或工作参数 + if(((m_paraType & PARA_TYPE_MACH) == PARA_TYPE_MACH) || + ((m_paraType & PARA_TYPE_WORK) == PARA_TYPE_WORK)) + { + if (m_setedFlag == 0x03)// = 0x03就是机器参数和主控参数都读过 + { + if (m_itemList.size() > 0)//参数列表 + { + ui->buttonOk->setEnabled(true);//如果从下位机得到了数据包,说明与下位机建立了联系。可以点击确认按钮 + } + refreshValue(); + refreshUi(); + } + } +} + +void ParameterSetDialog::saveParas(int idx) +{ + qDebug()<<"step 1"; + if (m_setedFlag == 0x03 && + (m_paraType == (PARA_TYPE_MACH | PARA_TYPE_WORK) || + m_paraType == PARA_TYPE_MACH || m_paraType == PARA_TYPE_WORK)) + { + int size = m_itemList.size(); + if (idx < 0) + { + int i; + for (i = 0; i < size; i++) + { + int id = m_itemList.at(i).indexInPara; + int type = m_itemList.at(i).paraType; + int bitInWord = m_itemList.at(i).bitInWord; + int value = m_itemList.at(i).value; + if (id < PARA_NUM && type == PARA_TYPE_MACH) + { + if (bitInWord == 0) // ljs++ + { + m_mcParaValues.buf[id] = m_itemList.at(i).value; + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if (value == 0) + { + m_mcParaValues.buf[id] &= ~bitval; + } + else + { + m_mcParaValues.buf[id] |= bitval; + } + } + } + } + + qDebug()<<"step 2"; +#if(0) + for(int i = 0; i < MACHINE_NUMBER; i++) + { + g_pMachine[i]->setMcPara(&m_mcParaValues); + } +#endif + //当前主板的g_pMachine + g_pMachine->setMcPara(&m_mcParaValues); + qDebug()<<"step 3"; + + for (i = 0; i < size; i++) + { + int id = m_itemList.at(i).indexInPara; + int type = m_itemList.at(i).paraType; + int bitInWord = m_itemList.at(i).bitInWord; + int value = m_itemList.at(i).value; + if (id < PARA_NUM && type == PARA_TYPE_WORK) + { + if (bitInWord == 0) // ljs++ + { + m_wkParaValues.buf[id] = m_itemList.at(i).value; + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if (value == 0) + { + m_wkParaValues.buf[id] &= ~bitval; + } + else + { + m_wkParaValues.buf[id] |= bitval; + } + } + } + } + + qDebug()<<"step 4"; +#if(0) + for(int i = 0; i < MACHINE_NUMBER; i++) + { + g_pMachine[i]->setWkPara(&m_wkParaValues); + } +#endif + g_pMachine->setWkPara(&m_wkParaValues); + g_pSettings->writeOneToIniFile("FlatPanel/WorkPointX", m_wkParaValues.buf[109]); + g_pSettings->writeOneToIniFile("FlatPanel/WorkPointY", m_wkParaValues.buf[110]); + qDebug()<<"step 5"; + } + else if (idx < size) + { + int id = m_itemList.at(idx).indexInPara; + int type = m_itemList.at(idx).paraType; + int value = m_itemList.at(idx).value; + int bitInWord = m_itemList.at(idx).bitInWord; // ljs++ + if (id < PARA_NUM && type == PARA_TYPE_MACH) + { + if (bitInWord == 0) + { + m_mcParaValues.buf[id] = value; + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if (value == 0) + { + m_mcParaValues.buf[id] &= ~bitval; + } + else + { + m_mcParaValues.buf[id] |= bitval; + } + value = m_mcParaValues.buf[id]; + } + + qDebug()<<"step 6"; +#if(0) + for(int i = 0; i < MACHINE_NUMBER; i++) + { + g_pMachine[i]->setAMcPara(id+1, value); + } +#endif + g_pMachine->setAMcPara(id+1, value); + qDebug()<<"step 7"; + } + else if (id < PARA_NUM && type == PARA_TYPE_WORK) + { + if (bitInWord == 0) + { + m_wkParaValues.buf[id] = value; + } + else + { + u32 bitval = 0x01; + bitval <<= (bitInWord - 1); + if (value == 0) + { + m_wkParaValues.buf[id] &= ~bitval; + } + else + { + m_wkParaValues.buf[id] |= bitval; + } + value = m_wkParaValues.buf[id]; + } + + qDebug()<<"step 8"; +#if(0) + for(int i = 0; i < MACHINE_NUMBER; i++) + { + g_pMachine[i]->setAWkPara(id+1, value); + } +#endif + g_pMachine->setAWkPara(id+1, value); + qDebug()<<"step 9"; + } + } + } +} + +//执行点击触发型参数的触发事件 +void ParameterSetDialog::execItemClickEvent(s16 fun) +{ + g_pMachine->getParasFromMachine();//读取参数 + + switch (fun) + { + case ROOT_HMICONFIGURATION://进入界面配置 + setMainTitle(tr("HMI Configuration")); + setSubTitle(tr("Root > HMI Configuration")); + //得到界面配置列表 + if(g_emDebugMode == nodebugMode) + { + if(g_emUser == root) + setItemList(root,PARA_TYPE_HMICONFIGURATION);//最高权限 + } + else + { + setItemList(root,PARA_TYPE_HMICONFIGURATION);//最高权限 + } + //设置参数值 + setItemValue(ROOT_RESOLUTION,g_emResolut); //分辨率 + setItemValue(SET_CONNECTMODE,g_pSettings->readFromIniFile("HMI/connectMode").toInt()); + setItemValue(ROOT_MACTYPE,g_emMacType); //机器类型 + setItemValue(ROOT_PRODUCTTYPE,g_emProductType); //产品类型 + setItemValue(ROOT_SHUTTLECHANGE,g_pSettings->readFromIniFile("HMI/shuttleChange").toInt());//自动换梭 + setItemValue(ROOT_WATERMARKSET,g_pSettings->readFromIniFile("HMI/waterMark").toInt()); + setItemValue(ROOT_WIFI,g_pSettings->readFromIniFile("HMI/wifi").toInt()); + setItemValue(ROOT_PARASORTSET,g_pSettings->readFromIniFile("HMI/paraSort").toInt()); + setItemValue(ROOT_MAXSPEED_MAINSEWWORK,g_pSettings->readFromIniFile("MaxSpeedOfMainSewWork").toInt()); + + refreshUi(); + break; + + case ROOT_IOTCONFIGURATION: //物联网配置 + setMainTitle(tr("IOT Configuration")); + setSubTitle(tr("Root > IOT Configuration")); + + setItemList(root,PARA_TYPE_IOTCONFIGURATION);//最高权限 +// //设置参数值 + setItemValue(ROOT_GATEWAYCONNECTIONMETHOD,g_pSettings->readFromIniFile("IOT/gatewayConnectMode").toInt()); //网关连接 + setItemValue(ROOT_RACKNUMBERINPUT,g_pSettings->readFromIniFile("IOT/rackNumber").toInt());//机架号 + setItemStr(ROOT_DELIVERYTIME,g_pSettings->readFromIniFile("IOT/deliveryTime").toString()); //工厂预计交货时间 + setItemValue(ROOT_DEBUGPROGRESS,g_pSettings->readFromIniFile("IOT/debugProgress").toInt());//调试进度 + refreshUi(); + break; + + case ROOT_NETWORKSETTINGS: //网络设置 + setMainTitle(tr("Network Settings")); + setSubTitle(tr("IOT Configuration > Network Settings")); + setGatewayNetworkItemList(PARA_TYPE_NETWORKSETTINGS); + + refreshUi(); + break; + + case ROOT_MACHINEPARA://加载机器参数 + //也用此窗体加载参数 + setMainTitle(tr("Machine parameters")); + setSubTitle(tr("Root > Machine parameters")); + //机器参数 + if(g_emUser == root || g_emDebugMode == debugMode) + { + setItemList(g_emUser,PARA_TYPE_MACH);//二级权限 262574 + } + if(m_setedFlag == 0x03)//如果有从下位机得到过参数包 + { + refreshValue();//不管连没连上,都显示上次保存的值 + } + if(g_pMachine->isConnected() == 3) + { + if(m_setedFlag != 0x03)//界面上显示已就绪 但是没有从下位机得到过参数包(刚上电时) + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("read parameter..."));//读取参数中... + dlg.exec(); + } + } + else + { +#ifdef Q_OS_LINUX//为了方便windows下查看参数所以加了linux编译条件 + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("No connection")); + dlg.exec(); + done(0); +#endif + } + refreshUi(); + break; + + case ROOT_WORKPARA://加载工作参数 + //也用此窗体加载参数 + setMainTitle(tr("Work parameters")); + setSubTitle(tr("Root > Work parameters")); + //工作参数 + if(g_emUser == root || g_emDebugMode == debugMode) + { + setItemList(root,PARA_TYPE_WORK);//二级权限 262574 + } + + if(m_setedFlag == 0x03)//如果有从下位机得到过参数包 + { + refreshValue();//不管连没连上,都显示上次保存的值 + } + if(g_pMachine->isConnected() == 3) + { + if(m_setedFlag != 0x03)//界面上显示已就绪 但是没有从下位机得到过参数包(刚上电时) + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("read parameter..."));//读取参数中... + dlg.exec(); + } + } + else + { +#ifdef Q_OS_LINUX//为了方便windows下查看参数所以加了linux编译条件 + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("No connection")); + dlg.exec(); + done(0); +#endif + } + refreshUi(); + break; + + case ROOT_HMIDECRYPT://界面解密 + emit siHMIDecrypt(m_networkCardID); + break; + + case ROOT_CLEARPATTERN://花样总清 + emit siPatternClear(); + break; + + case ROOT_CHANGEPASSWORD://修改一级密码 + emit siChangePassword(); + break; + + case ROOT_DELETEINI://删除配置文件 + emit siDeleteIni();//删除执行目录下的config + break; + + case ROOT_DEBUGMODE://界面进入调试模式 + emit siDebugMode(); + break; + + case ROOT_DELETE_DEF_PATH://删除默认文件路径 + g_pSettings->writeOneToIniFile("Pattern/name",""); + break; + + case PSE_SOFTWAREPARA_IMPORTPARA://参数导入 + emit siParameterImport(); + break; + + case PSE_SOFTWAREPARA_EXPORTPARA://参数导出 + emit siParameterExport(); + break; + + case PSE_SOFTWAREPARA_HMIUPDATE://界面升级 + emit siHMIUpgrade(); + break; + + case PSE_SOFTWAREPARA_MCUPDATE://主控升级 + emit siMCUpgrade(); + break; + case PSE_SOFTWAREPARA_EXIT://退出程序 + emit siExit(); + break; + default: + break; + } +} + +void ParameterSetDialog::initData() +{ + m_curPage = 0; + m_rootCurPage = 0; + m_paraType = 0; //参数类型(机器参数、工作参数、花样参数等) + m_paraTypeSort = 0; //参数类型分类型(动作参数、位置参数、亮片参数等) + m_itemList.clear(); + m_allItemList.clear(); + + if (m_setedFlag == 0) + { + memset(m_mcParaValues.buf, 0, sizeof(ParaStruct)); + memset(m_wkParaValues.buf, 0, sizeof(ParaStruct)); + } + + m_filePath.clear(); +} + +//设置类型图标 +void ParameterSetDialog::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +//设置主title +void ParameterSetDialog::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +//设置副title +void ParameterSetDialog::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +//(参数权限、参数类型、参数种类)得到相应参数类型列表 +// sort参数分类的小分类 +void ParameterSetDialog::setItemList(int authority,int64_t type,int64_t sort) +{ + m_paraType = type; + m_paraTypeSort = sort; + m_itemList.clear();//最后筛选出的列表 + + //参数筛选 + for(int i = 0; i < m_allItemList.size(); i++) + { + int aType= m_allItemList.at(i).paraType; + int aAuthority = m_allItemList.at(i).authority; + + if((aType & type) == aType) + { + int aSort= m_allItemList.at(i).paraTypeSort; + if(sort == -1)//等于-1加载全部 + { + //外边传进来的权限 root 加载所有 + if(authority == root) + { + m_itemList.append(m_allItemList.at(i)); + } + else + { //当前列表里的权限 等于 传进来的权限 + if(aAuthority <= authority)//参数权限 + { + m_itemList.append(m_allItemList.at(i)); + } + } + } + else + { + if((aSort & sort)== sort)//参数类型 + { + if(authority == root)//最高参数权限 + { + m_itemList.append(m_allItemList.at(i)); + } + else + { + if(aAuthority <= authority)//参数权限 + { + m_itemList.append(m_allItemList.at(i)); + } + } + } + } + } + } + + //超级用户 + if(type == PARA_TYPE_ROOT) + { + int value = g_pSettings->readFromIniFile("HMI/splitStep").toInt(); + for(int i = 0; ireadFromIniFile("HMI/splitStep").toInt(); + if(value == 0) + { + for(int i = 0; iapplicationDirPath()); + //服务器IP及端口设置 + int idx = 0; + QString configfile = apppath.path() + apppath.separator() + "lotconfig.ini"; + QSettings configIni(configfile, QSettings::IniFormat); + + QString serverip = configIni.value("server/ip", QVariant("8.130.165.100")).toString(); + ParaItem slpItem; + slpItem.indexInPara = idx++; + slpItem.readonly = 0; + slpItem.valueType = PARA_VALUE_TYPE_STRINPUT; + slpItem.paraName = tr("LOT Server IP settings"); //服务器IP设置; + slpItem.valueStr = serverip; + m_itemList.append(slpItem); + + quint16 serverport = configIni.value("server/port", QVariant(9014)).toInt(); + ParaItem sPortItem; + sPortItem.indexInPara = idx++; + sPortItem.readonly = 0; + sPortItem.valueType = PARA_VALUE_TYPE_INT; + sPortItem.paraName = tr("LOT Server Port settings") ;//服务器端口设置 + sPortItem.value = serverport; + sPortItem.minVal = 0; + sPortItem.maxVal = U16_MAX; + sPortItem.defValue = serverport; + m_itemList.append(sPortItem); + + //本地IP设置条目 + QString localip = configIni.value("local/ip", QVariant("192.168.110.79")).toString(); + ParaItem lIpItem; + lIpItem.indexInPara = idx++; + lIpItem.readonly = 0; + lIpItem.valueType = PARA_VALUE_TYPE_STRINPUT; + lIpItem.paraName = tr("LOT Local IP settings");//本地IP设置 + lIpItem.valueStr = localip; + m_itemList.append(lIpItem); + + quint16 localport = configIni.value("local/port", QVariant(5000)).toInt(); + ParaItem lPortItem; + lPortItem.indexInPara = idx++; + lPortItem.readonly = 0; + lPortItem.valueType = PARA_VALUE_TYPE_INT; + lPortItem.paraName = tr("LOT Local Port settings");//本口端口设置 + lPortItem.value = localport; + lPortItem.minVal = 0; + lPortItem.maxVal = U16_MAX; + lPortItem.defValue = localport; + m_itemList.append(lPortItem); +} + +//设置网络参数(IP和端口) +void ParameterSetDialog::setNetworkItemList(int64_t type) +{ + m_paraType = type; + m_itemList.clear(); + + QDir apppath(qApp->applicationDirPath()); + QString serverip,localip; + quint16 serverport,localport; + //服务器IP及端口设置条目(包括网关) + int idx = 0; + QString configfile; + configfile = apppath.path() + apppath.separator() + "mcconfig.ini";//读取的配置文件名字 + QSettings configIni(configfile, QSettings::IniFormat); + serverip = configIni.value("server/ip", QVariant("192.168.16.253")).toString();//把配置文件里的号转换成字符串 + localip = configIni.value("local/ip", QVariant("192.168.16.41")).toString(); + + ParaItem sIpItem; + sIpItem.indexInPara = idx++; + sIpItem.readonly = 0; + sIpItem.valueType = PARA_VALUE_TYPE_STRINPUT; + sIpItem.paraName = tr("Board IP settings");//主板IP设置 + sIpItem.valueStr = serverip;//列表里的值就显示从配置文件读上来的 + m_itemList.append(sIpItem);//把这行加到列表里 + + serverport = configIni.value("server/port", QVariant(5000)).toInt(); + ParaItem sPortItem; + sPortItem.indexInPara = idx++; + sPortItem.readonly = 0; + sPortItem.valueType = PARA_VALUE_TYPE_INT; + sPortItem.paraName = tr("Board port settings");//主板端口设置 + sPortItem.value = serverport; + sPortItem.minVal = 0; + sPortItem.maxVal = U16_MAX; + sPortItem.defValue = serverport; + m_itemList.append(sPortItem); + + //本地IP设置条目 + ParaItem lIpItem; + lIpItem.indexInPara = idx++; + lIpItem.readonly = 0; + lIpItem.valueType = PARA_VALUE_TYPE_STRINPUT; + lIpItem.paraName = tr("Local IP settings");//本地IP设置 + lIpItem.valueStr = localip; + m_itemList.append(lIpItem); + + //本地端口设置条目 + localport = configIni.value("local/port", QVariant(5000)).toInt(); + ParaItem lPortItem; + lPortItem.indexInPara = idx++; + lPortItem.readonly = 0; + lPortItem.valueType = PARA_VALUE_TYPE_INT; + lPortItem.paraName = tr("Local port settings");//本地端口设置 + lPortItem.value = localport; + lPortItem.minVal = 0; + lPortItem.maxVal = U16_MAX; + lPortItem.defValue = 5000; + m_itemList.append(lPortItem); +} + +void ParameterSetDialog::setCurPage(int idx) +{ + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + m_rootCurPage = idx; + } + else + { + m_curPage = idx; + } +} + +//设置参数值 +void ParameterSetDialog::setItemValue(int idx,int value,s16 flag) +{ + //筛选参数 + for(int i = 0; i < m_itemList.size(); i++) + { + int index = m_itemList.at(i).indexInPara; + long long min = m_itemList.at(i).minVal; + long long max = m_itemList.at(i).maxVal; + + if(idx == index)//参数枚举 + { + if((value > max || value < min) && flag == 0) + { + value = m_itemList.at(i).defValue; + } + else + { + m_itemList[i].value = value; + if(flag == 1 && value == 0 && m_itemList[i].minVal > value) + { + m_itemList[i].minVal = 0; + } + } + if(m_itemList.at(i).valueType == 3) + m_itemList[i].selIdx = value; + } + } +} + +void ParameterSetDialog::setItemStr(int idx, QString str) +{ + for(int i = 0; i < m_itemList.size(); i++) + { + int index = m_itemList.at(i).indexInPara; + + if(idx == index) + { + m_itemList[i].valueStr = str; + } + } +} + +int ParameterSetDialog::getItemValue(int idx) +{ + int value = 0; + for(int i = 0; i < m_itemList.size(); i++) + { + if(idx == m_itemList.at(i).indexInPara) + { + value = m_itemList.at(i).value; + } + } + return value; +} + +int ParameterSetDialog::exec() +{ + //等于机器参数或工作参数 + if(((m_paraType & PARA_TYPE_MACH) == PARA_TYPE_MACH) || + ((m_paraType & PARA_TYPE_WORK) == PARA_TYPE_WORK)) + { + if (g_pMachine != NULL) + { + qDebug("send GetParasFromMachine"); + + if(m_setedFlag == 0x03)//如果有从下位机得到过参数包 + { + //这个函数会把从主控得到的参数保存在item.value里 + refreshValue();//不管连没连上,都显示上次保存的值,多主板保存各自主板的值 + } + + if(g_pMachine->isConnected() == 3)//这个isConnected检测机制是5秒 + { + if(((m_paraType & PARA_TYPE_MACH) == PARA_TYPE_MACH) || + ((m_paraType & PARA_TYPE_WORK) == PARA_TYPE_WORK)) + { + // 多主板的之前就设置好了g_pMachine 点哪个按钮,就用向哪个主板获取参数 + g_pMachine->getParasFromMachine();//如果连上了主板,发送一个读取参数信息的包 + } + if(m_setedFlag != 0x03)//界面上显示已就绪 但是没有从下位机得到过参数包(刚上电时) + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("read parameter..."));//读取参数中... + dlg.exec(); + return -1; + } + } + else//如果没连接上 + { + if(g_emMacType == MACHINE_CUTTINGWALK + && g_emDebugMode == nodebugMode) + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("No connection")); + dlg.exec(); + return -1; + } +#ifdef Q_OS_LINUX//为了方便windows下查看参数所以加了linux编译条件 + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Network error")); + dlg.setContentStr(tr("No connection")); + dlg.exec(); + return -1; + //不进行下边的函数 +#endif + } + } + } + + refreshUi();//没连接主板的时候就先进到这个函数,就会显示的默认参数 + return QDialog::exec(); +} + +int ParameterSetDialog::addParaItem(const QList &itemList) +{ + int size = m_allItemList.size(); + m_allItemList.append(itemList); + return size; +} + +int ParameterSetDialog::addParaItem(const ParaItem &item) +{ + int size = m_allItemList.size(); + m_allItemList.append(item); + return size; +} + +void ParameterSetDialog::on_button1_clicked() +{ + changeValue(0); +} + +void ParameterSetDialog::on_button2_clicked() +{ + changeValue(1); +} + +void ParameterSetDialog::on_button3_clicked() +{ + changeValue(2); +} + +void ParameterSetDialog::on_button4_clicked() +{ + changeValue(3); +} + +void ParameterSetDialog::on_button5_clicked() +{ + changeValue(4); +} + +void ParameterSetDialog::on_button6_clicked() +{ + changeValue(5); +} + +void ParameterSetDialog::on_button7_clicked() +{ + changeValue(6); +} + +void ParameterSetDialog::on_button8_clicked() +{ + changeValue(7); +} + +void ParameterSetDialog::on_button9_clicked() +{ + changeValue(8); +} + +void ParameterSetDialog::on_button10_clicked() +{ + changeValue(9); +} + +void ParameterSetDialog::on_button11_clicked() +{ + changeValue(10); +} + +void ParameterSetDialog::on_button12_clicked() +{ + changeValue(11); +} + +void ParameterSetDialog::on_buttonPgUp_clicked() +{ + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + m_rootCurPage--; + } + else + { + m_curPage--; + } + + refreshUi(); +} + +void ParameterSetDialog::on_buttonPgDn_clicked() +{ + if(m_paraType == PARA_TYPE_ROOT)//等于超级用户界面 + { + m_rootCurPage++; + } + else + { + m_curPage++; + } + refreshUi(); +} + +void ParameterSetDialog::on_buttonOk_clicked() +{ + PromptDialog promptDlg(this); + qDebug()<<"para ok 1"; + + //等于机器参数或工作参数 + if(((m_paraType & PARA_TYPE_MACH) == PARA_TYPE_MACH) || + ((m_paraType & PARA_TYPE_WORK) == PARA_TYPE_WORK)) + { + qDebug()<<"para ok mach"; + saveParas(); + } + + //等于软件设置参数 + if((m_paraType & PARA_TYPE_SOFTWARESET) == PARA_TYPE_SOFTWARESET) + { + qDebug()<<"para ok software"; + + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("The settings take effect after restarting the interface!");//重启界面后设置生效! + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + // g_emTheme = (Theme)(m_itemList.at((s16)SET_THEME).value);//主题 + int language = m_itemList.at((s16)SET_LANGUAGE).value; + g_pSettings->writeOneToIniFile("HMI/language",language); + g_pSettings->writeOneToIniFile("HMI/FrontSize",m_itemList.at((s16)SET_FONTSIZE).value); + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + qDebug()<<"reboot before"; + system("reboot"); + qDebug()<<"reboot end"; +#endif + } + + qDebug()<<"para ok 6"; + return; + } + + //等于网络管理参数 + if((m_paraType & PARA_TYPE_NETWORKSET) == PARA_TYPE_NETWORKSET) + { + qDebug()<<"para ok network"; + + //网络设置完成,需重启后重新建立连接 + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + QString str = tr("Network settings are completed, re-establish after reboot"); + promptDlg.setTitleStr(tr("Prompt")); + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + QDir apppath(qApp->applicationDirPath()); + + s16 idx = 0;//参数索引 + QString configfile; + configfile = apppath.path() + apppath.separator() + "mcconfig.ini"; + QSettings configIni(configfile, QSettings::IniFormat); + QString serverip = m_itemList.at(idx++).valueStr;//服务器IP + int serverport = m_itemList.at(idx++).value;//服务器端口 + // 回写参数 + configIni.setValue("server/ip", serverip); + configIni.setValue("server/port", serverport); + QString localip = m_itemList.at(idx++).valueStr;//本地IP + // 回写参数 + configIni.setValue("local/ip", localip); + int localport = m_itemList.at(idx++).value;//本地端口 + // 回写参数 + configIni.setValue("local/port", localport); +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + return; + } + + //等于网关网络设置参数 + if((m_paraType & PARA_TYPE_NETWORKSETTINGS) == PARA_TYPE_NETWORKSETTINGS) + { + qDebug()<<"para ok netsetting"; + //网络设置完成,需重启后重新建立连接 + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + QString str = tr("Network settings are completed, re-establish after reboot"); + promptDlg.setTitleStr(tr("Prompt")); + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + QDir apppath(qApp->applicationDirPath()); + + s16 idx =0; //参数索引 + QString configfile; + configfile = apppath.path() + apppath.separator() +"lotconfig.ini"; + QSettings configIni(configfile, QSettings::IniFormat); + + QString serverip = m_itemList.at(idx++).valueStr;//服务器IP + int serverport = m_itemList.at(idx++).value;//服务器端口 + QString localip = m_itemList.at(idx++).valueStr;//本地IP + int localport = m_itemList.at(idx++).value;//本地端口 + + // 回写参数 + configIni.setValue("server/ip", serverip); + configIni.setValue("server/port", serverport); + configIni.setValue("local/ip", localip); + configIni.setValue("local/port", localport); + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + return; + } + + //等于时间设置参数 + if((m_paraType & PARA_TYPE_TIMESET) == PARA_TYPE_TIMESET) + { + qDebug()<<"para ok time"; + int yearValue = m_itemList.at(0).value; + int monthValue = m_itemList.at(1).value; + int dayValue = m_itemList.at(2).value; + +#ifdef Q_OS_LINUX + int hourValue = m_itemList.at(3).value; + int minuteValue = m_itemList.at(4).value; + int secondValue = m_itemList.at(5).value; +#endif + + int temp = 0; + + //判断是否为闰年,闰年2月份是29天,其他是28天 + if((yearValue % 4 == 0) && (yearValue % 100 != 0)) + { + if(monthValue == 2) + { + if(dayValue > 29) + { + temp = -1; + } + } + } + else + { + if(monthValue == 2) + { + if(dayValue > 28) + { + temp = -1; + } + } + } + + //1、3、5、7、8、10、12是31天,其他是30天 + if(monthValue == 4 || monthValue == 6 || monthValue == 9 || monthValue == 11) + { + if(dayValue > 30) + { + temp = -1; + } + } + + QString showStr; + if(temp == 0) + { + //设置时间 +#ifdef Q_OS_LINUX + struct tm rtcTime; + rtcTime.tm_year = yearValue - 1900; + rtcTime.tm_mon = monthValue - 1; + rtcTime.tm_mday = dayValue; + rtcTime.tm_hour = hourValue; + rtcTime.tm_min = minuteValue; + rtcTime.tm_sec = secondValue; + rtcTime.tm_isdst = 0; + rtcTime.tm_yday = 0; + rtcTime.tm_wday = 0; + + int retval = hal_set_rtc_time(&rtcTime); + if(retval != 0) + { + qDebug("set_rtc_time failed: %d!", retval); + temp = -2; + } +#endif + //时间设置完成,重启后生效 + promptDlg.initDialog(PromptDialog::BTN_RESTART); + showStr = tr("The time setting is completed and will take effect after restart"); + } + else if(temp == -1) + { + //时间设置不合理,请重新设置 + promptDlg.initDialog(PromptDialog::BTN_OK); + showStr = tr("Unreasonable time setting, please reset"); + } + + if(temp == -2) + { + //时间设置失败,请重新设置 + promptDlg.initDialog(PromptDialog::BTN_OK); + showStr = tr("Time setting failed, please reset"); + } + + promptDlg.setTitleStr(tr("Prompt")); + promptDlg.setContentStr(showStr); + if(promptDlg.exec() == 1 && temp == 0) + { +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + return; + } + + //等于超级用户界面配置参数 + if((m_paraType & PARA_TYPE_HMICONFIGURATION) == PARA_TYPE_HMICONFIGURATION) + { + qDebug()<<"para ok 5"; + + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("The settings take effect after restarting the interface!");//重启界面后设置生效! + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + //重置初始花样 + g_pSettings->writeOneToIniFile("Pattern/name",""); + QMap settings; + //界面配置里的参数都放在了 点击触发型参数枚举 里,要筛选才能获取到相应的value值 + for(int i = 0; i < m_itemList.size(); i++) + { + if(m_itemList[i].indexInPara == ROOT_RESOLUTION) + { + g_emResolut = (Resolution)(m_itemList[i].value);//分辨率 + settings["HMI/resolution"] = g_emResolut; + } + else if (m_itemList[i].indexInPara == SET_CONNECTMODE) + { + int connectMode = (s16)m_itemList[i].value;//连接通讯方式 + settings["HMI/connectMode"] = connectMode; + } + + else if(m_itemList[i].indexInPara == ROOT_PRODUCTTYPE) + { + g_emProductType =(ProductType)(m_itemList[i].value);//产品类型 + settings["HMI/productType"] = g_emProductType; + } + + else if(m_itemList[i].indexInPara == ROOT_SHUTTLECHANGE) + { + s16 shuttleChange =(s16)(m_itemList[i].value);//自动换梭 + settings["HMI/shuttleChange"] = shuttleChange; + } + + else if(m_itemList[i].indexInPara == ROOT_WATERMARKSET) + { + s16 waterMark =(s16)(m_itemList[i].value);//主背景是否带水印 + settings["HMI/waterMark"] = waterMark; + } + else if(m_itemList[i].indexInPara == ROOT_WIFI) + { + s16 wifi =(s16)(m_itemList[i].value);//是否带wifi + settings["HMI/wifi"] = wifi; + } + + else if(m_itemList[i].indexInPara == ROOT_PARASORTSET) + { + s16 paraSort =(s16)(m_itemList[i].value);//参数是否分类显示 + settings["HMI/paraSort"] = paraSort; + } + else if(m_itemList[i].indexInPara == ROOT_MACTYPE) + { + g_emMacType = (MachineType)(m_itemList[i].value);//机器类型 + settings["HMI/machineType"] = g_emMacType; + } + else if(m_itemList[i].indexInPara == ROOT_MAXSPEED_MAINSEWWORK) + { + int maxSpeed = (s16)(m_itemList[i].value);//主轴缝纫工作最高转速 + settings["MaxSpeedOfMainSewWork"] = maxSpeed; + } + } + + g_pSettings->writeToIniFile(settings); + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + return; + } + + //等于超级用户物联网配置参数 + if((m_paraType & PARA_TYPE_IOTCONFIGURATION) == PARA_TYPE_IOTCONFIGURATION) + { + qDebug()<<"para ok 66"; + + QMap settings; + for(int i = 0; iwriteToIniFile(settings); + + //网关连接方式改变时需要提示重启 + s16 cFlag = 0; + for(int i = 0; ireadFromIniFile("IOT/gatewayConnectMode").toInt(); + int eVal = m_itemList[i].value;//网关连接方式 + if(bVal != eVal) + { + cFlag = 1; + } + break; + } + } + + if(cFlag == 1) + { + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + QString str; + str = tr("Connection mode changes, take effect after the reboot!");//连接方式改变,重启界面后生效! + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + for(int i = 0; iwriteOneToIniFile("IOT/gatewayConnectMode",gatewayConnect); + break; + } + } + +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif + } + return; + } + else + { + done(1); + } + } + + //超级用户密码权限,单次有效 + // g_emUser = operate; + + //等于超级用户参数 bingo + if((m_paraType & PARA_TYPE_ROOT) == PARA_TYPE_ROOT) + { + for(int i = 0; iwriteOneToIniFile("HMI/splitStep",value); + } + } + done(0); + } + + done(1);//0是关掉 + qDebug()<<"para ok 8"; +} + +void ParameterSetDialog::on_buttonCancel_clicked() +{ + //超级用户密码权限,单次有效 + // g_emUser = operate; + done(0); +} + +//恢复默认的参数 +void ParameterSetDialog::on_buttonParaRestore_clicked() +{ + int user = g_emUser; + //if(g_emDebugMode == nodebugMode) + { + if(g_emUser != resetpara)//权限不够先登录 + { + emit siUserLogin(resetpara); + if(g_emUser != resetpara)//发送登录信号后,权限如果还没改变就返回 + { + return; + } + } + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + if(m_paraType == PARA_TYPE_MACH || + m_paraType == PARA_TYPE_WORK) + { + promptDlg.setContentStr(tr("Whether to recover the default parameters for the board?"));//是否恢复为主板默认参数? + } + + if(promptDlg.exec() == 1) + { + if(g_pMachine != NULL) + { + if(m_paraType == PARA_TYPE_MACH || + m_paraType == PARA_TYPE_WORK)//设置主板默认参数 + { + g_pMachine->setToDefaultParas(UCMD_SET_DEF_PARA, 0); + } + } + } + } + g_emUser = (UserRoles)user; +} + +//返回上一级菜单 +void ParameterSetDialog::on_buttonReturn_clicked() +{ + if(g_emDebugMode == nodebugMode) + { + if(g_emUser == root) + { + setMainTitle(tr("Root")); + setSubTitle(tr("Accessibility > Root")); + //超级用户参数 + setItemList(g_emUser,PARA_TYPE_ROOT); + refreshUi(); + } + } + else + { + setMainTitle(tr("Root")); + setSubTitle(tr("Accessibility > Root")); + //超级用户参数 + setItemList(root,PARA_TYPE_ROOT); + refreshUi(); + } +} diff --git a/sharedviews/parametersetdialog.h b/sharedviews/parametersetdialog.h new file mode 100644 index 0000000..e7a4818 --- /dev/null +++ b/sharedviews/parametersetdialog.h @@ -0,0 +1,149 @@ +#ifndef PARAMETERSETDIALOG_H +#define PARAMETERSETDIALOG_H + +#include +#include +#include +#include +#include + +#include "items/paraitem.h" +#include "numerinputdialog.h" +#include "passworddialog.h" +#include "mybutton.h" +#include "promptdialog.h" +#include "setcontrolstyle.h" +#include "Lot/csvcode.h" + +#define TEST_EMBROIDERY 1 +#define TEST_PUNCH 2 + +//设置时间的头文件 +#ifdef Q_OS_LINUX +#include +#include +#endif + +namespace Ui { +class ParameterSetDialog; +} + +class ParameterSetDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ParameterSetDialog(QWidget *parent = 0); + ~ParameterSetDialog(); + +private: + Ui::ParameterSetDialog *ui; + + int m_itemPerPage;//界面每页条目数 + int m_curPage;//当前页数 + int m_rootCurPage;//超级用户界面当前页数 + QList m_itemBtnList; + QList m_itemList; + QList m_allItemList; + MCStatus m_mcStatus;//机器状态 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initResolution_BlueVer(); + void initControlStyle();//初始化窗体控件样式 + void refreshUi(); + +private: + QString getValueStr(int64_t val, int afterpoint); + void changeValue(int buttenidx); + void refreshValue(); + +public slots: + void paraChange(int type, int id); + +private: + void refreshSensorPara(int min, int max, int num, ParaItem &item, u32 traverseState ,int m_nodeType);//刷新信号参数显示 + void saveParas(int idx = -1); + void execItemClickEvent(s16 fun);//执行点击触发型参数的触发事件 + +private: + ParaStruct m_mcParaValues; + ParaStruct m_wkParaValues; + + int m_setedFlag; + int m_paraType; //参数类型(机器参数、工作参数、花样参数等) + int m_paraTypeSort; //参数类型分类 + QString m_networkCardID;//网卡ID(MAC地址) + + QString m_filePath;//配置文件 + bool isAuthority = true;//是否需要权限 + +public: + void initData(); + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + //(参数权限、参数类型、参数种类)得到相应参数类型列表,目前参数种类分类未使用 + void setItemList(int authority,int64_t type,int64_t sort = -1); + void refreshProductType();//刷新产品类型 + + //设置网络参数(IP和端口) + void setNetworkItemList(int64_t type); + + //设置网关网络参数(IP和端口) + void setGatewayNetworkItemList(int64_t type); + + void setCurPage(int idx);//设置当前页数 + void setItemValue(int idx,int value,s16 flag = 0);//设置int型参数值 + void setItemStr(int idx,QString str);//设置字符型参数值 + int getItemValue(int idx); + inline int getParaType(){return m_paraType;}//获取参数类型 + int exec(); + +public: + int addParaItem(const QList & itemList); + int addParaItem(const ParaItem & item); + +private slots: + void on_button1_clicked(); + void on_button2_clicked(); + void on_button3_clicked(); + void on_button4_clicked(); + void on_button5_clicked(); + void on_button6_clicked(); + void on_button7_clicked(); + void on_button8_clicked(); + void on_button9_clicked(); + void on_button10_clicked(); + void on_button11_clicked(); + void on_button12_clicked(); + + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + + void on_buttonParaRestore_clicked(); + void on_buttonReturn_clicked(); + +signals: + void siUserLogin(s16 user); + void siHMIDecrypt(QString id);//界面解密 + void siParameterImport(); + void siParameterExport(); + void siHMIUpgrade(); + void siMCUpgrade(); + void siExit();//退出程序 + void siChangePassword();//修改一级密码 + void siDeleteIni();//删除执行目录下的config.ini + void siImportCSV();//导入csv文件 + void siDeleteCSV();//删除csv文件 + void siResetCSV();//重置安装调试进度 + void siDebugMode();//界面调试模式 + void siPatternClear();//花样总清 + void siVerRecovery();//版本恢复 +}; + +#endif // PARAMETERSETDIALOG_H diff --git a/sharedviews/parametersetdialog.ui b/sharedviews/parametersetdialog.ui new file mode 100644 index 0000000..68e6692 --- /dev/null +++ b/sharedviews/parametersetdialog.ui @@ -0,0 +1,543 @@ + + + ParameterSetDialog + + + + 0 + 0 + 1024 + 600 + + + + Dialog + + + + + 140 + 200 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 30 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 20 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 1/1 + + + + + + 140 + 320 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 0 + 0 + 1024 + 600 + + + + background-color: rgb(182, 182, 182); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 140 + 80 + 760 + 32 + + + + Qt::NoFocus + + + Qt::LeftToRight + + + + + + + + + + + + 140 + 360 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 440 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 280 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 400 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 110 + 10 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title + + + + + + 140 + 240 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 120 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 680 + 570 + 321 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 240 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + buttonPgUp + buttonPgDn + buttonOk + buttonCancel + + + + + 140 + 160 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 480 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 520 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 40 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title < Title + + + + + + 430 + 10 + 581 + 51 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 500 + 10 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 420 + 10 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + + 330 + 20 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Repetitions + + + frameBack + buttonTypeLogo + labelPage + labelMainTitle + framePageBtn + labelSubTitle + button1 + button2 + button3 + button4 + button5 + button6 + button7 + button8 + button9 + button10 + button11 + button12 + frameRightUp + labelRepetitions + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/passworddialog.cpp b/sharedviews/passworddialog.cpp new file mode 100644 index 0000000..d53c1a0 --- /dev/null +++ b/sharedviews/passworddialog.cpp @@ -0,0 +1,283 @@ +#include "passworddialog.h" +#include "ui_passworddialog.h" + +PassWordDialog::PassWordDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PassWordDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + setAttribute(Qt::WA_TranslucentBackground, true);//设置窗体背景透明 + + initControl(); + m_inputStr.clear(); + m_ifShow = false; + m_cleanFlag = 0; + m_ipLength = 0; + refreshUi(); +} + +PassWordDialog::~PassWordDialog() +{ + delete ui; +} + +//初始化窗体控件,包括位置、尺寸、样式 +void PassWordDialog::initControl() +{ + m_NumerBtnlist.clear(); + m_NumerBtnlist.append(ui->buttonNum7); + m_NumerBtnlist.append(ui->buttonNum8); + m_NumerBtnlist.append(ui->buttonNum9); + m_NumerBtnlist.append(ui->buttonNum4); + m_NumerBtnlist.append(ui->buttonNum5); + m_NumerBtnlist.append(ui->buttonNum6); + m_NumerBtnlist.append(ui->buttonNum1); + m_NumerBtnlist.append(ui->buttonNum2); + m_NumerBtnlist.append(ui->buttonNum3); + m_NumerBtnlist.append(ui->buttonNum0); + + for(int var = 0; var < m_NumerBtnlist.size(); var++) + { + connect(m_NumerBtnlist.at(var), + SIGNAL(clicked()), + this, + SLOT(numerBtnClick()) + ); + } + + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void PassWordDialog::initResolution() +{ + #define FRAME_LEFT (328) // 小窗口 + #define FRAME_TOP (80) + #define FRAME_WIGHT (367) + #define FRAME_HEIGHT (406) + + #define TITLE_HEIGHT (48) // 标题栏高度 + + #define NUM_LEFT (23) // 数值左 + #define NUM_TOP (85) // 数值上 + #define NUM_WIGHT (323) // 数值宽度 + #define NUM_HEIGHT (42) // 数值高度 + + #define NUM_CONT_X (FRAME_LEFT+NUM_LEFT) // 中心点x + #define NUM_CONT_Y (FRAME_TOP+NUM_TOP+NUM_HEIGHT) // 中心点y + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->labelTitle->setGeometry((FRAME_LEFT+GLB_EDGE_WIGHT)*factoryX,(FRAME_TOP+(TITLE_HEIGHT-GLB_TEXT_HEIGHT)/2-8)*factoryY,(FRAME_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelValue->setGeometry((FRAME_LEFT+NUM_LEFT+GLB_TAB_WIGHT)*factoryX,(FRAME_TOP+NUM_TOP)*factoryY,(NUM_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_TEXT_L_HEIGHT*factoryY); +// ui->labelTitle->setGeometry((FRAME_LEFT+GLB_EDGE_WIGHT)*factoryX,(FRAME_TOP+(TITLE_HEIGHT-GLB_TEXT_HEIGHT)/2+10)*factoryY,(FRAME_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_TEXT_HEIGHT*factoryY); +// ui->labelValue->setGeometry((FRAME_LEFT+NUM_LEFT+GLB_TAB_WIGHT+20)*factoryX,(FRAME_TOP+NUM_TOP+11)*factoryY,(NUM_WIGHT-GLB_TAB_WIGHT*2)*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + + + int bgX,bgY; + bgX = NUM_CONT_X; + bgY = NUM_CONT_Y + GLB_EDGE_WIGHT; + + for(int i = 0; i < 4; i++) + { + for(int j = 0; j < 3; j ++) + { + if(i*3+j == m_NumerBtnlist.size()-1) + { + m_NumerBtnlist[i*3+j]->setGeometry((bgX+(j+1)*(GLB_LBUT_WIGHT+GLB_BAS_WIGHT))*factoryX,(bgY+i*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT))*factoryY, + GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + break; + } + else + { + m_NumerBtnlist[i*3+j]->setGeometry((bgX+j*(GLB_LBUT_WIGHT+GLB_BAS_WIGHT))*factoryX,(bgY+i*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT))*factoryY, + GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + } + } + } + + ui->buttonClean->setGeometry((bgX)*factoryX, (bgY+3*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT))*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonBack->setGeometry((bgX+2*(GLB_LBUT_WIGHT+GLB_BAS_WIGHT))*factoryX,(bgY+3*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT))*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((bgX+1*(GLB_LBUT_WIGHT+GLB_BAS_WIGHT))*factoryX,(bgY+4*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT)+GLB_BAS_WIGHT)*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((bgX+2*(GLB_LBUT_WIGHT+GLB_BAS_WIGHT))*factoryX,(bgY+4*(GLB_TEXT_L_HEIGHT+GLB_TAB_WIGHT)+GLB_BAS_WIGHT)*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + +} + +//初始化窗体控件样式 +void PassWordDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + for(int i = 0; i < m_NumerBtnlist.size(); i++) + { + m_NumerBtnlist[i]->setStyleSheet(numButtonStyle()); + m_NumerBtnlist[i]->setFont(fontSize_M()); + } + + if(g_emTheme == theme2) + { + ui->frameBack->setStyleSheet(frameBackStyle()); + ui->labelTitle->setStyleSheet(titleTextColour2()); + }else + { + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->labelTitle->setStyleSheet(transparentStyle()); + } + ui->labelTitle->setFont(fontSize_L()); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); + + ui->labelValue->setStyleSheet(numValue()); + ui->labelValue->setFont(fontSize_L()); + ui->labelValue->setAlignment(Qt::AlignCenter); + + ui->buttonClean->setStyleSheet(numButtonStyle()); + ui->buttonClean->setFont(fontSize_M()); + ui->buttonBack->setStyleSheet(numButtonStyle()); + ui->buttonBack->setFont(fontSize_M()); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + +void PassWordDialog::refreshUi() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + QString showStr(""); + QString password = cod->toUnicode("●"); + for (int var = 0; var < m_inputStr.size(); var++) + { + showStr = showStr + password; + } + + if(m_ifShow == false)//不可见 + { + ui->labelValue->setText(showStr); + } + else//可见 + { + ui->labelValue->setText(m_inputStr); + } + + + if(m_inputStr.length() > 0) + { + ui->buttonOk->setEnabled(true); + } + else + { + ui->buttonOk->setEnabled(false); + } +} + +void PassWordDialog::numerBtnClick() +{ + QPushButton *button = (QPushButton*) this->sender() ; + + if(button == NULL) + { + return; + } + QString str = button->text(); + m_inputStr.append(str); + refreshUi(); +} + +void PassWordDialog::setTitleStr(QString str,int cFlag) +{ + ui->labelTitle->setText(str); + m_inputStr.clear(); + if(cFlag != 0) + { + m_cleanFlag = cFlag; + ui->buttonClean->setText("."); + } + refreshUi(); +} + +void PassWordDialog::setShowIfVisible(bool bShow) +{ + m_ifShow = bShow; +} + +void PassWordDialog::setIpStr(QString ip) +{ + m_inputStr= ip; + m_ipLength = ip.length(); + refreshUi(); +} + +QString PassWordDialog::getInputStr() +{ + return m_inputStr; +} +void PassWordDialog::on_buttonClean_clicked() +{ + if(m_cleanFlag != 0) + { + QString str = ui->buttonClean->text(); + m_inputStr.append(str); + } + else + { + m_inputStr.clear(); + } + refreshUi(); +} + +void PassWordDialog::on_buttonBack_clicked() +{ + if(m_inputStr.length() <= m_ipLength) + { + return; + } + m_inputStr = m_inputStr.mid(0 , m_inputStr.size() - 1); + refreshUi(); +} + +void PassWordDialog::on_buttonOk_clicked() +{ + if(m_inputStr.indexOf(".") != -1) + { + //检测IP地址是否合法 + QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); + if (!regExp.exactMatch(m_inputStr)) + { + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK); + promptDlg.setTitleStr(tr("Prompt")); + QString str = tr("IP settings are unreasonable!");//IP设置不合理! + promptDlg.setContentStr(str); + promptDlg.exec(); + + return; + } + } + + done(1); +} + +void PassWordDialog::on_buttonCancel_clicked() +{ + m_inputStr.clear(); + done(0); +} diff --git a/sharedviews/passworddialog.h b/sharedviews/passworddialog.h new file mode 100644 index 0000000..ccc79dd --- /dev/null +++ b/sharedviews/passworddialog.h @@ -0,0 +1,51 @@ +#ifndef PASSWORDDIALOG_H +#define PASSWORDDIALOG_H + +#include +#include "setcontrolstyle.h" +#include "promptdialog.h" + +#include + +namespace Ui { +class PassWordDialog; +} + +class PassWordDialog : public QDialog +{ + Q_OBJECT + +public: + explicit PassWordDialog(QWidget *parent = 0); + ~PassWordDialog(); + +private: + Ui::PassWordDialog *ui; + QString m_inputStr; + QList m_NumerBtnlist; + bool m_ifShow;//输入字符是否可见 + s16 m_cleanFlag;//清除按钮的显示及作用,清空或者. + s16 m_ipLength; + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + void refreshUi(); + void initControlStyle_BlueVer(); + +private slots: + void numerBtnClick(); + void on_buttonClean_clicked(); + void on_buttonBack_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + +public: + void setTitleStr(QString str,int cFlag = 0);//设置标题并修改按钮文本 + void setShowIfVisible(bool bShow);//设置输入内容是否可见 + void setIpStr(QString ip); + QString getInputStr(); +}; + +#endif // PASSWORDDIALOG_H diff --git a/sharedviews/passworddialog.ui b/sharedviews/passworddialog.ui new file mode 100644 index 0000000..499d356 --- /dev/null +++ b/sharedviews/passworddialog.ui @@ -0,0 +1,3936 @@ + + + PassWordDialog + + + + 0 + 0 + 328 + 416 + + + + + 5 + 5 + + + + Dialog + + + + + 220 + 352 + 90 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 30 + 62 + 270 + 44 + + + + + 10 + 10 + + + + + 1000000 + 16777215 + + + + + wqy-microhei + 16 + 50 + false + false + + + + Qt::LeftToRight + + + background-color: rgba(255, 255, 245, 255); + + + + + + + Qt::AlignCenter + + + + + + 0 + 0 + 328 + 48 + + + + + + + Password + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 0 + 0 + 328 + 416 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 222 + 124 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 9 + + + false + + + + + + 20 + 236 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 1 + + + false + + + + + + 122 + 236 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 2 + + + false + + + + + + 222 + 292 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + + + + false + + + + + + 222 + 236 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 3 + + + false + + + + + + 222 + 180 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 6 + + + false + + + + + + 122 + 124 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 8 + + + false + + + + + + 20 + 292 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + C + + + false + + + + + + 122 + 292 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 0 + + + false + + + + + + 122 + 180 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 5 + + + false + + + + + + 20 + 124 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 7 + + + false + + + + + + 20 + 180 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + 4 + + + false + + + + + + 120 + 350 + 92 + 50 + + + + + 9 + 4 + + + + + 2000 + 2000 + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + 10 + 10 + 10 + + + + + + + 10 + 10 + 10 + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 168 + 197 + 226 + + + + + 186 + 220 + 255 + + + + + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 110 + 110 + 110 + + + + + + + 110 + 110 + 110 + + + + + + + 200 + 200 + 200 + + + + + + + 200 + 200 + 200 + + + + + + + + Qt::NoFocus + + + + + + + + + false + + + frameBack + buttonCancel + labelValue + labelTitle + buttonNum9 + buttonNum1 + buttonNum2 + buttonBack + buttonNum3 + buttonNum6 + buttonNum8 + buttonClean + buttonNum0 + buttonNum5 + buttonNum7 + buttonNum4 + buttonOk + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/patterneditwidget.cpp b/sharedviews/patterneditwidget.cpp new file mode 100644 index 0000000..64e693f --- /dev/null +++ b/sharedviews/patterneditwidget.cpp @@ -0,0 +1,945 @@ +#include "patterneditwidget.h" +#include "ui_patterneditwidget.h" + +PatternEditWidget::PatternEditWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::PatternEditWidget) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + // 创建一个QGraphicsView + m_view = new MyGraphicsView(this,GRIDSIZE1); + connect(m_view, SIGNAL(siCurrentIndex(int)), this, SLOT(slotShowCurrentIdx(int))); + + ui->labelSize->setText(tr("Each grid is 1 millimeter"));//每个格子为1毫米 + QString str= tr("Current number of needles: ") + QString("%1").arg(0);//当前针数: + ui->labelIndex->setText(str); + + str= tr("Pattern width: ") + QString("%1mm").arg(0);//花样宽度: + ui->labelWidth->setText(str); + str= tr("Pattern height: ") + QString("%1mm").arg(0);//花样高度: + ui->labelHeight->setText(str); + + m_XMoveValue = 0; + m_YMoveValue = 0; + + //这三个功能暂时隐藏掉,用qui源数据进行编辑时这三个功能有问题 + ui->pushButtonPreInsert->hide(); + ui->pushButtonNextInsert->hide(); + ui->pushButtonDelete->hide(); + + initResolution(); + initControlStyle(); +} + +PatternEditWidget::~PatternEditWidget() +{ + if(m_view != NULL) + { + delete m_view; + m_view = NULL; + } + delete ui; +} + +//初始化窗体控件为任意分辨率 +void PatternEditWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryX,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + + // 设置QGraphicsView的位置和大小 + m_view->setGeometry(10*factoryX, 10*factoryY, 771*factoryX, 551*factoryY); // 假设整个窗口用来显示图形 + + ui->frameBtn->setGeometry(790*factoryX,10*factoryY,226*factoryX,581*factoryY); + + ui->pushButtonPre1->setGeometry(121*factoryX, 10*factoryY, 86*factoryX, 40*factoryY); + ui->pushButtonNext1->setGeometry(16*factoryX, 10*factoryY, 86*factoryX, 40*factoryY); + ui->pushButtonPre10->setGeometry(121*factoryX, 60*factoryY, 86*factoryX, 40*factoryY); + ui->pushButtonNext10->setGeometry(16*factoryX, 60*factoryY, 86*factoryX, 40*factoryY); + + ui->pushButtonPreInsert->setGeometry(16*factoryX, 140*factoryY, 191*factoryX, 40*factoryY); + ui->pushButtonNextInsert->setGeometry(16*factoryX, 190*factoryY, 191*factoryX, 40*factoryY); + ui->pushButtonDelete->setGeometry(16*factoryX, 240*factoryY, 191*factoryX, 41*factoryY); + + ui->labelX->setGeometry(5*factoryX, 140*factoryY, 15*factoryX, 40*factoryY); + ui->pushButtonXValue->setGeometry(20*factoryX, 140*factoryY, 50*factoryX, 40*factoryY); + ui->labelXUnit->setGeometry(75*factoryX, 140*factoryY, 25*factoryX, 40*factoryY); + ui->pushButtonXAdd->setGeometry(110*factoryX, 140*factoryY, 50*factoryX, 40*factoryY); + ui->pushButtonXDec->setGeometry(170*factoryX, 140*factoryY, 50*factoryX, 40*factoryY); + + ui->labelY->setGeometry(5*factoryX, 200*factoryY, 15*factoryX, 40*factoryY); + ui->pushButtonYValue->setGeometry(20*factoryX, 200*factoryY, 50*factoryX, 40*factoryY); + ui->labelYUnit->setGeometry(75*factoryX, 200*factoryY, 25*factoryX, 40*factoryY); + ui->pushButtonYAdd->setGeometry(110*factoryX, 200*factoryY, 50*factoryX, 40*factoryY); + ui->pushButtonYDec->setGeometry(170*factoryX, 200*factoryY, 50*factoryX, 40*factoryY); + + ui->pushButtonEnlarge->setGeometry(16*factoryX, 321*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonNarrow->setGeometry(154*factoryX, 321*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonAuto->setGeometry(85*factoryX, 390*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonLeft->setGeometry(16*factoryX, 390*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonRight->setGeometry(154*factoryX, 390*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonUp->setGeometry(85*factoryX, 321*factoryY, 53*factoryX, 53*factoryY); + ui->pushButtonDn->setGeometry(85*factoryX, 459*factoryY, 53*factoryX, 53*factoryY); + + ui->pushButtonOk->setGeometry(16*factoryX, 545*factoryY, 80*factoryX, 30*factoryY); + ui->pushButtonCancel->setGeometry(127*factoryX, 545*factoryY, 80*factoryX, 30*factoryY); + + ui->frameDown->setGeometry(10*factoryX,560*factoryY,771*factoryX,31*factoryY); + ui->labelSize->setGeometry(10*factoryX,5*factoryY,260*factoryX,21*factoryY); + ui->labelIndex->setGeometry(270*factoryX,5*factoryY,150*factoryX,21*factoryY); + ui->labelWidth->setGeometry(430*factoryX,5*factoryY,160*factoryX,21*factoryY); + ui->labelHeight->setGeometry(590*factoryX,5*factoryY,160*factoryX,21*factoryY); +} + +//设置按钮颜色 天蓝色渐变 +void PatternEditWidget::setButtonColorForSkyBlue(QPushButton *button) +{ + QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}"; + style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + button->setStyleSheet(style); +} + +//按钮颜色橘色 +void PatternEditWidget::setOrangeButtonStyle(QPushButton *button) +{ + + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + button->setStyleSheet(style); +} + +//按钮颜色天空蓝--清空文本设置icon +void PatternEditWidget::setBlueButtonStyleClearTextAndSettingsIcon(QPushButton *button) +{ + QString iconName = ":/images/PatternEditWidget/"+button->objectName()+".png"; + button->setIcon(QIcon(iconName)); + button->setIconSize(7*QSize(returnMinimumSize(button)/8, 7*returnMinimumSize(button)/8)); + button->setText(""); + QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}"; + style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + button->setStyleSheet(style); +} + +//按钮颜色橘色--清空文本设置icon +void PatternEditWidget::setOrangeButtonStyleSettingsIcon(QPushButton *button) +{ + QString iconName = ":/images/PatternEditWidget/"+button->objectName()+".png"; + button->setIcon(QIcon(iconName)); + button->setIconSize(QSize(returnMinimumSize(button), returnMinimumSize(button))); + button->setText(""); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + button->setStyleSheet(style); +} + +//初始化窗体控件的样式 +void PatternEditWidget::initControlStyle() +{ + ui->labelIndex->setFont(fontSize_M()); + ui->labelSize->setFont(fontSize_M()); + ui->labelWidth->setFont(fontSize_M()); + ui->labelHeight->setFont(fontSize_M()); + + ui->frameBack->setStyleSheet("QFrame {" + "background-color: rgb(0, 0, 0);" + "}"); + ui->frameBtn->setStyleSheet("background-color:rgb(67, 67, 67);border-radius: "+borderRadius()+"px;"); + + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonEnlarge); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNarrow); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonPre1); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNext1); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonPre10); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNext10); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonAuto); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonLeft); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonRight); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonUp); + setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonDn); + + setButtonColorForSkyBlue(ui->pushButtonPreInsert); + setButtonColorForSkyBlue(ui->pushButtonNextInsert); + setButtonColorForSkyBlue(ui->pushButtonDelete); + + setButtonColorForSkyBlue(ui->pushButtonXValue); + setButtonColorForSkyBlue(ui->pushButtonXAdd); + setButtonColorForSkyBlue(ui->pushButtonXDec); + ui->pushButtonXValue->setFont(fontSize_M()); + QFont size(FONTTYPE,g_fontsize + 4, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + ui->pushButtonXAdd->setFont(size); + ui->pushButtonXDec->setFont(size); + ui->labelX->setFont(fontSize_M()); + ui->labelX->setStyleSheet(stateTextColour()); + ui->labelXUnit->setFont(fontSize_M()); + ui->labelXUnit->setStyleSheet(stateTextColour()); + + setButtonColorForSkyBlue(ui->pushButtonYValue); + setButtonColorForSkyBlue(ui->pushButtonYAdd); + setButtonColorForSkyBlue(ui->pushButtonYDec); + ui->pushButtonYValue->setFont(fontSize_M()); + + ui->pushButtonYAdd->setFont(size); + ui->pushButtonYDec->setFont(size); + ui->labelY->setFont(fontSize_M()); + ui->labelY->setStyleSheet(stateTextColour()); + ui->labelYUnit->setFont(fontSize_M()); + ui->labelYUnit->setStyleSheet(stateTextColour()); + + ui->pushButtonPreInsert->setFont(fontSize_M()); + ui->pushButtonNextInsert->setFont(fontSize_M()); + ui->pushButtonDelete->setFont(fontSize_M()); + + setOrangeButtonStyleSettingsIcon(ui->pushButtonCancel); + setOrangeButtonStyleSettingsIcon(ui->pushButtonOk); + + m_view->setStyleSheet("QGraphicsView {" + "border-top-left-radius: "+borderRadius()+"px;" // 左下角圆角 + "border-top-right-radius: "+borderRadius()+"px;" // 右下角圆角 + "}"); + ui->frameDown->setStyleSheet("QFrame {" + "border-bottom-left-radius: "+borderRadius()+"px;" // 左下角圆角 + "border-bottom-right-radius: "+borderRadius()+"px;" // 右下角圆角 + "}"); +} + +//返回一个按钮-高和宽最小的一个数值 +int PatternEditWidget::returnMinimumSize(QPushButton *button) +{ + // 确保指针不是 nullptr,以避免在按钮未正确初始化时导致的问题 + if (button == NULL) { + return 0; // 或者抛出异常或处理这种情况 + } + // 使用三元运算符来返回宽度和高度中的较大值 + return button->width() < button->height() ? button->width() : button->height(); +} + +//刷新图形 +void PatternEditWidget::refreshView(QString filePath,s32 scanX,s32 scanY) +{ +#if(0) + QByteArray dat = g_pCurEmbData->getDispDat(SCENESIZE,SCENESIZE); +#endif + + QList list; + list.clear(); + + m_filePath = filePath; + QFileInfo file(filePath); + QString ext = file.suffix().toUpper(); + int maxX,minX,maxY,minY; + maxX = minX = maxY = minY = 0; + m_pointsNum = 0; + + if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(filePath); + qui.creatDrawData(scanX,scanY,SCENESIZE,SCENESIZE,maxX,minX,maxY,minY,m_pointsNum); + list = qui.getDrawData(); + } + else if(ext == "DST") + { + DataFileDst dst; + dst.initFile(filePath); + } + else + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("Unsupported file format!");//不支持的文件格式! + dlg.setContentStr(str); + dlg.exec(); + return; + } + + if(list.size() <= 0) + { + ui->pushButtonEnlarge->setEnabled(false); + ui->pushButtonNarrow->setEnabled(false); + ui->pushButtonPre1->setEnabled(false); + ui->pushButtonNext1->setEnabled(false); + ui->pushButtonPre10->setEnabled(false); + ui->pushButtonNext10->setEnabled(false); + ui->pushButtonPreInsert->setEnabled(false); + ui->pushButtonNextInsert->setEnabled(false); + ui->pushButtonDelete->setEnabled(false); + ui->pushButtonOk->setEnabled(false); + + return; + } + m_view->creatViewByList(list); + + int num = m_view->getItemNums(); + + //只有格子图时加减针等按钮不可按 + if(num <= 1) + { + ui->pushButtonEnlarge->setEnabled(false); + ui->pushButtonNarrow->setEnabled(false); + ui->pushButtonPre1->setEnabled(false); + ui->pushButtonNext1->setEnabled(false); + ui->pushButtonPre10->setEnabled(false); + ui->pushButtonNext10->setEnabled(false); + ui->pushButtonPreInsert->setEnabled(false); + ui->pushButtonNextInsert->setEnabled(false); + ui->pushButtonDelete->setEnabled(false); + ui->pushButtonOk->setEnabled(false); + } + else + { + ui->pushButtonEnlarge->setEnabled(true); + ui->pushButtonNarrow->setEnabled(true); + ui->pushButtonPre1->setEnabled(true); + ui->pushButtonNext1->setEnabled(true); + ui->pushButtonPre10->setEnabled(true); + ui->pushButtonNext10->setEnabled(true); + ui->pushButtonPreInsert->setEnabled(true); + ui->pushButtonNextInsert->setEnabled(true); + ui->pushButtonDelete->setEnabled(true); + ui->pushButtonOk->setEnabled(true); + } + + double width = (double)(maxX-minX)/100.0; + QString str= tr("Pattern width: ") + QString("%1mm").arg(width);//花样宽度: + ui->labelWidth->setText(str); + + double height = (double)(maxY-minY)/100.0; + str= tr("Pattern height: ") + QString("%1mm").arg(height);//花样高度: + ui->labelHeight->setText(str); + + str= tr("Current number of needles: ") + QString("%1/%2").arg(0).arg(m_pointsNum);//当前针数: + ui->labelIndex->setText(str); + +#if(0) + double width = g_pCurEmbData->getDatWidth()/100.0; + QString str= tr("Pattern width: ") + QString("%1mm").arg(width);//花样宽度: + ui->labelWidth->setText(str); + + double height = g_pCurEmbData->getDatHeight()/100.0; + str= tr("Pattern height: ") + QString("%1mm").arg(height);//花样高度: + ui->labelHeight->setText(str); +#endif + QWidget::show(); +} + +void PatternEditWidget::on_pushButtonCancel_clicked() +{ + this->hide(); +} + +//放大 +void PatternEditWidget::on_pushButtonEnlarge_clicked() +{ + m_view->enlargeView(); +} + +//缩小 +void PatternEditWidget::on_pushButtonNarrow_clicked() +{ + m_view->narrowView(); +} + +void PatternEditWidget::on_pushButtonPre1_clicked() +{ + m_view->forwardAndBackward(-1); +} + +void PatternEditWidget::on_pushButtonNext1_clicked() +{ + m_view->forwardAndBackward(1); +} + +void PatternEditWidget::on_pushButtonPre10_clicked() +{ + m_view->forwardAndBackward(-10); +} + +void PatternEditWidget::on_pushButtonNext10_clicked() +{ + m_view->forwardAndBackward(10); +} + +void PatternEditWidget::on_pushButtonUp_clicked() +{ + m_view->moveScene(0,10); +} + +void PatternEditWidget::on_pushButtonDn_clicked() +{ + m_view->moveScene(0,-10); +} + +void PatternEditWidget::on_pushButtonLeft_clicked() +{ + m_view->moveScene(10,0); +} + +void PatternEditWidget::on_pushButtonRight_clicked() +{ + m_view->moveScene(-10,0); +} + +void PatternEditWidget::on_pushButtonAuto_clicked() +{ + m_view->autoView(); +} + +//向前插入一点 +void PatternEditWidget::on_pushButtonPreInsert_clicked() +{ + m_view->insertPoint(-1); +} + +//向后插入一点 +void PatternEditWidget::on_pushButtonNextInsert_clicked() +{ + m_view->insertPoint(1); +} + +//删除选中点 +void PatternEditWidget::on_pushButtonDelete_clicked() +{ + m_view->removeSelectPoint(); +} + +//保存文件 +void PatternEditWidget::on_pushButtonOk_clicked() +{ + //保存为qui文件,覆盖原来的,或另存为新的 + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_O_S_C); + promptDlg.setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Whether to overwrite the source file?");//是否覆盖源文件? + promptDlg.setContentStr(str); + int val = promptDlg.exec(); + if(val == 0) + { + return; + } + + QList lineList; + lineList.clear(); + QList pathList; + pathList.clear(); + + lineList = m_view->getLineItemList(); + pathList = m_view->getPathItemList(); + + //求maxy,因为实际数据与scanx和scany相差100倍,所以乘以100 + int firstX,endX; + firstX = endX= 0; + double maxY = S32_MIN; + int firstFlag = 0; + for(int i = 0; i < lineList.size(); i++) + { + for(int j = 0; j < lineList[i].points.size(); j++) + { + double x = lineList[i].points[j].x()*100.0; + double y = lineList[i].points[j].y()*100.0; + lineList[i].points[j].setX(x); + lineList[i].points[j].setY(y); + if(maxY < lineList[i].points[j].y()) + { + maxY = lineList[i].points[j].y(); + } + } + } + for(int i = 0; i < pathList.size(); i++) + { + for(int j = 0; j < pathList[i].points.size(); j++) + { + double x = pathList[i].points[j].x()*100.0; + double y = pathList[i].points[j].y()*100.0; + pathList[i].points[j].setX(x); + pathList[i].points[j].setY(y); + if(maxY < pathList[i].points[j].y()) + { + maxY = pathList[i].points[j].y(); + } + } + } + + QByteArray fileData; + fileData.clear(); + + QFileInfo file(m_filePath); + QString ext = file.suffix().toUpper(); + + int flag = 0; + if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(m_filePath); + QuiFileHead *head = qui.getQuiHead(); + fileData.append((char*)head,sizeof(QuiFileHead)); + + unsigned char ch1,ch2; + + //y向取反,并按顺序保存 + int idx = 0;//序号 + int add = 0; + QPoint lastP; + while(1) + { + if(add >= lineList.size()+pathList.size()+200) + { + flag = 1; + break;//避免陷入死循环 + } + if(idx >= lineList.size()+pathList.size()) + { + break; + } + for(int i = 0; i < lineList.size(); i++) + { + if(lineList[i].order == idx) + { + unsigned short int type = lineList[i].type; + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int pointsSize = lineList[i].points.size(); + ch1 = static_cast(pointsSize & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((pointsSize >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + for(int j = 0; j < lineList[i].points.size(); j++) + { + unsigned short int x = lineList[i].points[j].x(); + if(firstFlag == 0) + { + firstX = x; + firstFlag = 1; + } + endX = x; + lastP.setX(x); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = maxY-lineList[i].points[j].y(); + lastP.setY(y); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + } + idx++; + } + } + + for(int i = 0; i < pathList.size(); i++) + { + if(pathList[i].order == idx) + { + unsigned short int type = pathList[i].type; + if((pathList[i].points.size() == 3 && type == QUI_TYPE_ARC) || + (pathList[i].points.size() == 4 && type == QUI_TYPE_BES))//圆弧固定为3个点,贝塞尔为4个点 + { + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + for(int j = 0; j < pathList[i].points.size(); j++) + { + unsigned short int x = pathList[i].points[j].x(); + if(firstFlag == 0) + { + firstX = x; + firstFlag = 1; + } + endX = x; + lastP.setX(x); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = maxY-pathList[i].points[j].y(); + lastP.setY(y); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + } + } + idx++; + } + } + add++; + } + + //如果起点和终点x不一致,则添加一段跨步,使起点x和终点x相等 + if(firstX != endX) + { + unsigned short int type = QUI_TYPE_STEP; + ch1 = static_cast(type & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((type >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int pointsSize = 2; + ch1 = static_cast(pointsSize & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((pointsSize >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + //第一个点 + unsigned short int x = lastP.x(); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + unsigned short int y = lastP.y(); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + //第二个点 + x = lastP.x()+(firstX-endX); + ch1 = static_cast(x & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((x >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + + y = lastP.y(); + ch1 = static_cast(y & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((y >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + } + + //增加结束 + int end = 0xffff; + ch1 = static_cast(end & 0xFF); // 低字节 + fileData.append(ch1); + ch2 = static_cast((end >> 8) & 0xFF); // 高字节 + fileData.append(ch2); + } + else if(ext == "QUIX") + { + DataFileQuix quix; + quix.initFile(m_filePath); + } + else if(ext == "DSR") + { + DataFileDsr dsr; + dsr.initFile(m_filePath); + } + + if(flag != 0) + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("File save failed!");//文件保存失败! + dlg.setContentStr(str); + dlg.exec(); + return; + } + + if(val == 1)//覆盖 + { + QFile file(m_filePath); + + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + file.write(fileData); + file.close(); + //将原来的png删除 + QFile::remove(m_filePath+".preview.png"); + emit siRemoveOldPng(); + } + this->hide(); + emit siEditFinish(1); + } + else if(val == 2)//另存为 + { + WordsInputDialog wordInputDlg; + wordInputDlg.clean(); + wordInputDlg.setTitleStr(tr("Name"));//命名 + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { + //文件路径 + QString name = wordInputDlg.getInputStr()+".qui"; + + QDir apppath(qApp->applicationDirPath()); + QString filePath = apppath.path() + apppath.separator() + PATTERNPATH + apppath.separator(); + QString fileName = filePath + name; + + QFile file(fileName); + if(file.exists() == false) + { + QFile wfile(fileName); + + if (wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + wfile.write(fileData); + wfile.close(); + } + this->hide(); + emit siEditFinish(2); + } + else + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("This file already exists!");//此文件已经存在! + dlg.setContentStr(str); + dlg.exec(); + } + } + } + +#if(0) + m_newDat.clear(); + double unit = 100.0; + + double minX; + double maxX; + double minY; + double maxY; + + minX = S32_MAX; + maxX = S32_MIN; + minY = S32_MAX; + maxY = S32_MIN; + + QList list = m_view->getPointList(); + + //dsr数据 + QByteArray datArray; + datArray.clear(); + + DsrStep absItemDat; + memset((char*)&absItemDat,0,sizeof(DsrStep)); + + s32 prex = 0; + s32 prey = 0; + + s32 curx,cury; + curx = cury = 0; + + //保存为dsr文件 + for(int i = 0; i < list.size(); i++) + { + QPointF point = list[i]->pos(); + + absItemDat.ctrl = DSR_SEWING; + absItemDat.attr = 0; + absItemDat.dx = 0 - point.x() * unit; + absItemDat.dy = point.y() * unit; + + curx = absItemDat.dx; + cury = absItemDat.dy; + + int ddx = curx - prex; + int ddy = cury - prey; + double tar = atan2(ddy,ddx); + absItemDat.dr = (tar * 10000+0.5*(tar>0?1:-1)); + + if (minX > absItemDat.dx) { minX = absItemDat.dx;} + if (maxX < absItemDat.dx) { maxX = absItemDat.dx;} + if (minY > absItemDat.dy) { minY = absItemDat.dy;} + if (maxY < absItemDat.dy) { maxY = absItemDat.dy;} + + datArray.append((char*)&absItemDat,sizeof(DsrStep)); + + prex = curx;//bin + prey = cury;//bin + } + + int datlen = datArray.size()/sizeof(DsrStep); + for(int i = 0;i(datArray.data() + i * sizeof(DsrStep)); + absItemDat->dx -= maxX; + absItemDat->dy -= maxY; + } + + //添加结束码 + memset((char*)&absItemDat, 0, sizeof(DsrStep)); // 重置 absItemDat + absItemDat.ctrl = DATA_END; + absItemDat.attr = 0; + datArray.append((char*)&absItemDat,sizeof(DsrStep)); + + //生成文件头 + DsrHead dsrHead; + memset((char*)&dsrHead,0,sizeof(DsrHead)); + int itemNums = datArray.length() / sizeof(DsrStep); + //重新生成文件头 + float ver = DSR_VERSION_5; + dsrHead.verCode = *((DWORD*)(&ver)); + dsrHead.stitches = itemNums; + dsrHead.xyUnit = 1; + + dsrHead.rangePx = maxX-minX; + dsrHead.rangePy = maxY-minY; + dsrHead.rangeNx = minX-minX; + dsrHead.rangeNy = minY-minY; + + dsrHead.startX = 0; + dsrHead.startY = 0; + dsrHead.anchorX = 0; + dsrHead.anchorY = 0; + dsrHead.dataBegin = sizeof(DsrHead); + dsrHead.stepSize = itemNums*sizeof(DsrStep); // 数据字节数 + datArray.insert(0,(char*)&dsrHead,sizeof(DsrHead)); + m_newDat = datArray; + + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt"));//提示 + + QString str; + str = tr("Do you want to save as a new file?");//是否保存为一个新文件? + promptDlg.setContentStr(str); + + if(promptDlg.exec() == 1) + { + QString filePath = g_pCurEmbData->getFilePath(); + QFileInfo info(filePath); + + //保存成dsr文件 + QString dsrFilePath = filePath.remove(info.suffix()) + "dsr"; + QFile file(dsrFilePath); + + if(file.exists())//存在dsr文件 + { + QFile::remove(dsrFilePath); + QFile::remove(dsrFilePath+".ds16"); + QFile::remove(dsrFilePath+".preview.png"); + } + + if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + qDebug() << "open file fail when wirte, path =" << filePath; + dsrFilePath.clear(); + } + else + { + file.write(datArray); +#ifdef Q_OS_LINUX + system("sync"); +#endif + file.close(); + } + } + emit siEditPattern(); + //this->hide(); +#endif +} + +void PatternEditWidget::slotShowCurrentIdx(int idx) +{ + QString str= tr("Current number of needles: ") + QString("%1/%2").arg(idx).arg(m_pointsNum);//当前针数: + ui->labelIndex->setText(str); +} + +void PatternEditWidget::on_pushButtonXValue_clicked() +{ + int rslt=0; + m_XMoveValue= ui->pushButtonXValue->text().toDouble()*10; + NumerInputDialog ndlg(this); + ndlg.setTitleStr("X compensation value setting"); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_XMoveValue, 0, 100, 1); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_XMoveValue)//更改后的值不等于之前存的值 + { + m_XMoveValue = val/10.0; + } + } + ui->pushButtonXValue->setText(QString::number(m_XMoveValue)); +} + +void PatternEditWidget::on_pushButtonYValue_clicked() +{ + int rslt=0; + m_YMoveValue= ui->pushButtonYValue->text().toDouble()*10; + NumerInputDialog ndlg(this); + ndlg.setTitleStr("Y compensation value setting"); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_YMoveValue, 0, 100, 1); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_YMoveValue)//更改后的值不等于之前存的值 + { + m_YMoveValue = val/10.0; + } + } + ui->pushButtonYValue->setText(QString::number(m_YMoveValue)); +} + +void PatternEditWidget::on_pushButtonXAdd_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(m_XMoveValue,0); + } +} + +void PatternEditWidget::on_pushButtonXDec_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0-m_XMoveValue,0); + } +} + +void PatternEditWidget::on_pushButtonYAdd_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0,m_YMoveValue); + } +} + +void PatternEditWidget::on_pushButtonYDec_clicked() +{ + if(m_view != NULL) + { + m_view->setXYMove(0,0-m_YMoveValue); + } +} diff --git a/sharedviews/patterneditwidget.h b/sharedviews/patterneditwidget.h new file mode 100644 index 0000000..096cfda --- /dev/null +++ b/sharedviews/patterneditwidget.h @@ -0,0 +1,78 @@ +#ifndef PATTERNEDITWIDGET_H +#define PATTERNEDITWIDGET_H + +#include +#include +#include "view/mygraphicsview.h" +#include "main.h" +#include "sharedviews/promptdialog.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "datafile/datafilequi.h" +#include "datafile/datafilequix.h" + +namespace Ui { +class PatternEditWidget; +} + +class PatternEditWidget : public QWidget +{ + Q_OBJECT + +public: + explicit PatternEditWidget(QWidget *parent = 0); + ~PatternEditWidget(); + void refreshView(QString filePath,s32 scanX = 0,s32 scanY = 0);//刷新图形 + inline QByteArray getEditDat(){return m_newDat;} + +private slots: + void on_pushButtonCancel_clicked(); + void on_pushButtonEnlarge_clicked(); + void on_pushButtonNarrow_clicked(); + void on_pushButtonPre1_clicked(); + void on_pushButtonNext1_clicked(); + void on_pushButtonPre10_clicked(); + void on_pushButtonNext10_clicked(); + void on_pushButtonUp_clicked(); + void on_pushButtonDn_clicked(); + void on_pushButtonLeft_clicked(); + void on_pushButtonRight_clicked(); + void on_pushButtonAuto_clicked(); + void on_pushButtonPreInsert_clicked(); + void on_pushButtonNextInsert_clicked(); + void on_pushButtonDelete_clicked(); + void on_pushButtonOk_clicked(); + +private: + Ui::PatternEditWidget *ui; + MyGraphicsView *m_view; + QByteArray m_newDat; + double m_XMoveValue; //X移动距离 + double m_YMoveValue; //Y移动距离 + QString m_filePath; + int m_pointsNum; + + void initResolution(); + void initControlStyle(); + static int returnMinimumSize(QPushButton *button); + void setButtonColorForSkyBlue(QPushButton *button); + void setOrangeButtonStyle(QPushButton *button); + void setOrangeButtonStyleSettingsIcon(QPushButton *button); + void setBlueButtonStyleClearTextAndSettingsIcon(QPushButton *button); + +signals: + void siEditPattern();//花样编辑后点击确定按钮 + void siRemoveOldPng(); + void siEditFinish(s16 val); //1:覆盖 2:另存为 + +private slots: + void slotShowCurrentIdx(int idx); + void on_pushButtonXValue_clicked(); + void on_pushButtonYValue_clicked(); + void on_pushButtonXAdd_clicked(); + void on_pushButtonXDec_clicked(); + void on_pushButtonYAdd_clicked(); + void on_pushButtonYDec_clicked(); +}; + +#endif // PATTERNEDITWIDGET_H diff --git a/sharedviews/patterneditwidget.ui b/sharedviews/patterneditwidget.ui new file mode 100644 index 0000000..2256793 --- /dev/null +++ b/sharedviews/patterneditwidget.ui @@ -0,0 +1,463 @@ + + + PatternEditWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + + + 791 + 10 + 223 + 581 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 16 + 321 + 53 + 53 + + + + Enlarge + + + + + + 154 + 321 + 53 + 53 + + + + Narrow + + + + + + 16 + 10 + 86 + 40 + + + + -1 + + + + + + 85 + 390 + 53 + 53 + + + + Auto + + + + + + 76 + 540 + 64 + 31 + + + + Ok + + + + + + 150 + 540 + 64 + 31 + + + + Cancel + + + + + + 121 + 10 + 86 + 40 + + + + +1 + + + + + + 85 + 321 + 53 + 53 + + + + Up + + + + + + 16 + 390 + 53 + 53 + + + + Left + + + + + + 154 + 390 + 53 + 53 + + + + Right + + + + + + 85 + 459 + 53 + 53 + + + + Down + + + + + + 154 + 250 + 53 + 53 + + + + Delete +Point + + + + + + 16 + 60 + 86 + 40 + + + + -10 + + + + + + 121 + 60 + 86 + 40 + + + + +10 + + + + + + 16 + 250 + 53 + 53 + + + + Pre +Insert + + + + + + 85 + 250 + 53 + 53 + + + + Next +Insert + + + + + + 10 + 120 + 14 + 40 + + + + X + + + + + + 30 + 120 + 60 + 40 + + + + 0.0 + + + + + + 94 + 120 + 20 + 40 + + + + mm + + + + + + 120 + 120 + 40 + 40 + + + + + + + + + + + 170 + 120 + 40 + 40 + + + + - + + + + + + 30 + 170 + 60 + 40 + + + + 0.0 + + + + + + 10 + 170 + 14 + 40 + + + + Y + + + + + + 120 + 170 + 40 + 40 + + + + + + + + + + + 170 + 170 + 40 + 40 + + + + - + + + + + + 94 + 170 + 20 + 40 + + + + mm + + + + + + + 10 + 560 + 771 + 31 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 5 + 131 + 21 + + + + TextLabel + + + + + + 160 + 5 + 141 + 21 + + + + TextLabel + + + + + + 600 + 5 + 131 + 21 + + + + TextLabel + + + + + + 400 + 5 + 141 + 21 + + + + TextLabel + + + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + frameBack + frameBtn + frameDown + + + + diff --git a/sharedviews/patternmanagewidget.cpp b/sharedviews/patternmanagewidget.cpp new file mode 100644 index 0000000..186b4c9 --- /dev/null +++ b/sharedviews/patternmanagewidget.cpp @@ -0,0 +1,1743 @@ +#include "patternmanagewidget.h" +#include "ui_patternmanagewidget.h" + +PatternManageWidget::PatternManageWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::PatternManageWidget), + m_itemPerPage(16) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + + m_itemBtnList.clear(); + + m_itemBtnList.append(ui->button1); + m_itemBtnList.append(ui->button2); + m_itemBtnList.append(ui->button3); + m_itemBtnList.append(ui->button4); + m_itemBtnList.append(ui->button5); + + ui->button6->setVisible(false);//隐藏 + ui->button7->setVisible(false); + ui->button8->setVisible(false); + ui->button9->setVisible(false); + ui->button10->setVisible(false); + ui->button11->setVisible(false); + + { + ui->button6->setVisible(true);//显示 + ui->button7->setVisible(true); + ui->button8->setVisible(true); + m_itemBtnList.append(ui->button6); + m_itemBtnList.append(ui->button7); + m_itemBtnList.append(ui->button8); + } + + + m_itemBtnList.append(ui->button12); + m_itemBtnList.append(ui->button13); + m_itemBtnList.append(ui->button14); + m_itemBtnList.append(ui->button15); + m_itemBtnList.append(ui->button16); + ui->button17->setVisible(false);//隐藏 + ui->button18->setVisible(false); + ui->button19->setVisible(false); + ui->button20->setVisible(false); + ui->button21->setVisible(false); + ui->button22->setVisible(false); + + { + ui->button17->setVisible(true); + ui->button18->setVisible(true); + ui->button19->setVisible(true); + m_itemBtnList.append(ui->button17); + m_itemBtnList.append(ui->button18); + m_itemBtnList.append(ui->button19); + } + + initControl(); + initialize(); +} + +PatternManageWidget::~PatternManageWidget() +{ + delete ui; +} + +//初始化 +void PatternManageWidget::initialize() +{ + m_curPages = 1; + m_pageNums = 1; + m_fileItemList.clear();//文件列表清空 + m_selectFileItemList.clear(); + m_rootPath.clear();//操作屏根路径 + m_curPath.clear();//当前路径 + m_selectAll = -1; + + QDir apppath(qApp->applicationDirPath()); + QString filePath = apppath.path() + apppath.separator() + PATTERNPATH; + m_rootPath = QDir(filePath).absolutePath();//为了将"\"变为"/" +} + +//初始化窗体控件,包括位置、尺寸、样式 +void PatternManageWidget::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void PatternManageWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->labelPage->setGeometry(48*factoryX,0,200*factoryX,70*factoryY); + ui->labelPage->setAlignment(Qt::AlignLeft); + + QRect rectImage(0*factoryX,0*factoryY,26*factoryX,28*factoryY); + QRect rectName(33*factoryX,-5*factoryY,200*factoryX,36*factoryY);//花样名称 + for(int i = 0; i < 2; i++) + { + s16 num = m_itemBtnList.size()/2; + for(int j = 0; j < num; j++) + { + m_itemBtnList[i*num + j]->setLabelFont(fontSize_M()); + m_itemBtnList[i*num + j]->setGeometry((44+i*378)*factoryX,(138+j*47)*factoryY,337*factoryX,38*factoryY); + m_itemBtnList[i*num + j]->initLeftImageRightName(rectImage,rectName); + } + } + + ui->frameRightUp->setGeometry(800*factoryX,40*factoryY,800*factoryX,61*factoryY); + ui->buttonBackUpDir->setGeometry(150*factoryX,0,50*factoryX,50*factoryY); + ui->buttonSelectAll->setGeometry(93*factoryX,0,50*factoryX,50*factoryY); + ui->buttonNewFolder->setGeometry(37*factoryX,0,50*factoryX,50*factoryY); + + ui->labelPatternView->setGeometry(806*factoryX,152*factoryY,161*factoryX,137*factoryY); + ui->labelNameValue->setGeometry(816*factoryX,315*factoryY,146*factoryX,22*factoryY); + + ui->labelX->setGeometry(816*factoryX,350*factoryY,141*factoryX,20*factoryY); + ui->labelY->setGeometry(816*factoryX,375*factoryY,91*factoryX,20*factoryY); + ui->labelW->setGeometry(816*factoryX,400*factoryY,91*factoryX,20*factoryY); + ui->labelH->setGeometry(816*factoryX,425*factoryY,91*factoryX,20*factoryY); + ui->labelC->setGeometry(816*factoryX,450*factoryY,91*factoryX,20*factoryY); + ui->labelN->setGeometry(816*factoryX,475*factoryY,91*factoryX,20*factoryY); + + ui->labelXValue->setGeometry(865*factoryX,350*factoryY,91*factoryX,20*factoryY); + ui->labelYValue->setGeometry(865*factoryX,375*factoryY,91*factoryX,20*factoryY); + ui->labelWValue->setGeometry(865*factoryX,400*factoryY,91*factoryX,20*factoryY); + ui->labelHValue->setGeometry(865*factoryX,425*factoryY,91*factoryX,20*factoryY); + ui->labelCValue->setGeometry(865*factoryX,450*factoryY,91*factoryX,20*factoryY); + ui->labelNValue->setGeometry(865*factoryX,475*factoryY,91*factoryX,20*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); +} + +//初始化窗体分辨率 +void PatternManageWidget::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,533*scaleX,24*scaleY); + + QRect rectImage(0,5*scaleY,26*scaleX,28*scaleY); + QRect rectName(30*scaleX,0,200*scaleX,36*scaleY); + for(int i = 0; i < 2; i++) + { + s16 num = m_itemBtnList.size()/2; + for(int j = 0; j < num; j++) + { + m_itemBtnList[i*num + j]->setLabelFont(fontSize_M()); + m_itemBtnList[i*num + j]->setGeometry((56+i*378)*scaleX,(110+j*48)*scaleY,337*scaleX,38*scaleY); + m_itemBtnList[i*num + j]->initLeftImageRightName(rectImage,rectName); + } + } + + ui->frameRightUp->setGeometry(800*scaleX,4*scaleY,300*scaleX,61*scaleY); + ui->buttonBackUpDir->setGeometry(150*scaleX,0,50*scaleX,50*scaleY); + ui->buttonSelectAll->setGeometry(93*scaleX,0,50*scaleX,50*scaleY); + ui->buttonNewFolder->setGeometry(37*scaleX,0,50*scaleX,50*scaleY); + + ui->labelPatternView->setGeometry(824*scaleX,106*scaleY,150*scaleX,150*scaleY); + ui->labelNameValue->setGeometry(816*scaleX,285*scaleY,146*scaleX,22*scaleY); + ui->labelX->setGeometry(816*scaleX,320*scaleY,141*scaleX,20*scaleY); + ui->labelXValue->setGeometry(895*scaleX,320*scaleY,91*scaleX,20*scaleY); + ui->labelY->setGeometry(816*scaleX,345*scaleY,91*scaleX,20*scaleY); + ui->labelYValue->setGeometry(895*scaleX,345*scaleY,91*scaleX,20*scaleY); + ui->labelW->setGeometry(816*scaleX,370*scaleY,91*scaleX,20*scaleY); + ui->labelWValue->setGeometry(895*scaleX,370*scaleY,91*scaleX,20*scaleY); + ui->labelH->setGeometry(816*scaleX,395*scaleY,91*scaleX,20*scaleY); + ui->labelHValue->setGeometry(895*scaleX,395*scaleY,91*scaleX,20*scaleY); + ui->labelC->setGeometry(816*scaleX,420*scaleY,91*scaleX,20*scaleY); + ui->labelCValue->setGeometry(895*scaleX,420*scaleY,91*scaleX,20*scaleY); + ui->labelN->setGeometry(816*scaleX,445*scaleY,91*scaleY,20*scaleY); + ui->labelNValue->setGeometry(895*scaleX,445*scaleY,91*scaleX,20*scaleY); + + ui->framePageBtn->setGeometry(584*scaleX,520*scaleY,427*scaleX,40*scaleY); + ui->labelPage->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(0,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonOk->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); +} + +//初始化窗体控件样式 +void PatternManageWidget::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getStyleSheet1(this->objectName()); + ui->frameBack->setStyleSheet(frameBackImgPath); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(commonTextColour()); + + ui->labelPatternView->setStyleSheet(transparentStyle()); + ui->labelNameValue->setFont(fontSize_M()); + ui->labelNameValue->setStyleSheet(titleTextColour()); + ui->labelX->setFont(fontSize_M()); + ui->labelX->setStyleSheet(titleTextColour()); + ui->labelXValue->setFont(fontSize_M()); + ui->labelXValue->setStyleSheet(titleTextColour()); + ui->labelY->setFont(fontSize_M()); + ui->labelY->setStyleSheet(titleTextColour()); + ui->labelYValue->setFont(fontSize_M()); + ui->labelYValue->setStyleSheet(titleTextColour()); + ui->labelW->setFont(fontSize_M()); + ui->labelW->setStyleSheet(titleTextColour()); + ui->labelWValue->setFont(fontSize_M()); + ui->labelWValue->setStyleSheet(titleTextColour()); + ui->labelH->setFont(fontSize_M()); + ui->labelH->setStyleSheet(titleTextColour()); + ui->labelHValue->setFont(fontSize_M()); + ui->labelHValue->setStyleSheet(titleTextColour()); + ui->labelC->setFont(fontSize_M()); + ui->labelC->setStyleSheet(titleTextColour()); + ui->labelCValue->setFont(fontSize_M()); + ui->labelCValue->setStyleSheet(titleTextColour()); + ui->labelN->setFont(fontSize_M()); + ui->labelN->setStyleSheet(titleTextColour()); + ui->labelNValue->setFont(fontSize_M()); + ui->labelNValue->setStyleSheet(titleTextColour()); + + ui->framePageBtn->setStyleSheet(transparentStyle()); + ui->frameRightUp->setStyleSheet(transparentStyle()); + + ui->buttonSelectAll->setStyleSheet(backIconStyle());; + ui->buttonSelectAll->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonSelectAll->objectName())); + + ui->buttonBackUpDir->setStyleSheet(backIconStyle());; + ui->buttonBackUpDir->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonBackUpDir->objectName())); + + ui->buttonNewFolder->setStyleSheet(backIconStyle());; + ui->buttonNewFolder->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonNewFolder->objectName())); + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + + +//设置类型图标 +void PatternManageWidget::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +//设置主title +void PatternManageWidget::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +//设置副title +void PatternManageWidget::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +//初始化当前路径花样(点击选择花样时刷新) +void PatternManageWidget::initDirPath(QString path) +{ + int flag = -1;//该路径下是否存在dst文件或dsr文件的扫描标志 + m_curPath = path; + if(m_curPath == m_usbPath || m_curPath == m_rootPath)//如果当前目录等于优盘目录或操作屏根目录,返回上级按钮不可按 + { + ui->buttonBackUpDir->setEnabled(false); + } + else + { + ui->buttonBackUpDir->setEnabled(true); + } + + m_fileItemList.clear();//文件列表清空 + QDir dir(m_curPath); + //打开路径 + if(!dir.exists()) + { + m_curPages = 0; + m_pageNums = 0; + return; + } + + FileItem item; + QString fileName; + QString filePath; + QString imagePath; + + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); // 设置类型过滤器,只为文件夹和文件格式 + dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase); //设置排序方式,文件夹优先 + + QFileInfoList fileList = dir.entryInfoList(); + int count = fileList.count(); + for(int i = 0; i < count; i++) + { + QFileInfo fileInfo = fileList[i]; + + if(fileInfo.isDir())//为文件夹 + { + filePath = fileInfo.absoluteFilePath(); + fileName = fileInfo.baseName(); + imagePath = ":/images/folder.png"; + item.setFileInfo(filePath,fileName,imagePath); + m_fileItemList.append(item); + } + else//为文件 + { + QString suffix = fileInfo.suffix().toUpper(); + if(suffix == "DST" || suffix == "DSR" || suffix == "QUI" || suffix == "QUIX" || suffix == "PLT" || suffix == "DXF") + { + filePath = fileInfo.absoluteFilePath(); + fileName = fileInfo.fileName(); + imagePath = ":/images/file.png"; + item.setFileInfo(filePath,fileName,imagePath); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI)//双头组合机型只支持quix格式 + { + if(suffix == "QUIX") + { + m_fileItemList.append(item); + flag = 1; + } + } + else + { + m_fileItemList.append(item); + flag = 1;//扫描到dst或dsr + } + } + } + } + + if(flag == -1)//未扫描到dst或dsr + { + ui->buttonSelectAll->setEnabled(false); + } + else//扫描到dst或dsr + { + ui->buttonSelectAll->setEnabled(true); + } + + refreshUi(); +} + +void PatternManageWidget::initExecDirPath(QString path) +{ + m_curPath = path; + if(m_curPath == m_usbPath || m_curPath == m_rootPath)//如果当前目录等于优盘目录或操作屏根目录,返回上级按钮不可按 + { + ui->buttonBackUpDir->setEnabled(false); + } + else + { + ui->buttonBackUpDir->setEnabled(true); + } + + m_fileItemList.clear();//文件列表清空 + QDir dir(m_curPath); + //打开路径 + if(!dir.exists()) + { + m_curPages = 0; + m_pageNums = 0; + return; + } + + FileItem item; + QString fileName; + QString filePath; + QString imagePath; + + dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); // 设置类型过滤器,只为文件夹和文件格式 + + QFileInfoList fileList = dir.entryInfoList(); + int count = fileList.count(); + for(int i = 0; i < count; i++) + { + QFileInfo fileInfo = fileList[i]; + + if(fileInfo.isDir())//为文件夹 + { + filePath = fileInfo.absoluteFilePath(); + fileName = fileInfo.baseName(); + imagePath = ":/images/folder.png"; + item.setFileInfo(filePath,fileName,imagePath); + m_fileItemList.append(item); + } + } + + refreshUi(); +} + +//刷新界面显示 +void PatternManageWidget::refreshUi() +{ + if(m_manageMode == MANAGE_IMPORT_EXEC || m_manageMode == MANAGE_EXPORT_EXEC) + { + QString path = m_curPath; + if(m_manageMode == MANAGE_IMPORT_EXEC) + { + path = path.remove(m_rootPath); + } + if(m_manageMode == MANAGE_EXPORT_EXEC) + { + path = path.remove(m_usbPath); + } + setSubTitle(path); + } + + int itemNum; + if (m_fileItemList.size() <= 0) + { + itemNum = 0; + + for (int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList.at(i)->hide(); + } + ui->labelPage->setText(tr("pageNum: 0/0")); + ui->buttonPgUp->setEnabled(false); + ui->buttonPgDn->setEnabled(false); + ui->buttonOk->setEnabled(false); + ui->buttonSelectAll->setEnabled(false); + + return; + } + else + { + itemNum = m_fileItemList.size(); + } + + m_pageNums = (itemNum + m_itemPerPage - 1)/m_itemPerPage;// 计算页数 + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages <= 1 && itemNum != 0) + { + m_curPages = 1; + } + + int itemidx = (m_curPages - 1) * m_itemPerPage; + + for (int i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + //设置图标和文件名 + m_itemBtnList[i]->setItemLeftIcon(m_fileItemList.at(itemidx).getImagePath()); + m_itemBtnList[i]->setLabelName(m_fileItemList.at(itemidx).getShowInfo()); + m_itemBtnList.at(i)->show(); + + itemidx++; + } + else + { + m_itemBtnList.at(i)->hide(); + } + } + + // 翻页按钮 + if (m_curPages <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPages >= m_pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + // 页信息 + if(m_pageNums == 0) + { + m_curPages = 0; + } + + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPage->setText(str); + + refreshCheckedPage(); +} + +QString PatternManageWidget::detectUsb() +{ + QString usbPath = ""; + +#ifdef Q_OS_LINUX + QDir dir(LINUXUSBPATH); + if(!dir.exists()) + { + usbPath = ""; + } + else + { + usbPath = LINUXUSBPATH; + } +#endif + +#ifdef Q_OS_WIN + QFileInfoList list = QDir::drives(); + + for(int i = 0; isetCheckable(true); + m_itemBtnList.at(var)->setChecked(true); + } + else + { + // 不被选中 + m_itemBtnList.at(var)->setChecked(false); + m_itemBtnList.at(var)->setCheckable(false); + } + } + } +} + +//点击某一条目 lxs走到最新的 +void PatternManageWidget::clickItem(int idx) +{ + //全选时点击条目,全选标志置为非全选 + if(m_selectAll == 1) + { + m_selectAll = m_selectAll * -1; + } + + if(idx < 0) //都不选中 + { + m_selectAll = -1; + m_selectFileItemList.clear(); + // 刷新页面中被选择的条目 + for (int var = 0; var < m_itemPerPage ; var++) + { + // 不被选中 + m_itemBtnList[var]->setChecked(false); + m_itemBtnList[var]->setCheckable(false); + ui->buttonOk->setEnabled(false); + } + //清空图片 + QPixmap pix = QPixmap(); + ui->labelPatternView->setPixmap(pix); + clearFileInfo(); + } + else + { + // 计算当前选择按钮对应的花版 + int itemidx = (m_curPages - 1) * m_itemPerPage + idx - 1; + + if (m_fileItemList.size() <= 0) + { + itemidx = -1; + return; + } + else + { + + if (itemidx >= m_fileItemList.size()) + { + return; + } + } + + QString filePath = m_fileItemList.at(itemidx).getFilePath(); + QFileInfo fileInfo(filePath); + + QString fileName = fileInfo.fileName(); + int size = fileName.length(); + if(size > NAMEMAXLENGTH)//花样名称过长时截取 + { + fileName = fileName.mid(0,NAMEMAXLENGTH) + "~"; + } + + if(fileInfo.isDir())//为文件夹 + { + if(m_manageMode == MANAGE_IMPORT_EXEC || m_manageMode == MANAGE_EXPORT_EXEC) + { + initExecDirPath(filePath); + } + else + { + initDirPath(filePath); + } + clickItem(-1); + } + else + { + int retIdx = m_selectFileItemList.indexOf(filePath); + + if(retIdx == -1) + { + // 没有找到相同的文件名 + // 添加条目 + m_selectFileItemList.append(filePath); + } + else + { + m_selectFileItemList.takeAt(retIdx); + } + refreshCheckedPage(); + + if(m_selectFileItemList.size() > 0) + { + int ret = 0; + QFileInfo lfileInfo(m_selectFileItemList.last()); //最后一个选中Item + QString fileNamePath = lfileInfo.absoluteFilePath(); + QString suffix = lfileInfo.suffix().toUpper();//后缀 + + QImage image(QSize(ui->labelPatternView->width(), ui->labelPatternView->height()),QImage::Format_ARGB32); + ui->labelNameValue->setText(lfileInfo.fileName()); + ui->labelCValue->setText("1");//默认值为1 + if(suffix.toUpper() == "DST") + { + DataFileDst dst; + dst.initFile(fileNamePath);//最后一个选中Item + ret = dst.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(dst.getStitchNums())); + + double width = dst.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = dst.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = dst.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = dst.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "DSR") + { + DataFileDsr dsr; + dsr.initFile(fileNamePath);//最后一个选中Item + dsr.convertDataToEmbAbs(); + ret = dsr.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(dsr.getStitchNums())); + + double width = dsr.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = dsr.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = dsr.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = dsr.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix == "QUI") + { + DataFileQui qui; + qui.initFile(fileNamePath);//最后一个选中Item + ret = qui.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(qui.getStitchNums())); + + double width = qui.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = qui.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = qui.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = qui.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix == "QUIX") + { + DataFileQuix quix; + quix.initFile(fileNamePath);//最后一个选中Item + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + ret = quix.doubleHeadCreatePreviewImage(&image, 1, PEN_WIDTH); + } + else + { + ret = quix.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + } + //刷新文件信息 + ui->labelNValue->setText(QString::number(quix.getStitchNums())); + + double width = quix.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = quix.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = quix.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = quix.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "PLT") + { + ImportHPGL importHPGL; + if (importHPGL.IsSecretFile(fileNamePath) == true) + { + // 文件路径 + QDir apppath(qApp->applicationDirPath()); + QString strSecretFile = apppath.path() + apppath.separator() + "Secret.plt"; + + importHPGL.BitMapDtat(fileNamePath,strSecretFile); + importHPGL.IniPara(); + importHPGL.ReadSecretFile(strSecretFile); + } + else + { + importHPGL.IniPara(); + importHPGL.Read(fileNamePath); + } + importHPGL.convertDataToEmbAbs(); + ret = importHPGL.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + } + else if(suffix == "DXF") + { + } + + if(ret > 0) + { + QString path = fileNamePath + ".preview.png"; + image.load(path); + } + QPixmap pix = QPixmap::fromImage(image); + ui->labelPatternView->setPixmap(pix); + } + else + { + QPixmap pix = QPixmap(); + ui->labelPatternView->setPixmap(pix); + //清空文件信息 + clearFileInfo(); + } + } + } + + if(m_manageMode == MANAGE_IMPORT_EXEC || m_manageMode == MANAGE_EXPORT_EXEC) + { + //清空图片 + QPixmap pix = QPixmap(); + ui->labelPatternView->setPixmap(pix); + //清空文件信息 + clearFileInfo(); + ui->buttonOk->setEnabled(true); //导入导出文件 + } + else//选择文件 + { + if(m_selectFileItemList.size() <= 0) + { + ui->buttonOk->setEnabled(false); + + //清空图片 + QPixmap pix = QPixmap(); + ui->labelPatternView->setPixmap(pix); + } + else + { + ui->buttonOk->setEnabled(true); + } + } +} + +void PatternManageWidget::patternImportOrExport(QString mainStr,QString subStr,QString path) +{ + QDir apppath(qApp->applicationDirPath()); + + if(m_curPath.length() <= 0) + { + return; + } + + PromptDialog promptDlg(this); + promptDlg.setRange(0, m_cpSelectFileItemList.size()-1); + promptDlg.show(); + s16 showFlag = 1; + + for(int i = 0; i < m_cpSelectFileItemList.size(); i++) + { + QFileInfo fileInfo(m_cpSelectFileItemList.at(i)); + QString fileName = fileInfo.fileName(); + QString suffix = fileInfo.suffix(); + QString newFileName = m_curPath + apppath.separator() + fileName; + + //非5.2和6.3版本的dsr不可导入 + //dst格式错误不可导入 + if(suffix.toUpper() == "DSR" || + suffix.toUpper() == "DST" || + suffix.toUpper() == "QUI" || + suffix.toUpper() == "QUIX" || + suffix.toUpper() == "PLT" || + suffix.toUpper() == "DXF" ) + { + int rel = 0; + if(suffix.toUpper() == "DSR") + { + DataFileDsr dsr; + dsr.initFile(m_cpSelectFileItemList.at(i)); + rel = dsr.checkDsrVersion(); + } + else if(suffix.toUpper() == "DST") + { + DataFileDst dst; + dst.initFile(m_cpSelectFileItemList.at(i)); + rel = dst.checkDstFile(); + } + else if(suffix.toUpper() == "QUI") + { + } + else if(suffix.toUpper() == "QUIX") + { + } + else if(suffix.toUpper() == "PLT") + { + } + else if(suffix.toUpper() == "DXF") + { + } + + if(rel < 0) + { + promptDlg.initDialog(PromptDialog::BTN_OK); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + if(rel == -2) + { + str = fileName + " " + tr("Over 1.28 million stitches, can not be imported!");//针数超过128万,不能导入! + } + else + { + str = fileName + " " + tr("Format error, can not be imported!");//格式错误,不能导入! + } + promptDlg.setContentStr(str); + promptDlg.exec(); + showFlag = 0; + continue; + } + } + + qDebug()<<"Pattern ImportOrExport"; + qDebug()<<"fileName"< NAMEMAXLENGTH + 12)//花样名称过长时截取 + { + fileName = fileName.mid(0,NAMEMAXLENGTH + 12) + "~"; + } + + wordInputDlg.setOldWordsStr(fileName); + if(wordInputDlg.exec() == 1) + { + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + //文件名称 + QString name = wordInputDlg.getInputStr(); + QString newName = m_curPath + apppath.separator() + name + "." + suffix; + QFile::copy(m_cpSelectFileItemList.at(i), newName); + QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newName + ".fcg"); + } + else if(m_manageMode == MANAGE_EXPORT)//导出文件 + { + //文件名称 + QString name = wordInputDlg.getInputStr();//导出文件路径 + QString newName = m_curPath + apppath.separator() + name + "." + suffix; + QFile::copy(m_cpSelectFileItemList.at(i), newName); + QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newName + ".fcg"); + QFile::copy(m_cpSelectFileItemList.at(i) + ".ds16", newName + ".ds16"); + } + } + } + else if(ret == 2)//替换 + { + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + QFile::remove(newFileName); + QFile::remove(newFileName + ".fcg"); + QFile::remove(newFileName + ".ds16"); + QFile::copy(m_cpSelectFileItemList.at(i), newFileName); + emit siReplacePattrn(newFileName); + //newFileName = D:/work/workQT/QUILTING/Windows/debug/datafiles\0.7盾牌.dst + //QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newFileName + ".fcg"); + } + else if(m_manageMode == MANAGE_EXPORT)//导出文件 + { + QFile::remove(newFileName); + QFile::remove(newFileName + ".fcg"); + QFile::copy(m_cpSelectFileItemList.at(i), newFileName); + QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newFileName + ".fcg"); + QFile::copy(m_cpSelectFileItemList.at(i) + ".ds16", newFileName + ".ds16"); + } + } + } + else + { + promptDlg.initDialog(PromptDialog::BTN_P_NONE); + promptDlg.setTitleStr(tr("Prompt")); + + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + promptDlg.setContentProcessStr(tr("Importing ") + fileName); //正在导入 + } + else if(m_manageMode == MANAGE_EXPORT)//导出文件 + { + promptDlg.setContentProcessStr(tr("Exporting ") + fileName); //正在导出 + } + + if(showFlag == 0) + { + promptDlg.show(); + showFlag = 1; + } + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + QFile::copy(m_cpSelectFileItemList.at(i),newFileName); + QFile::copy(m_cpSelectFileItemList.at(i),newFileName); + //QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newFileName + ".fcg"); + } + else if(m_manageMode == MANAGE_EXPORT)//导出文件 + { + QFile::copy(m_cpSelectFileItemList.at(i),newFileName); + QFile::copy(m_cpSelectFileItemList.at(i) + ".fcg", newFileName + ".fcg"); + QFile::copy(m_cpSelectFileItemList.at(i) + ".ds16", newFileName + ".ds16"); + } + + } + + qDebug()<<"processEvents before"; + QCoreApplication::processEvents(QEventLoop::AllEvents); + qDebug()<<"processEvents end"; + + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + QImage image(m_imgSize,QImage::Format_ARGB32); + + if(suffix.toUpper() == "DST") + { + DataFileDst dst; + dst.initFile(newFileName); + dst.createPreviewImage(&image, 1, PEN_WIDTH);// 生成渐进绘制预览图片,第2个参数为0不保存图片,1为保存图片 + + qDebug()<<"dst.createPreviewImage end"; + } + else if(suffix.toUpper() == "DSR") + { + DataFileDsr dsr; + dsr.initFile(newFileName); + dsr.convertDataToEmbAbs(); + dsr.createPreviewImage(&image, 1, PEN_WIDTH);// 生成渐进绘制预览图片,第2个参数为0不保存图片,1为保存图片 + } + else if(suffix.toUpper() == "QUI") + { + DataFileQui qui; + qui.initFile(newFileName);//最后一个选中Item + qui.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + } + else if(suffix.toUpper() == "QUIX") + { + DataFileQuix quix; + quix.initFile(newFileName);//最后一个选中Item + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + quix.doubleHeadCreatePreviewImage(&image, 1, PEN_WIDTH); + } + else + { + quix.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + } + } + else if(suffix.toUpper() == "PLT") + { + } + else if(suffix.toUpper() == "DXF") + { + } + } + + promptDlg.setValue(i); + } + +#ifdef Q_OS_LINUX + system("sync"); +#endif + if(m_manageMode == MANAGE_IMPORT)//导入文件 + { + promptDlg.setContentStr(tr("Import complete")); //导入完成 + } + else if(m_manageMode == MANAGE_EXPORT)//导出文件 + { + promptDlg.setContentStr(tr("Export complete")); //导出完成 + } + promptDlg.hide(); + + setMainTitle(mainStr); + setSubTitle(subStr); + initialize(); + initDirPath(path); + clickItem(-1); + ui->buttonSelectAll->show(); + ui->buttonNewFolder->hide(); +} + +void PatternManageWidget::patternDelete() +{ + if(m_selectAll == 1)//全选时删除整个文件夹 + { + for(int i = 0; i < m_selectFileItemList.size(); i++) + { + QFile::remove(m_selectFileItemList.at(i)); + QFile::remove(m_selectFileItemList.at(i)+".fcg"); + QFile::remove(m_selectFileItemList.at(i)+".ds16"); + QFile::remove(m_selectFileItemList.at(i)+".ds8"); + QFile::remove(m_selectFileItemList.at(i)+".preview.png"); + } + + if(m_curPath != m_rootPath)//非根目录 + { + //得到上级目录 + QDir upDir(m_curPath); + upDir.cdUp(); + QString upPath = upDir.absolutePath(); + + QDir remDir(m_curPath); + if(remDir.exists() == true) + { + remDir.rmpath(remDir.absolutePath());//删除整个文件夹 + } + + initDirPath(upPath);//初始化上级目录 + } + else + { + initDirPath(m_curPath);//初始化当前目录(根目录) + } + } + else + { + //所选文件个数等于目录文件总个数时删除整个文件夹 + if(m_selectFileItemList.size() == m_fileItemList.size()) + { + for(int i = 0; i < m_selectFileItemList.size(); i++) + { + QFile::remove(m_selectFileItemList.at(i)); + QFile::remove(m_selectFileItemList.at(i)+".fcg"); + QFile::remove(m_selectFileItemList.at(i)+".ds16"); + QFile::remove(m_selectFileItemList.at(i)+".ds8"); + QFile::remove(m_selectFileItemList.at(i)+".preview.png"); + } + + if(m_curPath != m_rootPath)//非根目录 + { + //得到上级目录 + QDir upDir(m_curPath); + upDir.cdUp(); + QString upPath = upDir.absolutePath(); + + QDir remDir(m_curPath); + if(remDir.exists() == true) + { + remDir.rmpath(remDir.absolutePath());//删除整个文件夹 + } + + initDirPath(upPath);//初始化上级目录 + } + else + { + initDirPath(m_curPath);//初始化当前目录(根目录) + } + } + else + { + //所选文件个数不等于目录文件总个数时删除整个文件夹 + for(int i = 0; i < m_selectFileItemList.size(); i++) + { + QFile::remove(m_selectFileItemList.at(i)); + QFile::remove(m_selectFileItemList.at(i)+".fcg"); + QFile::remove(m_selectFileItemList.at(i)+".ds16"); + QFile::remove(m_selectFileItemList.at(i)+".ds8"); + QFile::remove(m_selectFileItemList.at(i)+".preview.png"); + initDirPath(m_curPath); + } + } + } + clickItem(-1); +} + +void PatternManageWidget::clearFileInfo() +{ + ui->labelNameValue->setText(""); + ui->labelNValue->setText(""); + ui->labelCValue->setText(""); + ui->labelWValue->setText(""); + ui->labelHValue->setText(""); + ui->labelXValue->setText(""); + ui->labelYValue->setText(""); +} + +//花样导入 +void PatternManageWidget::patternManage(MANAGE_MODE mode) +{ + initialize(); + if(mode != MANAGE_DELETE)//删除操作不检测优盘 + { + m_usbPath.clear(); + m_usbPath = detectUsb(); + if(m_usbPath.length() <= 0) + { + //优盘不存在 + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("USB flash drive is not detected!");//未检测到优盘! + dlg.setContentStr(str); + dlg.exec(); + return; + } + } + + if(mode == MANAGE_IMPORT) + { + initDirPath(m_usbPath); + } + else + { + initDirPath(m_rootPath); + } + clickItem(-1); + + m_manageMode = mode;//花样导入、导出、删除 + ui->buttonNewFolder->hide(); + ui->buttonSelectAll->show(); + this->show(); +} + +void PatternManageWidget::setImportImageSize(QSize imgSize) +{ + m_imgSize = imgSize; +} + +void PatternManageWidget::on_button1_clicked() +{ + clickItem(1); +} + +void PatternManageWidget::on_button2_clicked() +{ + clickItem(2); +} + +void PatternManageWidget::on_button3_clicked() +{ + clickItem(3); +} + +void PatternManageWidget::on_button4_clicked() +{ + clickItem(4); +} + +void PatternManageWidget::on_button5_clicked() +{ + clickItem(5); +} + +void PatternManageWidget::on_button6_clicked() +{ + clickItem(6); +} + +void PatternManageWidget::on_button7_clicked() +{ + clickItem(7); +} + +void PatternManageWidget::on_button8_clicked() +{ + clickItem(8); +} + +void PatternManageWidget::on_button9_clicked() +{ + clickItem(9); +} + +void PatternManageWidget::on_button10_clicked() +{ + clickItem(10); +} + +void PatternManageWidget::on_button11_clicked() +{ + clickItem(11); +} + +void PatternManageWidget::on_button12_clicked() +{ + clickItem(9); +} + +void PatternManageWidget::on_button13_clicked() +{ + clickItem(10); +} + +void PatternManageWidget::on_button14_clicked() +{ + clickItem(11); +} + +void PatternManageWidget::on_button15_clicked() +{ + clickItem(12); +} + +void PatternManageWidget::on_button16_clicked() +{ + + clickItem(13); +} + +void PatternManageWidget::on_button17_clicked() +{ + clickItem(14); +} + +void PatternManageWidget::on_button18_clicked() +{ + clickItem(15); +} + +void PatternManageWidget::on_button19_clicked() +{ + clickItem(16); +} + +void PatternManageWidget::on_button20_clicked() +{ + clickItem(20); +} + +void PatternManageWidget::on_button21_clicked() +{ + clickItem(21); +} + +void PatternManageWidget::on_button22_clicked() +{ + clickItem(22); +} + +void PatternManageWidget::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshUi(); +} + +void PatternManageWidget::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshUi(); +} + +void PatternManageWidget::on_buttonOk_clicked() +{ + if(m_manageMode == MANAGE_DELETE)//花样删除 + { + //是否删除花样的提示 + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK_CANCEL); + dlg.setTitleStr(tr("Prompt")); + + qDebug()<<"import begin 1"; + QString str; + str = tr("Whether to delete the pattern?");//是否删除花样? + dlg.setContentStr(str); + if(dlg.exec() == 1) + { + patternDelete(); + emit siDeletePattern();//删除文件后判断当前文件是否被删除 + } + } + else + { + qDebug()<<"import begin 1.5"; + QString str; + QString path; + if(m_manageMode == MANAGE_IMPORT)//花样导入 + { + qDebug()<<"import begin 2"; + + str = tr("Operation screen");//操作屏 + //导入路径 + path = m_rootPath; + m_manageMode = MANAGE_IMPORT_EXEC; + m_cpSelectFileItemList.clear(); + m_cpSelectFileItemList.append(m_selectFileItemList); + + qDebug()<<"import begin 2.5"; + } + else if(m_manageMode == MANAGE_EXPORT)//花样导出 + { + qDebug()<<"import begin XXX"; + + str = tr("USB");//优盘 + //导出路径 + path = m_usbPath; + m_manageMode = MANAGE_EXPORT_EXEC; + m_cpSelectFileItemList.clear(); + m_cpSelectFileItemList.append(m_selectFileItemList); + + qDebug()<<"import begin 3.5"; + } + else if(m_manageMode == MANAGE_IMPORT_EXEC)//花样导入执行 + { + + qDebug()<<"import begin 4"; + m_manageMode = MANAGE_IMPORT; + QString mainStr,subStr,path; + mainStr = tr("Pattern Import"); + subStr = tr("Pattern Import") +"<"+ tr(" Pattern setting"); + path = m_usbPath; + patternImportOrExport(mainStr,subStr,path); + + return; + qDebug()<<"import begin 4.5"; + } + else if(m_manageMode == MANAGE_EXPORT_EXEC)//花样导出执行 + { + + qDebug()<<"import begin 5"; + m_manageMode = MANAGE_EXPORT; + QString mainStr,subStr,path; + mainStr = tr("Pattern Export"); + subStr = tr("Pattern Export") + "<" + tr("Pattern setting"); + path = m_rootPath; + patternImportOrExport(mainStr,subStr,path); + + return; + qDebug()<<"import begin 5.5"; + } + + ui->buttonNewFolder->show(); + ui->buttonSelectAll->hide(); + setMainTitle(str); + setSubTitle(path); + initialize(); + initExecDirPath(path); + clickItem(-1); + } +} + +void PatternManageWidget::on_buttonCancel_clicked() +{ + QString mainStr,subStr,path; + if(m_manageMode == MANAGE_IMPORT || + m_manageMode == MANAGE_EXPORT || + m_manageMode == MANAGE_DELETE )//花样导入、花样导出、花样删除 + { + this->hide(); + return; + } + else if(m_manageMode == MANAGE_IMPORT_EXEC)//花样导入执行 + { + m_manageMode = MANAGE_IMPORT; + mainStr = tr("Pattern Import"); + subStr = tr("Pattern Import") +"<"+ tr(" Pattern setting"); + path = m_usbPath; + } + else if(m_manageMode == MANAGE_EXPORT_EXEC)//花样导出执行 + { + m_manageMode = MANAGE_EXPORT; + mainStr = tr("Pattern Import"); + subStr = tr("Pattern Import") +"<"+ tr(" Pattern setting"); + path = m_rootPath; + } + + ui->buttonNewFolder->hide(); + ui->buttonSelectAll->show(); + setMainTitle(mainStr); + setSubTitle(subStr); + initialize(); + initDirPath(path); + clickItem(-1); + //密码权限,单次有效 + g_emUser = operate; +} + +void PatternManageWidget::on_buttonBackUpDir_clicked() +{ + QDir dir(m_curPath); + dir.cdUp();//返回上级目录 + QString path = dir.absolutePath();//得到上级目录 + if(m_manageMode == MANAGE_IMPORT_EXEC || m_manageMode == MANAGE_EXPORT_EXEC) + { + initExecDirPath(path); + } + else + { + initDirPath(path); + } + clickItem(-1); +} + +void PatternManageWidget::on_buttonSelectAll_clicked() +{ + m_selectAll = m_selectAll * -1; + if(m_selectAll == 1)//全选 + { + QDir dir(m_curPath); + //打开路径 + if(!dir.exists()) + { + return; + } + + QStringList filters; + filters<labelPatternView->width(), ui->labelPatternView->height()),QImage::Format_ARGB32); + ui->labelNameValue->setText(lfileInfo.fileName()); + + if(suffix.toUpper() == "DST") + { + DataFileDst dst; + dst.initFile(fileNamePath);//最后一个选中Item + dst.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(dst.getStitchNums())); + + double width = dst.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = dst.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = dst.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = dst.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "DSR") + { + DataFileDsr dsr; + dsr.initFile(fileNamePath);//最后一个选中Item + dsr.convertDataToEmbAbs(); + dsr.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(dsr.getStitchNums())); + + double width = dsr.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = dsr.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = dsr.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = dsr.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "QUI") + { + DataFileQui qui; + qui.initFile(fileNamePath);//最后一个选中Item + qui.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(qui.getStitchNums())); + + double width = qui.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = qui.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = qui.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = qui.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "QUIX") + { + DataFileQuix quix; + quix.initFile(fileNamePath);//最后一个选中Item + quix.createPreviewImage(&image, 0, PEN_WIDTH,1);// 生成预览文件,第2个参数为0不保存图片,1为保存图片 + //刷新文件信息 + ui->labelNValue->setText(QString::number(quix.getStitchNums())); + + double width = quix.getDatWidth()*0.01; + ui->labelWValue->setText(QString("%1").arg(width)); + + double height = quix.getDatHeight()*0.01; + ui->labelHValue->setText(QString("%1").arg(height)); + + double xPos = quix.getMaxX()*0.01; + ui->labelXValue->setText(QString("%1").arg(xPos)); + + double yPos = quix.getMaxY()*0.01; + ui->labelYValue->setText(QString("%1").arg(yPos)); + } + else if(suffix.toUpper() == "PLT") + { + } + else if(suffix.toUpper() == "DXF") + { + } + + QPixmap pix = QPixmap::fromImage(image); + ui->labelPatternView->setPixmap(pix); + } + else if(m_selectAll == -1)//全不选 + { + clickItem(m_selectAll); + } + + if(m_selectFileItemList.size() <= 0) + { + ui->buttonOk->setEnabled(false); + } + else + { + ui->buttonOk->setEnabled(true); + } +} + +//新建文件夹 +void PatternManageWidget::on_buttonNewFolder_clicked() +{ + WordsInputDialog wordInputDlg; + wordInputDlg.clean(); + wordInputDlg.setTitleStr(tr("new folder"));//新文件夹 + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { + //文件路径 + QString name = wordInputDlg.getInputStr(); + QDir apppath(qApp->applicationDirPath()); + QString newFolderPath = m_curPath + apppath.separator() + name; + newFolderPath = QDir(newFolderPath).absolutePath();//为了将"\"变为"/" + + QDir dir(newFolderPath); + if(dir.exists() == false) + { + dir.mkdir(newFolderPath); + initExecDirPath(m_curPath); + } + else + { + PromptDialog dlg(this); + dlg.initDialog(PromptDialog::BTN_OK); + dlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("This folder already exists!");//此文件夹已经存在! + dlg.setContentStr(str); + dlg.exec(); + return; + } + } +} + +void PatternManageWidget::mousePressEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mousePressX = e->x(); + m_mousePressY = e->y(); + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + } +} + +void PatternManageWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mouseReleaseX = e->x(); + m_mouseReleaseY = e->y(); + } + + int width = this->width(); + int height = this->height(); + if ((m_mousePressX >= 0 && m_mousePressX <= 100) && + ((m_mousePressY >= (height - 100)) && m_mousePressY <= height) && + ((m_mouseReleaseX >= (width - 100)) && m_mouseReleaseX <= width) && + ((m_mouseReleaseY >= (height - 100)) && m_mouseReleaseY <= height)) + { + MainWidgetFunction mainFunction; + QString usbPath;//优盘路径 + usbPath = mainFunction.detectUsb();//优盘检测 + if(usbPath.length() <= 0) + { + //优盘不存在 + return; + } + else + { + QPixmap pixmap=QPixmap::grabWindow(this->winId(),0,0,this->width(),this->height());//截屏存放在pixmap + QString name_pc = usbPath + "EMB" + // + QDateTime::currentDateTime().toString("yyyyMMdd") +//获取时期时间 + +"_"+ + QDateTime::currentDateTime().toString("hhmmss") + ".png"; + + pixmap.save(name_pc,"png"); // 路径 + } + } + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; +} diff --git a/sharedviews/patternmanagewidget.h b/sharedviews/patternmanagewidget.h new file mode 100644 index 0000000..6500298 --- /dev/null +++ b/sharedviews/patternmanagewidget.h @@ -0,0 +1,139 @@ +#ifndef PatternManageWidget_H +#define PatternManageWidget_H + +#include +#include + +#ifdef Q_OS_WIN +#include +#include +#endif + +#include "setcontrolstyle.h" +#include "mybutton.h" +#include "items/fileitem.h" +#include "promptdialog.h" +#include "wordsinputdialog.h" +//#include "Include/datafiledst.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "datafile/datafilequi.h" +#include "datafile/datafilequix.h" +#include "datafile/hpgl/importhpgl.h" +#include +#include +#include "mctype/mainwidgetfunction.h" + + +namespace Ui { +class PatternManageWidget; +} + +class PatternManageWidget : public QWidget +{ + Q_OBJECT + +public: + explicit PatternManageWidget(QWidget *parent = 0); + ~PatternManageWidget(); + enum MANAGE_MODE {MANAGE_IMPORT = 0, MANAGE_EXPORT, MANAGE_DELETE,MANAGE_IMPORT_EXEC,MANAGE_EXPORT_EXEC}; + +private: + Ui::PatternManageWidget *ui; + int m_itemPerPage;//界面每页条目数 + QList m_itemBtnList; + +private: + QList m_fileItemList;//文件列表 + QList m_selectFileItemList;//选中文件列表 + QList m_cpSelectFileItemList;//选中文件列表 + + int m_curPages;//当前页 + int m_pageNums;//总页数 + QString m_usbPath;//优盘路径 + QString m_rootPath;//操作屏根路径 + QString m_curPath;//当前路径 + int m_selectAll;//1:全选 -1:全不选 + MANAGE_MODE m_manageMode;//导入、导出、删除 + + QSize m_imgSize; + +private: + void initialize();//初始化 + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + +public: + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + QString detectUsb();//检测优盘是否存在 + +private: + void initDirPath(QString path);//初始化目录中的目录和文件 + void initExecDirPath(QString path);//初始化目录中的目录 + + void refreshUi();//刷新界面显示 + + void refreshCheckedPage();//刷新条目选中状态 + void clickItem(int idx);//点击某一条目 + void patternImportOrExport(QString mainStr,QString subStr,QString path);//花样导入或导出 + void patternDelete();//花样删除 + void clearFileInfo(); + +public: + void patternManage(MANAGE_MODE mode);//花样导入 + void setImportImageSize(QSize imgSize); //设置导入花样时生成预览图片的图片大小(与花样选择界面的图片大小相同) + +signals: + void siDeletePattern();//删除了文件的信号 + void siReplacePattrn(QString path);//替换了文件的信号 + void siSelectPattern(QString filePath, s16 showFlag = 0);//选择花样并点击确定按钮 + +private slots: + void on_button1_clicked(); + void on_button2_clicked(); + void on_button3_clicked(); + void on_button4_clicked(); + void on_button5_clicked(); + void on_button6_clicked(); + void on_button7_clicked(); + void on_button8_clicked(); + void on_button9_clicked(); + void on_button10_clicked(); + void on_button11_clicked(); + void on_button12_clicked(); + void on_button13_clicked(); + void on_button14_clicked(); + void on_button15_clicked(); + void on_button16_clicked(); + void on_button17_clicked(); + void on_button18_clicked(); + void on_button19_clicked(); + void on_button20_clicked(); + void on_button21_clicked(); + void on_button22_clicked(); + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void on_buttonBackUpDir_clicked(); + void on_buttonSelectAll_clicked(); + void on_buttonNewFolder_clicked(); + + //鼠标事件 +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + int m_mousePressX; + int m_mousePressY; + int m_mouseReleaseX; + int m_mouseReleaseY; + void initControlStyle_BlueVer(); + void initResolution_BlueVer(); +}; + +#endif // PatternManageWidget_H diff --git a/sharedviews/patternmanagewidget.ui b/sharedviews/patternmanagewidget.ui new file mode 100644 index 0000000..5c3c2b8 --- /dev/null +++ b/sharedviews/patternmanagewidget.ui @@ -0,0 +1,1026 @@ + + + PatternManageWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + background-color: rgb(172, 172, 172); + + + + + 20 + 560 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 0/0 + + + + + + 100 + 430 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 110 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 470 + 550 + 531 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 290 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 450 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 370 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 210 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + + 100 + 310 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 470 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 150 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 70 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 390 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 270 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 350 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 190 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 230 + 300 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 30 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 40 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title < Title + + + + + + 110 + 10 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sub title + + + + + + 770 + 70 + 200 + 200 + + + + background-color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 1024 + 600 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 420 + 270 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 310 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 70 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 390 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 150 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 430 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 350 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 470 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 190 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 230 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 420 + 110 + 241 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 860 + 420 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 1000.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 830 + 400 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + W + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 860 + 360 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 500.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 860 + 440 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 999 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 830 + 420 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + H + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 860 + 460 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 1000000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 860 + 400 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 1000.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 830 + 380 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Y + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 830 + 360 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + X + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 860 + 380 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 800.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 800 + 330 + 72 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + dst + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 830 + 440 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + C + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 830 + 460 + 20 + 16 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + N + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 700 + 10 + 291 + 51 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 130 + 10 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 210 + 10 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 40 + 10 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + frameBack + labelPage + button10 + button2 + framePageBtn + button7 + button11 + button3 + button1 + button9 + button6 + button8 + button4 + button5 + buttonTypeLogo + labelSubTitle + labelMainTitle + labelPatternView + button17 + button18 + button12 + button20 + button14 + button21 + button19 + button22 + button15 + button16 + button13 + labelHValue + labelW + labelXValue + labelCValue + labelH + labelNValue + labelWValue + labelY + labelX + labelYValue + labelNameValue + labelC + labelN + frameRightUp + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/patternneedlelayoutwidget.cpp b/sharedviews/patternneedlelayoutwidget.cpp new file mode 100644 index 0000000..f4ab896 --- /dev/null +++ b/sharedviews/patternneedlelayoutwidget.cpp @@ -0,0 +1,1065 @@ +#include "patternneedlelayoutwidget.h" +#include "ui_patternneedlelayoutwidget.h" + +PatternNeedleLayoutWidget::PatternNeedleLayoutWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::PatternNeedleLayoutWidget) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + m_NeedleBtnList.clear(); + m_NeedleBtnList.append(ui->pushButtonFront1); + m_NeedleBtnList.append(ui->pushButtonFront2); + m_NeedleBtnList.append(ui->pushButtonFront3); + m_NeedleBtnList.append(ui->pushButtonFront4); + m_NeedleBtnList.append(ui->pushButtonFront5); + m_NeedleBtnList.append(ui->pushButtonFront6); + m_NeedleBtnList.append(ui->pushButtonFront7); + m_NeedleBtnList.append(ui->pushButtonFront8); + m_NeedleBtnList.append(ui->pushButtonFront9); + m_NeedleBtnList.append(ui->pushButtonFront10); + m_NeedleBtnList.append(ui->pushButtonFront11); + m_NeedleBtnList.append(ui->pushButtonFront12); + m_NeedleBtnList.append(ui->pushButtonFront13); + m_NeedleBtnList.append(ui->pushButtonFront14); + m_NeedleBtnList.append(ui->pushButtonFront15); + m_NeedleBtnList.append(ui->pushButtonFront16); + m_NeedleBtnList.append(ui->pushButtonFront17); + m_NeedleBtnList.append(ui->pushButtonFront18); + m_NeedleBtnList.append(ui->pushButtonFront19); + m_NeedleBtnList.append(ui->pushButtonFront20); + m_NeedleBtnList.append(ui->pushButtonFront21); + m_NeedleBtnList.append(ui->pushButtonFront22); + m_NeedleBtnList.append(ui->pushButtonFront23); + m_NeedleBtnList.append(ui->pushButtonFront24); + + m_NeedleBtnList.append(ui->pushButtonMiddle1); + m_NeedleBtnList.append(ui->pushButtonMiddle2); + m_NeedleBtnList.append(ui->pushButtonMiddle3); + m_NeedleBtnList.append(ui->pushButtonMiddle4); + m_NeedleBtnList.append(ui->pushButtonMiddle5); + m_NeedleBtnList.append(ui->pushButtonMiddle6); + m_NeedleBtnList.append(ui->pushButtonMiddle7); + m_NeedleBtnList.append(ui->pushButtonMiddle8); + m_NeedleBtnList.append(ui->pushButtonMiddle9); + m_NeedleBtnList.append(ui->pushButtonMiddle10); + m_NeedleBtnList.append(ui->pushButtonMiddle11); + m_NeedleBtnList.append(ui->pushButtonMiddle12); + m_NeedleBtnList.append(ui->pushButtonMiddle13); + m_NeedleBtnList.append(ui->pushButtonMiddle14); + m_NeedleBtnList.append(ui->pushButtonMiddle15); + m_NeedleBtnList.append(ui->pushButtonMiddle16); + m_NeedleBtnList.append(ui->pushButtonMiddle17); + m_NeedleBtnList.append(ui->pushButtonMiddle18); + m_NeedleBtnList.append(ui->pushButtonMiddle19); + m_NeedleBtnList.append(ui->pushButtonMiddle20); + m_NeedleBtnList.append(ui->pushButtonMiddle21); + m_NeedleBtnList.append(ui->pushButtonMiddle22); + m_NeedleBtnList.append(ui->pushButtonMiddle23); + m_NeedleBtnList.append(ui->pushButtonMiddle24); + + m_NeedleBtnList.append(ui->pushButtonBehind1); + m_NeedleBtnList.append(ui->pushButtonBehind2); + m_NeedleBtnList.append(ui->pushButtonBehind3); + m_NeedleBtnList.append(ui->pushButtonBehind4); + m_NeedleBtnList.append(ui->pushButtonBehind5); + m_NeedleBtnList.append(ui->pushButtonBehind6); + m_NeedleBtnList.append(ui->pushButtonBehind7); + m_NeedleBtnList.append(ui->pushButtonBehind8); + m_NeedleBtnList.append(ui->pushButtonBehind9); + m_NeedleBtnList.append(ui->pushButtonBehind10); + m_NeedleBtnList.append(ui->pushButtonBehind11); + m_NeedleBtnList.append(ui->pushButtonBehind12); + m_NeedleBtnList.append(ui->pushButtonBehind13); + m_NeedleBtnList.append(ui->pushButtonBehind14); + m_NeedleBtnList.append(ui->pushButtonBehind15); + m_NeedleBtnList.append(ui->pushButtonBehind16); + m_NeedleBtnList.append(ui->pushButtonBehind17); + m_NeedleBtnList.append(ui->pushButtonBehind18); + m_NeedleBtnList.append(ui->pushButtonBehind19); + m_NeedleBtnList.append(ui->pushButtonBehind20); + m_NeedleBtnList.append(ui->pushButtonBehind21); + m_NeedleBtnList.append(ui->pushButtonBehind22); + m_NeedleBtnList.append(ui->pushButtonBehind23); + m_NeedleBtnList.append(ui->pushButtonBehind24); + + for(int i = 0; i < m_NeedleBtnList.size(); i++) + { + connect(m_NeedleBtnList[i], + SIGNAL(clicked()), + this, + SLOT(slotNeedleBtnClicked())); + } + + m_pCurEmbData = new EmbData(); + + m_leftRightNeedleSpace = 635;//左右针间距 + m_needlesSpace = 2540;//针与针之间间距 + m_needleLayoutSpace12 = 7620;//针排间距 + m_needleLayoutSpace23 = 7620;//针排间距 + m_btnSelect = -1; + + memset(m_arrayNeedle1,NEEDLENOTSET,sizeof(m_arrayNeedle1)); + memset(m_arrayNeedle2,NEEDLENOTSET,sizeof(m_arrayNeedle2)); + memset(m_arrayNeedle3,NEEDLENOTSET,sizeof(m_arrayNeedle3)); + + this->setStyleSheet("background-color: rgb(223, 223, 223);"); + initResolution(); + initControlStyle(); +} + +PatternNeedleLayoutWidget::~PatternNeedleLayoutWidget() +{ + if(m_pCurEmbData != NULL) + { + delete m_pCurEmbData; + } + delete ui; +} + +//返回一个按钮-高和宽最小的一个数值 +int PatternNeedleLayoutWidget::returnMinimumSize(QPushButton *button) +{ + // 确保指针不是 nullptr,以避免在按钮未正确初始化时导致的问题 + if (button == NULL) { + return 0; // 或者抛出异常或处理这种情况 + } + // 使用三元运算符来返回宽度和高度中的较大值 + return button->width() < button->height() ? button->width() : button->height(); +} + +// 设置银色按钮,黑字 +void PatternNeedleLayoutWidget::setButtonStyle(QPushButton *button) +{ + // 银色按钮,黑字 + QString style = "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(255, 255, 255), stop:1 rgb(215, 243, 254));color: rgb(0, 0, 0);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(217, 222, 224), stop:1 rgb(191, 213, 223));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(230, 230, 230), stop:1 rgb(182, 182, 182));}"; + button->setStyleSheet(style); +} + +//设置按钮颜色橙色--清空文本设置icon +void PatternNeedleLayoutWidget::setOrangeButtonStyleSettingsIcon(QPushButton *button) +{ + QString iconName = ":/images/PatternNeedleLayoutWidget/"+button->objectName()+".png"; + button->setIcon(QIcon(iconName)); + button->setIconSize(QSize(returnMinimumSize(button), returnMinimumSize(button))); + button->setText(""); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + button->setStyleSheet(style); +} + +//设置按钮颜色--天蓝色渐变 +void PatternNeedleLayoutWidget::setButtonColorForSkyBlue(QPushButton *button) +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + style += "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}"; + style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}"; + style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #E8E8E8, stop: 1 #B3B3B3);border: none;color:rgb(0,0,0);}"; + style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #E8E8E8, stop: 1 #B3B3B3);border: none;color:rgb(0,0,0);}"; + button->setStyleSheet(style); +} + +//设置按钮颜色--银色边框白底黑字 +void PatternNeedleLayoutWidget::setButtonStyleForSilverBorder(QPushButton *button) +{ + QString style = "QPushButton {" + "background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(255, 255, 255), stop:1 rgb(215, 243, 254));" + "color: rgb(0, 0, 0);" + "border: 2px solid rgb(200, 200, 200);" + "border-radius: 5px;" + "} " + "QPushButton:pressed {" + "background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(217, 222, 224), stop:1 rgb(191, 213, 223));" + "border: 2px solid rgb(235, 235, 235);" + "} " + "QPushButton:disabled {" + "background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgb(230, 230, 230), stop:1 rgb(182, 182, 182));" + "color: rgb(150, 150, 150);" + "border: 2px solid rgb(180, 180, 180);" + "}"; + + button->setStyleSheet(style); +} + +void PatternNeedleLayoutWidget::selectNextBtn() +{ + int index = 0; + for(int i = 0; i < m_NeedleBtnList.size(); i++) + { + QPushButton* p_btn = m_NeedleBtnList.at(i); + if(p_btn->isChecked()) + { + index = i; + break; + } + } + index++; + if(index < m_NeedleBtnList.size()) + { + QPushButton* p_btn = m_NeedleBtnList.at(index); + p_btn->click(); + } +} + +//初始化窗体控件为任意分辨率 +void PatternNeedleLayoutWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + + ui->frameBGImg->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonClear->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCircle->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->labelImage->setGeometry(80*factoryX,320*factoryY,451*factoryX,251*factoryY); + ui->labelExplain->setGeometry(527*factoryX,470*factoryY,440*factoryX,50*factoryY); + + ui->pushButtonDouble->setGeometry(881*factoryX,435*factoryY,80*factoryX,30*factoryY); + ui->pushButtonLeft->setGeometry(645*factoryX,435*factoryY,80*factoryX,30*factoryY); + ui->pushButtonNone->setGeometry(527*factoryX,435*factoryY,80*factoryX,30*factoryY); + ui->pushButtonRight->setGeometry(763*factoryX,435*factoryY,80*factoryX,30*factoryY); + + ui->pushButtonLRSpace->setGeometry(876*factoryX,310*factoryY,50*factoryX,20*factoryY); + ui->pushButtonNSpace->setGeometry(876*factoryX,340*factoryY,50*factoryX,20*factoryY); + ui->pushButton12Space->setGeometry(876*factoryX,370*factoryY,50*factoryX,20*factoryY); + ui->pushButton23Space->setGeometry(876*factoryX,400*factoryY,50*factoryX,20*factoryY); + + ui->labelLRSpace->setGeometry(527*factoryX,310*factoryY,321*factoryX,20*factoryY); + ui->labelNSpace->setGeometry(527*factoryX,340*factoryY,321*factoryX,20*factoryY); + ui->label12Space->setGeometry(527*factoryX,370*factoryY,321*factoryX,20*factoryY); + ui->label23Space->setGeometry(527*factoryX,400*factoryY,321*factoryX,20*factoryY); + + ui->labelUnit1->setGeometry(932*factoryX,310*factoryY,41*factoryX,20*factoryY); + ui->labelUnit2->setGeometry(932*factoryX,340*factoryY,41*factoryX,20*factoryY); + ui->labelUnit3->setGeometry(932*factoryX,370*factoryY,41*factoryX,20*factoryY); + ui->labelUnit4->setGeometry(932*factoryX,400*factoryY,41*factoryX,20*factoryY); + + ui->frameBehind->setGeometry(10*factoryX,230*factoryY,991*factoryX,60*factoryY); + ui->frameMiddle->setGeometry(10*factoryX,160*factoryY,991*factoryX,60*factoryY); + ui->frameFront->setGeometry(10*factoryX,90*factoryY,991*factoryX,60*factoryY); + + for(int i = 0; i setGeometry((20+(40*(i%24)))*factoryX,14*factoryY,32*factoryX,32*factoryY); + } +} + +//初始化窗体控件的样式 +void PatternNeedleLayoutWidget::initControlStyle() +{ + ui->buttonTypeLogo->setUnPreBtnLogo(":/images/PatternNeedleLayoutWidget/mybutton_logo.png"); + ui->labelMainTitle->setText(tr("Alignment preview")); + ui->labelSubTitle->setText(tr("Pattern setting") + ">" + tr(" Alignment preview")); + ui->frameBGImg->setStyleSheet("QFrame {" + "border-image: url(:/images/PatternEditWidget/WidgetFrameBack_1006_logo.png) 0 0 0 0 stretch stretch;" + "}"); + ui->frameBack->setStyleSheet("background: transparent;"); + ui->labelImage->setStyleSheet("background: transparent;"); + ui->frameBehind->setStyleSheet("background: transparent;"); + ui->frameFront->setStyleSheet("background: transparent;"); + ui->frameMiddle->setStyleSheet("background: transparent;"); + ui->framePageBtn->setStyleSheet("background: transparent;"); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + + for(int i=0;isetFont(fontSize_M()); + } + + setOrangeButtonStyleSettingsIcon(ui->buttonOk); + setOrangeButtonStyleSettingsIcon(ui->buttonClear); + setOrangeButtonStyleSettingsIcon(ui->buttonCircle); + setOrangeButtonStyleSettingsIcon(ui->buttonCancel); + + ui->labelLRSpace->setText(tr("Left and right needle spacing :"));//左右针间距 + ui->labelNSpace->setText(tr("Needle to needle spacing :"));//针与针间距 + ui->label12Space->setText(tr("First, second row needle spacing :"));//第一、二排针间距 + ui->label23Space->setText(tr("Second, thrid row needle spacing :"));//第二、三排针间距 + ui->labelLRSpace->setFont(fontSize_M()); + ui->labelNSpace->setFont(fontSize_M()); + ui->label12Space->setFont(fontSize_M()); + ui->label23Space->setFont(fontSize_M()); + + ui->label12Space->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->label23Space->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelLRSpace->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelNSpace->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelUnit1->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelUnit2->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelUnit3->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelUnit4->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + ui->labelExplain->setStyleSheet("background: transparent;color:rgb(255, 255, 255)"); + + ui->label12Space->setFont(fontSize_M()); + ui->label23Space->setFont(fontSize_M()); + ui->labelLRSpace->setFont(fontSize_M()); + ui->labelNSpace->setFont(fontSize_M()); + ui->labelUnit1->setFont(fontSize_M()); + ui->labelUnit2->setFont(fontSize_M()); + ui->labelUnit3->setFont(fontSize_M()); + ui->labelUnit4->setFont(fontSize_M()); + ui->labelExplain->setFont(fontSize_M()); + + ui->pushButtonNone->setFont(fontSize_M()); + ui->pushButtonRight->setFont(fontSize_M()); + ui->pushButtonLeft->setFont(fontSize_M()); + ui->pushButtonDouble->setFont(fontSize_M()); + + ui->pushButton12Space->setFont(fontSize_M()); + ui->pushButton23Space->setFont(fontSize_M()); + ui->pushButtonLRSpace->setFont(fontSize_M()); + ui->pushButtonNSpace->setFont(fontSize_M()); + + setButtonStyleForSilverBorder(ui->pushButton12Space); + setButtonStyleForSilverBorder(ui->pushButton23Space); + setButtonStyleForSilverBorder(ui->pushButtonLRSpace); + setButtonStyleForSilverBorder(ui->pushButtonNSpace); + + setButtonColorForSkyBlue(ui->pushButtonNone); + setButtonColorForSkyBlue(ui->pushButtonRight); + setButtonColorForSkyBlue(ui->pushButtonLeft); + setButtonColorForSkyBlue(ui->pushButtonDouble); + + ui->pushButtonNone->setDisabled(true); + ui->pushButtonLeft->setDisabled(true); + ui->pushButtonRight->setDisabled(true); + ui->pushButtonDouble->setDisabled(true); + ui->pushButtonDouble->setVisible(false); +} + +void PatternNeedleLayoutWidget::on_pushButtonNone_clicked() +{ + if(m_btnSelect < 0) + { + return; + } + if(m_btnSelect < LAYOUTNEEDLENUM && m_btnSelect >= 0) + { + m_arrayNeedle1[m_btnSelect] = NEEDLENONE; + refreshView(1); //更新前排数据 + } + else if(m_btnSelect < LAYOUTNEEDLENUM*2 && m_btnSelect >= LAYOUTNEEDLENUM) + { + m_arrayNeedle2[m_btnSelect-LAYOUTNEEDLENUM] = NEEDLENONE; + refreshView(2); //更新中排数据 + } + else if(m_btnSelect < LAYOUTNEEDLENUM*3 && m_btnSelect >= LAYOUTNEEDLENUM*2) + { + m_arrayNeedle3[m_btnSelect-LAYOUTNEEDLENUM*2] = NEEDLENONE; + refreshView(3); //更新后排数据 + } + m_NeedleBtnList[m_btnSelect]->setText("O"); + + selectNextBtn(); +} + +void PatternNeedleLayoutWidget::on_pushButtonLeft_clicked() +{ + if(m_btnSelect < 0) + { + return; + } + if(m_btnSelect < LAYOUTNEEDLENUM && m_btnSelect >= 0) + { + m_arrayNeedle1[m_btnSelect] = NEEDLELEFT; + refreshView(1); + } + else if(m_btnSelect < LAYOUTNEEDLENUM*2 && m_btnSelect >= LAYOUTNEEDLENUM) + { + m_arrayNeedle2[m_btnSelect-LAYOUTNEEDLENUM] = NEEDLELEFT; + refreshView(2); + } + else if(m_btnSelect < LAYOUTNEEDLENUM*3 && m_btnSelect >= LAYOUTNEEDLENUM*2) + { + m_arrayNeedle3[m_btnSelect-LAYOUTNEEDLENUM*2] = NEEDLELEFT; + refreshView(3); + } + m_NeedleBtnList[m_btnSelect]->setText("L"); + + selectNextBtn(); +} + +void PatternNeedleLayoutWidget::on_pushButtonRight_clicked() +{ + if(m_btnSelect < 0) + { + return; + } + if(m_btnSelect < LAYOUTNEEDLENUM && m_btnSelect >= 0) + { + m_arrayNeedle1[m_btnSelect] = NEEDLERIGHT; + refreshView(1); + } + else if(m_btnSelect < LAYOUTNEEDLENUM*2 && m_btnSelect >= LAYOUTNEEDLENUM) + { + m_arrayNeedle2[m_btnSelect-LAYOUTNEEDLENUM] = NEEDLERIGHT; + refreshView(2); + } + else if(m_btnSelect < LAYOUTNEEDLENUM*3 && m_btnSelect >= LAYOUTNEEDLENUM*2) + { + m_arrayNeedle3[m_btnSelect-LAYOUTNEEDLENUM*2] = NEEDLERIGHT; + refreshView(3); + } + m_NeedleBtnList[m_btnSelect]->setText("R"); + + selectNextBtn(); +} + +void PatternNeedleLayoutWidget::on_buttonCircle_clicked() +{ + unsigned char arrayNeedle1[LAYOUTNEEDLENUM]; // 第1排排针 + memcpy((char*)arrayNeedle1,(char*)m_arrayNeedle1,sizeof(m_arrayNeedle1)); + unsigned char arrayNeedle2[LAYOUTNEEDLENUM]; // 第2排排针 + memcpy((char*)arrayNeedle2,(char*)m_arrayNeedle2,sizeof(m_arrayNeedle2)); + unsigned char arrayNeedle3[LAYOUTNEEDLENUM]; // 第3排排针 + memcpy((char*)arrayNeedle3,(char*)m_arrayNeedle3,sizeof(m_arrayNeedle3)); + + //前排循环 + s16 needle1Num = 0; + for(u16 i = 0; i < sizeof(m_arrayNeedle1); i++) + { + if(m_arrayNeedle1[i] == NEEDLENOTSET) + { + break; + } + needle1Num++; + } + if(needle1Num > 0) + { + u16 idx = 0; + unsigned char cpArrayNeedle1[needle1Num]; + memcpy((char*)cpArrayNeedle1,(char*)m_arrayNeedle1,sizeof(cpArrayNeedle1)); + for(u16 i = 0; i < sizeof(m_arrayNeedle1); i++) + { + if(i >= needle1Num) + { + idx = i % needle1Num; + } + else + { + idx = i; + } + m_arrayNeedle1[i] = cpArrayNeedle1[idx]; + } + } + + //中排循环 + s16 needle2Num = 0; + for(u16 i = 0; i < sizeof(m_arrayNeedle2); i++) + { + if(m_arrayNeedle2[i] == NEEDLENOTSET) + { + break; + } + needle2Num++; + } + if(needle2Num > 0) + { + u16 idx = 0; + unsigned char cpArrayNeedle2[needle2Num]; + memcpy((char*)cpArrayNeedle2,(char*)m_arrayNeedle2,sizeof(cpArrayNeedle2)); + for(u16 i = 0; i < sizeof(m_arrayNeedle2); i++) + { + if(i >= needle2Num) + { + idx = i % needle2Num; + } + else + { + idx = i; + } + m_arrayNeedle2[i] = cpArrayNeedle2[idx]; + } + } + + //后排循环 + s16 needle3Num = 0; + for(u16 i = 0; i < sizeof(m_arrayNeedle3); i++) + { + if(m_arrayNeedle3[i] == NEEDLENOTSET) + { + break; + } + needle3Num++; + } + if(needle3Num > 0) + { + u16 idx = 0; + unsigned char cpArrayNeedle3[needle3Num]; + memcpy((char*)cpArrayNeedle3,(char*)m_arrayNeedle3,sizeof(cpArrayNeedle3)); + for(u16 i = 0; i < sizeof(m_arrayNeedle3); i++) + { + if(i >= needle3Num) + { + idx = i % needle3Num; + } + else + { + idx = i; + } + m_arrayNeedle3[i] = cpArrayNeedle3[idx]; + } + } + + refreshNeedleText(); + + //重置绘制数据 + bool bl1 = memcmp((char*)m_arrayNeedle1,(char*)arrayNeedle1,sizeof(arrayNeedle1)); + bool bl2 = memcmp((char*)m_arrayNeedle2,(char*)arrayNeedle2,sizeof(arrayNeedle2)); + bool bl3 = memcmp((char*)m_arrayNeedle3,(char*)arrayNeedle3,sizeof(arrayNeedle3)); + + m_pCurEmbData->setViewInfo(ui->labelImage->width(),ui->labelImage->height()); + + if(bl1 == true)//设置改变 + { + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_newLRSpaceValue,m_newNSpaceValue,m_new12SpaceValue,m_new23SpaceValue,1); + } + if(bl2 == true)//设置改变 + { + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_newLRSpaceValue,m_newNSpaceValue,m_new12SpaceValue,m_new23SpaceValue,2); + } + if(bl3 == true)//设置改变 + { + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_newLRSpaceValue,m_newNSpaceValue,m_new12SpaceValue,m_new23SpaceValue,3); + } + m_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(1); + m_pCurEmbData->setDispMode(EmbData::DISP_ALL_NORMAL,1); // 重新画灰图 + QPixmap patternPix = m_pCurEmbData->getPreviewImage(); + ui->labelImage->setPixmap(patternPix); +} + +void PatternNeedleLayoutWidget::on_buttonOk_clicked() +{ + if(m_filePath.length() <= 0) + { + return; + } + + QFileInfo file(m_filePath); + QString ext = file.suffix().toUpper(); + + //将排针信息保存到文件中 + if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuiFileHead *head = qui.getQuiHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = m_newLRSpaceValue; + head->leftRightLen = m_newLRSpaceValue;//左右针间距 + m_needlesSpace = m_newNSpaceValue; + head->HStep = m_needlesSpace;//针与针之间间距 + m_needleLayoutSpace12 = m_new12SpaceValue; + head->VStep12 = m_needleLayoutSpace12;//针排间距 + m_needleLayoutSpace23 = m_new23SpaceValue; + head->VStep23 = m_needleLayoutSpace23;//针排间距 + + memcpy((char*)head->arrayNeedle1,(char*)m_arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)head->arrayNeedle2,(char*)m_arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)head->arrayNeedle3,(char*)m_arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + qui.writePatternParaToFile(head); + } + else if(ext == "QUIX") + { + DataFileQuix quix; + quix.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuixFileHead *head = quix.getQuixHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = m_newLRSpaceValue; + head->leftRightLen = m_leftRightNeedleSpace;//左右针间距 + m_needlesSpace = m_newNSpaceValue; + head->HStep = m_needlesSpace;//针与针之间间距 + m_needleLayoutSpace12 = m_new12SpaceValue; + head->VStep12 = m_needleLayoutSpace12;//针排间距 + m_needleLayoutSpace23 = m_new23SpaceValue; + head->VStep23 = m_needleLayoutSpace23;//针排间距 + + memcpy((char*)head->arrayNeedle1,(char*)m_arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)head->arrayNeedle2,(char*)m_arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)head->arrayNeedle3,(char*)m_arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + quix.writePatternParaToFile(head); + } + else if(ext == "DSR") + { + DataFileDsr dsr; + dsr.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + DsrHead *head = dsr.getDsrHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = m_newLRSpaceValue; + head->leftRightLen = m_leftRightNeedleSpace;//左右针间距 + m_needlesSpace = m_newNSpaceValue; + head->HStep = m_needlesSpace;//针与针之间间距 + m_needleLayoutSpace12 = m_new12SpaceValue; + head->VStep12 = m_needleLayoutSpace12;//针排间距 + m_needleLayoutSpace23 = m_new23SpaceValue; + head->VStep23 = m_needleLayoutSpace23;//针排间距 + + memcpy((char*)head->arrayNeedle1,(char*)m_arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)head->arrayNeedle2,(char*)m_arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)head->arrayNeedle3,(char*)m_arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + dsr.writePatternParaToFile(head); + } + emit siPatternNeedlePreview(); +} + +void PatternNeedleLayoutWidget::on_buttonCancel_clicked() +{ + this->hide(); +} + +void PatternNeedleLayoutWidget::slotNeedleBtnClicked() +{ + QPushButton *button = (QPushButton*) this->sender(); + + if(button == NULL) + { + return; + } + + if(button->isCheckable() == true) + { + button->setChecked(false); + button->setCheckable(false); + m_btnSelect = -1; + ui->pushButtonNone->setDisabled(true); + ui->pushButtonLeft->setDisabled(true); + ui->pushButtonRight->setDisabled(true); + ui->pushButtonDouble->setDisabled(true); + } + else + { + //其他按钮Checked变为false + for(int i = 0; i < m_NeedleBtnList.size(); i++) + { + m_NeedleBtnList[i]->setChecked(false); + m_NeedleBtnList[i]->setCheckable(false); + if(button == m_NeedleBtnList[i]) + { + button->setCheckable(true); + button->setChecked(true); + m_btnSelect = i; + if(!ui->pushButtonNone->isEnabled()) + { + ui->pushButtonNone->setDisabled(false); + ui->pushButtonLeft->setDisabled(false); + ui->pushButtonRight->setDisabled(false); + ui->pushButtonDouble->setDisabled(false); + } + } + } + } +} + +void PatternNeedleLayoutWidget::refreshNeedleText() +{ + //刷新按钮显示 + for(u16 i = 0; i < sizeof(m_arrayNeedle1); i++) + { + if(m_arrayNeedle1[i] == NEEDLENOTSET) + { + m_NeedleBtnList[i]->setText("X"); + } + else if(m_arrayNeedle1[i] == NEEDLENONE) + { + m_NeedleBtnList[i]->setText("O"); + } + else if(m_arrayNeedle1[i] == NEEDLELEFT) + { + m_NeedleBtnList[i]->setText("L"); + } + else if(m_arrayNeedle1[i] == NEEDLERIGHT) + { + m_NeedleBtnList[i]->setText("R"); + } + else + { + m_NeedleBtnList[i]->setText("X"); + } + } + for(u16 i = 0; i < sizeof(m_arrayNeedle2); i++) + { + if(m_arrayNeedle2[i] == NEEDLENOTSET) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM]->setText("X"); + } + else if(m_arrayNeedle2[i] == NEEDLENONE) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM]->setText("O"); + } + else if(m_arrayNeedle2[i] == NEEDLELEFT) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM]->setText("L"); + } + else if(m_arrayNeedle2[i] == NEEDLERIGHT) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM]->setText("R"); + } + else + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM]->setText("X"); + } + } + for(u16 i = 0; i < sizeof(m_arrayNeedle3); i++) + { + if(m_arrayNeedle3[i] == NEEDLENOTSET) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM*2]->setText("X"); + } + else if(m_arrayNeedle3[i] == NEEDLENONE) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM*2]->setText("O"); + } + else if(m_arrayNeedle3[i] == NEEDLELEFT) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM*2]->setText("L"); + } + else if(m_arrayNeedle3[i] == NEEDLERIGHT) + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM*2]->setText("R"); + } + else + { + m_NeedleBtnList[i+LAYOUTNEEDLENUM*2]->setText("X"); + } + } +} + +void PatternNeedleLayoutWidget::refreshView(s16 idx) +{ + if(idx == 0) + { + QByteArray ary = m_pCurEmbData->getDsDat(); + if(ary.size() > 0) + { + m_pCurEmbData->getOneDispDat(ary); + } + } + m_pCurEmbData->setViewInfo(ui->labelImage->width(),ui->labelImage->height()); + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_newLRSpaceValue,m_newNSpaceValue,m_new12SpaceValue,m_new23SpaceValue,idx); + m_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(); + m_pCurEmbData->setDispMode(EmbData::DISP_ALL_NORMAL,1); // 重新画灰图 + + QPixmap patternPix = m_pCurEmbData->getPreviewImage(); + ui->labelImage->setPixmap(patternPix); +} + +void PatternNeedleLayoutWidget::refreshSpace() +{ + ui->pushButtonLRSpace->setText("6.35"); + ui->pushButtonNSpace->setText("25.4"); + ui->pushButton12Space->setText("76.2"); + ui->pushButton23Space->setText("76.2"); + m_leftRightNeedleSpace = 635; + m_needlesSpace = 2540; + m_needleLayoutSpace12 = 7620; + m_needleLayoutSpace23 = 7620; + + m_newLRSpaceValue = 635; + m_newNSpaceValue = 2540; + m_new12SpaceValue = 7620; + m_new23SpaceValue = 7620; + + refreshView(0); +} + +void PatternNeedleLayoutWidget::showView(QString filePath,QByteArray absAry) +{ + ui->buttonOk->setDisabled(false); + m_filePath = filePath; + + if(m_filePath.length() <= 0) + { + return; + } + + m_leftRightNeedleSpace = 635;//左右针间距 + m_needlesSpace = 2540;//针与针之间间距 + m_needleLayoutSpace12 = 7620;//针排间距 + m_needleLayoutSpace23 = 7620;//针排间距 + memset(m_arrayNeedle1,NEEDLENOTSET,sizeof(m_arrayNeedle1)); + memset(m_arrayNeedle2,NEEDLENOTSET,sizeof(m_arrayNeedle2)); + memset(m_arrayNeedle3,NEEDLENOTSET,sizeof(m_arrayNeedle3)); + + QFileInfo file(m_filePath); + QString ext = file.suffix().toUpper(); + + //读取排针信息 + if(ext == "QUI") + { + DataFileQui qui; + qui.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuiFileHead *head = qui.getQuiHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = head->leftRightLen;//左右针间距 + m_needlesSpace = head->HStep;//针与针之间间距 + m_needleLayoutSpace12 = head->VStep12;//针排间距 + m_needleLayoutSpace23 = head->VStep23;//针排间距 + + memcpy((char*)m_arrayNeedle1,(char*)head->arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)m_arrayNeedle2,(char*)head->arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)m_arrayNeedle3,(char*)head->arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + m_new12SpaceValue = m_needleLayoutSpace12; + m_new23SpaceValue = m_needleLayoutSpace23; + m_newLRSpaceValue = m_leftRightNeedleSpace; + m_newNSpaceValue = m_needlesSpace; + } + else if(ext == "QUIX") + { + DataFileQuix quix; + quix.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + QuixFileHead *head = quix.getQuixHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = head->leftRightLen;//左右针间距 + m_needlesSpace = head->HStep;//针与针之间间距 + m_needleLayoutSpace12 = head->VStep12;//针排间距 + m_needleLayoutSpace23 = head->VStep23;//针排间距 + + memcpy((char*)m_arrayNeedle1,(char*)head->arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)m_arrayNeedle2,(char*)head->arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)m_arrayNeedle3,(char*)head->arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + m_new12SpaceValue = m_needleLayoutSpace12; + m_new23SpaceValue = m_needleLayoutSpace23; + m_newLRSpaceValue = m_leftRightNeedleSpace; + m_newNSpaceValue = m_needlesSpace; + } + else if(ext == "DSR") + { + DataFileDsr dsr; + dsr.initFile(m_filePath); + + //将花样参数配置写回到源文件中,需放在转换中间数据之前,因为中间数据需要根据文件头参数进行数据变换 + DsrHead *head = dsr.getDsrHead(); + if(head == NULL){return;} + + m_leftRightNeedleSpace = head->leftRightLen;//左右针间距 + m_needlesSpace = head->HStep;//针与针之间间距 + m_needleLayoutSpace12 = head->VStep12;//针排间距 + m_needleLayoutSpace23 = head->VStep23;//针排间距 + + memcpy((char*)m_arrayNeedle1,(char*)head->arrayNeedle1,sizeof(m_arrayNeedle1)); + memcpy((char*)m_arrayNeedle2,(char*)head->arrayNeedle2,sizeof(m_arrayNeedle2)); + memcpy((char*)m_arrayNeedle3,(char*)head->arrayNeedle3,sizeof(m_arrayNeedle3)); + + ui->pushButtonLRSpace->setText(QString::number(m_leftRightNeedleSpace/100)); + ui->pushButtonNSpace->setText(QString::number(m_needlesSpace/100)); + ui->pushButton12Space->setText(QString::number(m_needleLayoutSpace12/100)); + ui->pushButton23Space->setText(QString::number(m_needleLayoutSpace23/100)); + + m_new12SpaceValue = m_needleLayoutSpace12; + m_new23SpaceValue = m_needleLayoutSpace23; + m_newLRSpaceValue = m_leftRightNeedleSpace; + m_newNSpaceValue = m_needlesSpace; + } + + refreshNeedleText(); + + m_pCurEmbData->setViewInfo(ui->labelImage->width(),ui->labelImage->height()); + m_pCurEmbData->clear(); + m_pCurEmbData->setAbsDat(absAry); + m_pCurEmbData->m_editedflag = 1; + QByteArray ary = m_pCurEmbData->getDsDat(); + if(ary.size() > 0) + { + m_pCurEmbData->getOneDispDat(ary); + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_newLRSpaceValue,m_newNSpaceValue,m_new12SpaceValue,m_new23SpaceValue,0); + m_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(); + m_pCurEmbData->setDispMode(EmbData::DISP_ALL_NORMAL,1); // 重新画灰图 + QPixmap patternPix = m_pCurEmbData->getPreviewImage(); + ui->labelImage->setPixmap(patternPix); + } + + QWidget::show(); +} + +void PatternNeedleLayoutWidget::showTempView(QByteArray &dat) +{ + ui->buttonOk->setDisabled(true); +// memset(m_arrayNeedle1,NEEDLENOTSET,sizeof(m_arrayNeedle1)); +// memset(m_arrayNeedle2,NEEDLENOTSET,sizeof(m_arrayNeedle2)); +// memset(m_arrayNeedle3,NEEDLENOTSET,sizeof(m_arrayNeedle3)); + + refreshNeedleText(); + + m_pCurEmbData->setViewInfo(ui->labelImage->width(),ui->labelImage->height()); + m_pCurEmbData->clear(); + m_pCurEmbData->setAbsDat(dat); + m_pCurEmbData->m_editedflag = 1; + QByteArray ary = m_pCurEmbData->getDsDat(); + if(ary.size() > 0) + { + m_pCurEmbData->getOneDispDat(ary); + m_pCurEmbData->resetLayoutDispDat(m_arrayNeedle1,m_arrayNeedle2,m_arrayNeedle3,m_leftRightNeedleSpace,m_needlesSpace,m_needleLayoutSpace12,m_needleLayoutSpace23,0); + m_pCurEmbData->createDispFromEmbDs16DatForFlyShuttle(); + m_pCurEmbData->setDispMode(EmbData::DISP_ALL_NORMAL,1); // 重新画灰图 + QPixmap patternPix = m_pCurEmbData->getPreviewImage(); + ui->labelImage->setPixmap(patternPix); + } + + QWidget::show(); +} + +void PatternNeedleLayoutWidget::on_buttonClear_clicked() +{ + memset(m_arrayNeedle1,NEEDLENOTSET,sizeof(m_arrayNeedle1)); + memset(m_arrayNeedle2,NEEDLENOTSET,sizeof(m_arrayNeedle2)); + memset(m_arrayNeedle3,NEEDLENOTSET,sizeof(m_arrayNeedle3)); + refreshNeedleText(); + refreshView(0); +} + +void PatternNeedleLayoutWidget::on_pushButtonLRSpace_clicked() +{ + int rslt=0; + m_newLRSpaceValue= ui->pushButtonLRSpace->text().toDouble()*100; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(ui->labelLRSpace->text()); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_newLRSpaceValue, 0, 999999999, 2); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_newLRSpaceValue)//更改后的值不等于之前存的值 + { + m_newLRSpaceValue = val; + } + } + ui->pushButtonLRSpace->setText(QString::number(m_newLRSpaceValue/100)); + refreshView(0); +} + +void PatternNeedleLayoutWidget::on_pushButtonNSpace_clicked() +{ + int rslt=0; + m_newNSpaceValue=ui->pushButtonNSpace->text().toDouble()*100; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(ui->labelNSpace->text()); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_newNSpaceValue, 0, 999999999, 2); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_newNSpaceValue)//更改后的值不等于之前存的值 + { + m_newNSpaceValue = val; + } + } + ui->pushButtonNSpace->setText(QString::number(m_newNSpaceValue/100)); + refreshView(0); +} + +void PatternNeedleLayoutWidget::on_pushButton12Space_clicked() +{ + int rslt=0; + m_new12SpaceValue=ui->pushButton12Space->text().toDouble()*100; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(ui->label12Space->text()); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_new12SpaceValue, 0, 999999999, 2); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_new12SpaceValue)//更改后的值不等于之前存的值 + { + m_new12SpaceValue = val; + } + } + ui->pushButton12Space->setText(QString::number(m_new12SpaceValue/100)); + refreshView(0); +} + +void PatternNeedleLayoutWidget::on_pushButton23Space_clicked() +{ + int rslt=0; + m_new23SpaceValue=ui->pushButton23Space->text().toDouble()*100; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(ui->label23Space->text()); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(m_new23SpaceValue, 0, 999999999, 2); + rslt = ndlg.exec(); + + if (rslt == 1)//点了确认按钮 + { + s32 val = ndlg.getValue(); + if (val != m_new23SpaceValue)//更改后的值不等于之前存的值 + { + m_new23SpaceValue = val; + } + } + ui->pushButton23Space->setText(QString::number(m_new23SpaceValue/100)); + refreshView(0); +} diff --git a/sharedviews/patternneedlelayoutwidget.h b/sharedviews/patternneedlelayoutwidget.h new file mode 100644 index 0000000..50c521a --- /dev/null +++ b/sharedviews/patternneedlelayoutwidget.h @@ -0,0 +1,94 @@ +#ifndef PATTERNNEEDLELAYOUTWIDGET_H +#define PATTERNNEEDLELAYOUTWIDGET_H + +#include +#include +#include "main.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "datafile/datafilequi.h" +#include "datafile/datafilequix.h" +#include "sharedviews/numerinputdialog.h" +#include "datafile/embdata.h" +#include "sharedviews/promptdialog.h" + +namespace Ui { +class PatternNeedleLayoutWidget; +} + +class PatternNeedleLayoutWidget : public QWidget +{ + Q_OBJECT + +public: + explicit PatternNeedleLayoutWidget(QWidget *parent = 0); + ~PatternNeedleLayoutWidget(); + +private slots: + void on_pushButtonNone_clicked(); + void on_pushButtonLeft_clicked(); + void on_pushButtonRight_clicked(); + void on_buttonCircle_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void slotNeedleBtnClicked(); + void on_pushButtonLRSpace_clicked(); + void on_pushButtonNSpace_clicked(); + void on_pushButton12Space_clicked(); + void on_pushButton23Space_clicked(); + +public slots: + void on_buttonClear_clicked(); + +private: + Ui::PatternNeedleLayoutWidget *ui; + QList m_NeedleBtnList; + EmbData *m_pCurEmbData; + QString m_filePath; + + double m_leftRightNeedleSpace;//左右针间距,1/4英寸,6.35mm + double m_needlesSpace;//左针与左针(或右针与右针)之间间距,1英寸,25.4mm + double m_needleLayoutSpace12;//1、2针排间距,3英寸,76.2mm + double m_needleLayoutSpace23;//2、3针排间距,3英寸,76.2mm + int m_btnSelect;//1-12前排按钮选中,13-24中排按钮选中,25-36后排按钮选中 + + unsigned char m_arrayNeedle1[LAYOUTNEEDLENUM]; // 第1排排针 + unsigned char m_arrayNeedle2[LAYOUTNEEDLENUM]; // 第2排排针 + unsigned char m_arrayNeedle3[LAYOUTNEEDLENUM]; // 第3排排针 + + double m_newLRSpaceValue; + double m_newNSpaceValue; + double m_new12SpaceValue; + double m_new23SpaceValue; + +private: + void refreshNeedleText(); + void setButtonStyleForSilverBorder(QPushButton *button); + void selectNextBtn();//选中下一个按钮 + +public: + void showView(QString filePath,QByteArray absAry); + void showTempView(QByteArray &dat); + void refreshView(s16 idx = 0); + void refreshSpace(); + + inline int getLeftRightNeedleSpace(){return m_leftRightNeedleSpace;} + inline int getNeedleLayoutSpace12(){return m_needleLayoutSpace12;} + inline int getNeedleLayoutSpace23(){return m_needleLayoutSpace23;} + inline int getNeedlesSpace(){return m_needlesSpace;} + inline unsigned char* getarrayNeedle1(){return m_arrayNeedle1;} + inline unsigned char* getarrayNeedle2(){return m_arrayNeedle2;} + inline unsigned char* getarrayNeedle3(){return m_arrayNeedle3;} + + void initResolution(); + void initControlStyle(); + void setButtonColorForSkyBlue(QPushButton *button); + void setButtonStyle(QPushButton *button); + void setOrangeButtonStyleSettingsIcon(QPushButton *button); + int returnMinimumSize(QPushButton *button); + +signals: + void siPatternNeedlePreview();//花样排针预览后点击确定按钮 +}; + +#endif // PATTERNNEEDLELAYOUTWIDGET_H diff --git a/sharedviews/patternneedlelayoutwidget.ui b/sharedviews/patternneedlelayoutwidget.ui new file mode 100644 index 0000000..4ff20f9 --- /dev/null +++ b/sharedviews/patternneedlelayoutwidget.ui @@ -0,0 +1,1473 @@ + + + PatternNeedleLayoutWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + + + 100 + 10 + 181 + 21 + + + + + + + Pattern Select + + + + + + 0 + 0 + 1024 + 600 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 560 + 470 + 441 + 50 + + + + <html><head/><body><p>Needle arrangement definition: O, no needles; L, Left needle; R, Right needle</p></body></html> + + + true + + + + + + 910 + 435 + 80 + 30 + + + + Double + + + + + + 790 + 435 + 80 + 30 + + + + Right + + + + + + 560 + 435 + 80 + 30 + + + + None + + + + + + 630 + 435 + 80 + 30 + + + + Left + + + + + + 880 + 310 + 71 + 20 + + + + + + + + + + 880 + 370 + 71 + 20 + + + + + + + + + + 880 + 400 + 71 + 20 + + + + + + + + + + 880 + 340 + 71 + 20 + + + + + + + + + + 570 + 310 + 300 + 20 + + + + TextLabel + + + + + + 570 + 370 + 300 + 20 + + + + TextLabel + + + + + + 570 + 340 + 300 + 20 + + + + TextLabel + + + + + + 570 + 400 + 300 + 20 + + + + TextLabel + + + + + + 970 + 310 + 41 + 20 + + + + mm + + + + + + 970 + 340 + 41 + 20 + + + + mm + + + + + + 970 + 370 + 41 + 20 + + + + mm + + + + + + 970 + 400 + 41 + 20 + + + + mm + + + pushButton12Space + pushButton23Space + pushButtonNSpace + labelExplain + pushButtonDouble + pushButtonRight + pushButtonNone + pushButtonLeft + pushButtonLRSpace + labelLRSpace + label12Space + labelNSpace + label23Space + labelUnit1 + labelUnit2 + labelUnit3 + labelUnit4 + + + + + 630 + 540 + 381 + 60 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 120 + 10 + 64 + 40 + + + + Qt::NoFocus + + + Circle + + + + + + 210 + 10 + 64 + 40 + + + + Qt::NoFocus + + + Ok + + + + + + 300 + 10 + 64 + 40 + + + + Qt::NoFocus + + + Cancel + + + + + + 30 + 10 + 64 + 40 + + + + Qt::NoFocus + + + Clear + + + + + + + 20 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 130 + 40 + 331 + 21 + + + + + + + Pattern setting > Alignment preview + + + + + + 10 + 90 + 991 + 60 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 14 + 32 + 32 + + + + + + + + + + + + + 60 + 14 + 32 + 32 + + + + + + + + + + + + + 100 + 14 + 32 + 32 + + + + + + + + + + + + + 140 + 14 + 32 + 32 + + + + + + + + + + + + + 180 + 14 + 32 + 32 + + + + + + + + + + + + + 220 + 14 + 32 + 32 + + + + + + + + + + + + + 260 + 14 + 32 + 32 + + + + + + + + + + + + + 300 + 14 + 32 + 32 + + + + + + + + + + + + + 340 + 14 + 32 + 32 + + + + + + + + + + + + + 380 + 14 + 32 + 32 + + + + + + + + + + + + + 420 + 14 + 32 + 32 + + + + + + + + + + 460 + 14 + 32 + 32 + + + + + + + + + + 700 + 14 + 32 + 32 + + + + + + + + + + 740 + 14 + 32 + 32 + + + + + + + + + + 820 + 14 + 32 + 32 + + + + + + + + + + 500 + 14 + 32 + 32 + + + + + + + + + + 660 + 14 + 32 + 32 + + + + + + + + + + 860 + 14 + 32 + 32 + + + + + + + + + + 540 + 14 + 32 + 32 + + + + + + + + + + 580 + 14 + 32 + 32 + + + + + + + + + + 620 + 14 + 32 + 32 + + + + + + + + + + 900 + 14 + 32 + 32 + + + + + + + + + + 780 + 14 + 32 + 32 + + + + + + + + + + 940 + 14 + 32 + 32 + + + + + + + + + + + 10 + 160 + 991 + 60 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 14 + 32 + 32 + + + + + + + + + + 180 + 14 + 32 + 32 + + + + + + + + + + 140 + 14 + 32 + 32 + + + + + + + + + + 60 + 14 + 32 + 32 + + + + + + + + + + 900 + 14 + 32 + 32 + + + + + + + + + + 500 + 14 + 32 + 32 + + + + + + + + + + 580 + 14 + 32 + 32 + + + + + + + + + + 620 + 14 + 32 + 32 + + + + + + + + + + 300 + 14 + 32 + 32 + + + + + + + + + + 940 + 14 + 32 + 32 + + + + + + + + + + 860 + 14 + 32 + 32 + + + + + + + + + + 460 + 14 + 32 + 32 + + + + + + + + + + 540 + 14 + 32 + 32 + + + + + + + + + + 780 + 14 + 32 + 32 + + + + + + + + + + 700 + 14 + 32 + 32 + + + + + + + + + + 100 + 14 + 32 + 32 + + + + + + + + + + 220 + 14 + 32 + 32 + + + + + + + + + + 340 + 14 + 32 + 32 + + + + + + + + + + 420 + 14 + 32 + 32 + + + + + + + + + + 740 + 14 + 32 + 32 + + + + + + + + + + 820 + 14 + 32 + 32 + + + + + + + + + + 660 + 14 + 32 + 32 + + + + + + + + + + 380 + 14 + 32 + 32 + + + + + + + + + + 260 + 14 + 32 + 32 + + + + + + + + + + + 10 + 230 + 991 + 60 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 14 + 32 + 32 + + + + + + + + + + 180 + 14 + 32 + 32 + + + + + + + + + + 140 + 14 + 32 + 32 + + + + + + + + + + 60 + 14 + 32 + 32 + + + + + + + + + + 900 + 14 + 32 + 32 + + + + + + + + + + 500 + 14 + 32 + 32 + + + + + + + + + + 580 + 14 + 32 + 32 + + + + + + + + + + 620 + 14 + 32 + 32 + + + + + + + + + + 300 + 14 + 32 + 32 + + + + + + + + + + 940 + 14 + 32 + 32 + + + + + + + + + + 860 + 14 + 32 + 32 + + + + + + + + + + 460 + 14 + 32 + 32 + + + + + + + + + + 540 + 14 + 32 + 32 + + + + + + + + + + 780 + 14 + 32 + 32 + + + + + + + + + + 700 + 14 + 32 + 32 + + + + + + + + + + 100 + 14 + 32 + 32 + + + + + + + + + + 220 + 14 + 32 + 32 + + + + + + + + + + 340 + 14 + 32 + 32 + + + + + + + + + + 420 + 14 + 32 + 32 + + + + + + + + + + 740 + 14 + 32 + 32 + + + + + + + + + + 820 + 14 + 32 + 32 + + + + + + + + + + 660 + 14 + 32 + 32 + + + + + + + + + + 380 + 14 + 32 + 32 + + + + + + + + + + 260 + 14 + 32 + 32 + + + + + + + + + + + 80 + 320 + 451 + 251 + + + + + + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + frameBGImg + frameBack + labelMainTitle + framePageBtn + buttonTypeLogo + labelSubTitle + frameFront + frameMiddle + frameBehind + labelImage + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/patternselectwidget.cpp b/sharedviews/patternselectwidget.cpp new file mode 100644 index 0000000..09fd02b --- /dev/null +++ b/sharedviews/patternselectwidget.cpp @@ -0,0 +1,1025 @@ +#include "patternselectwidget.h" +#include "ui_patternselectwidget.h" + +PatternSelectWidget::PatternSelectWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::PatternSelectWidget), + m_itemPerPage(10) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + usbFlag = false; + usbPath = ""; + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + + this->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + initControl(); + initialize(); +} + +PatternSelectWidget::~PatternSelectWidget() +{ + delete ui; +} + +//初始化窗体控件,包括位置、尺寸、样式 +void PatternSelectWidget::initControl() +{ + m_imageButtonList.clear(); + m_imageButtonList.append(ui->buttonImage1); + m_imageButtonList.append(ui->buttonImage2); + m_imageButtonList.append(ui->buttonImage3); + m_imageButtonList.append(ui->buttonImage4); + m_imageButtonList.append(ui->buttonImage5); + m_imageButtonList.append(ui->buttonImage6); + m_imageButtonList.append(ui->buttonImage7); + m_imageButtonList.append(ui->buttonImage8); + m_imageButtonList.append(ui->buttonImage9); + m_imageButtonList.append(ui->buttonImage10); + + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void PatternSelectWidget::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + ui->frameImage->setGeometry(27*factoryX,108*factoryY,1000*factoryX,431*factoryY); + + //预览图片 + QRect rectImage(18*factoryX,9*factoryY,120*factoryX,156*factoryY); + QRect rectName(18*factoryX,166*factoryY,120*factoryX,42*factoryY); + for(int i = 0; i < 2; i++) + { + s16 num = m_imageButtonList.size()/2; + for(int j = 0; j < num; j++) + { + m_imageButtonList.at(i*num + j)->setGeometry((25+j*192)*factoryX,(8+i*204)*factoryY,158*factoryX,190*factoryY); + m_imageButtonList.at(i*num + j)->initUpImageDownName(rectImage,rectName); + } + } + ui->frameRightUp->setGeometry(0*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_MICON_SIZE)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonBackUpDir->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_MICON_SIZE))*factoryX,0*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonPatternEdit->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_MICON_SIZE+GLB_EDGE_WIGHT+GLB_MICON_SIZE))*factoryX,0*factoryY,GLB_MICON_SIZE*factoryX,GLB_MICON_SIZE*factoryY); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPageNum->setFont(fontSize_M()); + ui->labelPageNum->setStyleSheet(titleTextColour()); + + // ui->frameInfo1->setGeometry(1528,210,328,284); + ui->frameInfo1->hide(); //屏蔽右侧状态栏 + + QList labelList1; + labelList1.append(ui->labelPatternName); + labelList1.append(ui->labelTotalNeedle); + labelList1.append(ui->labelPatternWidth); + labelList1.append(ui->labelPatternHeight); + labelList1.append(ui->labelX); + labelList1.append(ui->labelY); + for(int i = 0; i < labelList1.size(); i++) + { + labelList1[i]->setGeometry(5*factoryX,(i*26)*factoryY,90*factoryX,32*factoryY); + labelList1[i]->setFont(fontSize_M()); + labelList1[i]->setStyleSheet(titleTextColour()); + } + + QList labelList2; + labelList2.append(ui->labelPatternNameValue); + labelList2.append(ui->labelTotalNeedleValue); + labelList2.append(ui->labelPatternWidthValue); + labelList2.append(ui->labelPatternHeightValue); + labelList2.append(ui->labelXValue); + labelList2.append(ui->labelYValue); + for(int i = 0; i < labelList2.size(); i++) + { + labelList2[i]->setGeometry(42*factoryX,(i*26)*factoryY,140*factoryX,32*factoryY); + labelList2[i]->setFont(fontSize_M()); + labelList2[i]->setStyleSheet(titleTextColour()); + } + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelPageNum->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_LBUT_WIGHT*2*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); +} + +//初始化窗体分辨率 +void PatternSelectWidget::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,533*scaleX,24*scaleY); + ui->frameImage->setGeometry(27*scaleY,92*scaleY,999*scaleX,431*scaleY); + + //预览图片 + QRect rectImage(4*scaleX,8*scaleY,140*scaleX,140*scaleY); + QRect rectName(32*scaleX,154*scaleY,112*scaleX,42*scaleY); + for(int i = 0; i < 2; i++) + { + s16 num = m_imageButtonList.size()/2; + for(int j = 0; j < num; j++) + { + m_imageButtonList.at(i*num + j)->setGeometry(36+j*188*scaleX ,0+i*220*scaleY,148*scaleX,196*scaleY); + m_imageButtonList.at(i*num + j)->initUpImageDownName(rectImage,rectName); + } + } + + ui->frameRightUp->setGeometry(800*scaleX,4*scaleY,300*scaleX,61*scaleY); + ui->buttonBackUpDir->setGeometry(150*scaleX,0,50*scaleX,50*scaleY); + + //label样式 + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(titleTextColour()); + ui->labelPageNum->setFont(fontSize_M()); + ui->labelPageNum->setStyleSheet(titleTextColour()); + + ui->frameInfo1->hide(); + + QList labelList1; + labelList1.append(ui->labelPatternName); + labelList1.append(ui->labelTotalNeedle); + labelList1.append(ui->labelPatternWidth); + labelList1.append(ui->labelPatternHeight); + labelList1.append(ui->labelX); + labelList1.append(ui->labelY); + for(int i = 0; i < labelList1.size(); i++) + { + labelList1[i]->setGeometry(5*scaleX,i*26*scaleY,90*scaleX,32*scaleY); + labelList1[i]->setFont(fontSize_M()); + labelList1[i]->setStyleSheet(titleTextColour()); + } + + QList labelList2; + labelList2.append(ui->labelPatternNameValue); + labelList2.append(ui->labelTotalNeedleValue); + labelList2.append(ui->labelPatternWidthValue); + labelList2.append(ui->labelPatternHeightValue); + labelList2.append(ui->labelXValue); + labelList2.append(ui->labelYValue); + for(int i = 0; i < labelList2.size(); i++) + { + labelList2[i]->setGeometry(42*scaleX,i*26*scaleY,140*scaleX,32*scaleY); + labelList2[i]->setFont(fontSize_M()); + labelList2[i]->setStyleSheet(titleTextColour()); + } + + ui->framePageBtn->setGeometry(584*scaleX,530*scaleY,427*scaleX,40*scaleY); + ui->labelPageNum->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(0,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonOk->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); +} + +//初始化窗体控件样式 +void PatternSelectWidget::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getStyleSheet(this->objectName()); + ui->frameBack->setStyleSheet(frameBackImgPath); + + //frame样式 + ui->framePageBtn->setStyleSheet(transparentStyle()); + ui->frameImage->setStyleSheet(transparentStyle()); + ui->frameInfo1->setStyleSheet(transparentStyle()); + ui->frameRightUp->setStyleSheet(transparentStyle()); + + //条目 + for(int i = 0; i < m_itemPerPage; i++) + { + m_imageButtonList[i]->setCheckedBottomImage(setControlStyle.getBottomStyleSheet(m_imageButtonList[i]->parent()->objectName())); + m_imageButtonList[i]->setLabelFont(fontSize_M()); + } + + ui->buttonBackUpDir->setStyleSheet(backIconStyle());; + ui->buttonBackUpDir->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonBackUpDir->objectName())); + ui->buttonPatternEdit->setStyleSheet(backIconStyle());; + ui->buttonPatternEdit->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonPatternEdit->objectName())); + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + +//初始化 +void PatternSelectWidget::initialize() +{ + m_firstFilePath.clear(); + m_curFilePath.clear(); + m_fileItemList.clear(); + + m_curPages = 1;//花样选择界面当前页数 + m_pageNums = 1;//总页数 + m_selectedPattenIdx = -1;//被选中的花版号 + ui->buttonPatternEdit->setEnabled(false); + + initPattern(); +} + +//初始化花样 +void PatternSelectWidget::initPattern() +{ + //花样文件目录 + QDir apppath(qApp->applicationDirPath()); + QString filePath = apppath.path() + apppath.separator() + PATTERNPATH; + m_firstFilePath = QDir(filePath).absolutePath();//为了将"\"变为"/" + getDirPatternFiles(m_firstFilePath); +} + +//获取花样文件下的路径或者花样 +void PatternSelectWidget::getDirPatternFiles(QString dirPath) +{ + m_curFilePath = dirPath;//记录当前目录 + if(m_curFilePath == m_firstFilePath)//如果当前目录为一级目录 + { + ui->buttonBackUpDir->setEnabled(false);//设置按钮不可按(返回上级目录按钮) + } + else + { + ui->buttonBackUpDir->setEnabled(true);//设置按钮可按(返回上级目录按钮) + } + + createCurDirPatterns(); +} +//刷新界面显示 +void PatternSelectWidget::refreshPageUi() +{ + int itemNum; + if (m_fileItemList.size() <= 0) + { + itemNum = 0; + + for (int i = 0; i < m_itemPerPage; i++) + { + m_imageButtonList.at(i)->hide(); + } + ui->labelPageNum->setText(tr("PageNum: 0/0"));//页数: 0/0 + ui->buttonPgUp->setEnabled(false); + ui->buttonPgDn->setEnabled(false); + ui->buttonOk->setEnabled(false); + ui->buttonPatternEdit->setEnabled(false); + + clearFileInfo(); + return; + } + else + { + itemNum = m_fileItemList.size(); + } + + m_pageNums = (itemNum + m_itemPerPage - 1)/m_itemPerPage;// 计算页数 + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages <= 1) + { + m_curPages = 1; + } + + int itemidx = (m_curPages - 1) * m_itemPerPage; + + for (int i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + QImage image = m_fileItemList.at(itemidx).getPreviewImage(); + m_imageButtonList[i]->setPreviewImage(image); + m_imageButtonList[i]->setLabelName(m_fileItemList.at(itemidx).getShowInfo()); + m_imageButtonList.at(i)->show(); + + itemidx++; + } + else + { + m_imageButtonList.at(i)->hide(); + } + } + + // 翻页按钮 + if (m_curPages <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPages >= m_pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + // 页信息 + if(m_pageNums == 0) + { + m_curPages = 0; + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPageNum->setText(str); + + refreshCheckedPage(); + refreshChecked(); +} + +//刷新条目选中状态 +void PatternSelectWidget::refreshCheckedPage() +{ + int num =m_fileItemList.size(); + if (num <= m_selectedPattenIdx)//没有花版 num = 0 + { + m_selectedPattenIdx = -1; + } + + if(m_selectedPattenIdx == -1)//被选中的花版号初始化的时候就是-1 + { + clearFileInfo();//清空花样信息 + ui->buttonOk->setEnabled(false); + ui->buttonPatternEdit->setEnabled(false); + } + else + { + ui->buttonOk->setEnabled(true); + ui->buttonPatternEdit->setEnabled(true); + } + + // 刷新页面中被选择的条目 + for(int var = 0; var < m_itemPerPage; var++)//var < 花样选择界面每页图片数 + { + int idx = (m_curPages - 1) * (m_itemPerPage) + var; + if(m_selectedPattenIdx == idx)//选中的花版号等于 idx + { + QString filePath = m_fileItemList.at(m_selectedPattenIdx).getFilePath();//m_fileItemList 花样列表,从0开始 + QFileInfo file(filePath); + if(file.isDir())//为文件夹 + { + m_selectedPattenIdx = -1; + getDirPatternFiles(filePath); + return; + } + + //所选文件 + QString ext = file.suffix().toUpper(); + getFileInfo(filePath,ext);//获取花样信息 + + // 条目被选中 + m_imageButtonList.at(var)->setCheckable(true); + m_imageButtonList.at(var)->setChecked(true); + } + else + { + // 不被选中 + m_imageButtonList.at(var)->setChecked(false); + m_imageButtonList.at(var)->setCheckable(false); + } + } +} + +void PatternSelectWidget::refreshChecked() +{ + int num =m_fileItemList.size(); + if (num <= m_selectedPattenIdx)//没有花版 num = 0 + { + m_selectedPattenIdx = -1; + } + + if(m_selectedPattenIdx == -1)//被选中的花版号初始化的时候就是-1 + { + clearFileInfo();//清空花样信息 + ui->buttonOk->setEnabled(false); + ui->buttonPatternEdit->setEnabled(false); + } + else + { + ui->buttonOk->setEnabled(true); + ui->buttonPatternEdit->setEnabled(true); + } + + // 刷新页面中被选择的条目 + for(int var = 0; var < m_itemPerPage; var++)//var < 花样选择界面每页图片数 + { + int idx = (m_curPages - 1) * (m_itemPerPage) + var; + if(m_selectedPattenIdx == idx && m_selectedPattenIdx >= 0)//选中的花版号等于 idx + { + QString filePath = m_fileItemList.at(m_selectedPattenIdx).getFilePath();//m_fileItemList 花样列表,从0开始 + QFileInfo file(filePath); + if(file.isDir())//为文件夹 + { + m_selectedPattenIdx = -1; + getDirPatternFiles(filePath); + return; + } + + // 条目被选中 + m_imageButtonList.at(var)->setCheckable(true); + m_imageButtonList.at(var)->setChecked(true); + } + else + { + // 不被选中 + m_imageButtonList.at(var)->setChecked(false); + m_imageButtonList.at(var)->setCheckable(false); + } + } +} + +//点击花样图片 +void PatternSelectWidget::clickItem(int idx) +{ + if(m_fileItemList.size() <= 0) + { + return; + } + m_selectedPattenIdx = (m_curPages - 1) * m_itemPerPage + idx - 1; + refreshCheckedPage(); +} + +//清空花样信息 +void PatternSelectWidget::clearFileInfo() +{ + ui->labelPatternHeightValue->clear(); + ui->labelPatternNameValue->clear(); + ui->labelPatternWidthValue->clear(); + ui->labelTotalNeedleValue->clear(); + ui->labelXValue->clear(); + ui->labelYValue->clear(); +} + +//获取花样信息 +void PatternSelectWidget::getFileInfo(QString filePath, QString suffix) +{ + QFileInfo file(filePath); + QString fileName = file.fileName(); + int size = fileName.length(); + QString str = tr("Pattern setting") + "> " + tr("Pattern selection") + "> "; + str += fileName; + ui->labelSubTitle->setText(str); + + if(size > NAMEMAXLENGTH)//花样名称过长时截取 + { + fileName = fileName.mid(0,NAMEMAXLENGTH) + "~"; + } + + if(suffix == "DST")//dst文件 + { + //qDebug()<<"dst click begin"; + + DataFileDst dst; + dst.initFile(filePath); + dst.convertDataToAbs(); + + ui->labelPatternNameValue->setText(fileName); + ui->labelTotalNeedleValue->setText(QString::number(dst.getStitchNums())); + + double width = dst.getDatWidth()*0.01; + ui->labelPatternWidthValue->setText(QString("%1").arg(width)); + + double height = dst.getDatHeight()*0.01; + ui->labelPatternHeightValue->setText(QString("%1").arg(height)); + + double maxX = dst.getMaxX()*0.01; + double minX = dst.getMinX()*0.01; + ui->labelXValue->setText(QString("(%1,%2)").arg(maxX).arg(minX)); + + double maxY = dst.getMaxY()*0.01; + double minY = dst.getMinY()*0.01; + ui->labelYValue->setText(QString("(%1,%2)").arg(maxY).arg(minY)); + + //qDebug()<<"showfileinfo end"; + } + else if(suffix == "DSR")//dsr文件 + { + // + DataFileDsr dsr; + dsr.initFile(filePath); + dsr.convertDataToEmbAbs(); + ui->labelPatternNameValue->setText("fileName"); + ui->labelTotalNeedleValue->setText(QString::number(dsr.getStitchNums())); + + double width = dsr.getDatWidth()*0.01; + ui->labelPatternWidthValue->setText(QString("%1").arg(width)); + + double height = dsr.getDatHeight()*0.01; + ui->labelPatternHeightValue->setText(QString("%1").arg(height)); + + double maxX = dsr.getMaxX()*0.01; + double minX = dsr.getMinX()*0.01; + ui->labelXValue->setText(QString("(%1,%2)").arg(maxX).arg(minX)); + + double maxY = dsr.getMaxY()*0.01; + double minY = dsr.getMinY()*0.01; + ui->labelYValue->setText(QString("(%1,%2)").arg(maxY).arg(minY)); + } + else if(suffix == "QUI") + { + DataFileQui qui; + qui.initFile(filePath); + qui.convertDataToEmbAbs(); + + ui->labelPatternNameValue->setText(fileName); + ui->labelTotalNeedleValue->setText(QString::number(qui.getStitchNums())); + + double width = qui.getDatWidth()*0.01; + ui->labelPatternWidthValue->setText(QString("%1").arg(width)); + + double height = qui.getDatHeight()*0.01; + ui->labelPatternHeightValue->setText(QString("%1").arg(height)); + + double maxX = qui.getMaxX()*0.01; + double minX = qui.getMinX()*0.01; + ui->labelXValue->setText(QString("(%1,%2)").arg(maxX).arg(minX)); + + double maxY = qui.getMaxY()*0.01; + double minY = qui.getMinY()*0.01; + ui->labelYValue->setText(QString("(%1,%2)").arg(maxY).arg(minY)); + } + else if(suffix == "QUIX") + { + DataFileQuix quix; + quix.initFile(filePath); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + quix.doubleHeadConvertDataToEmbAbs(); + } + else + { + quix.convertDataToEmbAbs(); + } + + ui->labelPatternNameValue->setText(fileName); + ui->labelTotalNeedleValue->setText(QString::number(quix.getStitchNums())); + + double width = quix.getDatWidth()*0.01; + ui->labelPatternWidthValue->setText(QString("%1").arg(width)); + + double height = quix.getDatHeight()*0.01; + ui->labelPatternHeightValue->setText(QString("%1").arg(height)); + + double maxX = quix.getMaxX()*0.01; + double minX = quix.getMinX()*0.01; + ui->labelXValue->setText(QString("(%1,%2)").arg(maxX).arg(minX)); + + double maxY = quix.getMaxY()*0.01; + double minY = quix.getMinY()*0.01; + ui->labelYValue->setText(QString("(%1,%2)").arg(maxY).arg(minY)); + } + else if(suffix == "PLT") + { + } + else if(suffix == "DXF") + { + } + + //qDebug()<<"get patternpara begin"; +} + +//设置类型图标 +void PatternSelectWidget::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +//设置主title +void PatternSelectWidget::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +//设置副title +void PatternSelectWidget::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +//生成当前路径花样 +void PatternSelectWidget::createCurDirPatterns() +{ + m_fileItemList.clear(); + QDir dir(m_curFilePath); + + if (usbFlag) //如果usbFlag为true + { + dir.setPath(usbPath); //设置路径为 usbPath + usbFlag = false; + } + + // 打开文件所在的路径 + if(!dir.exists()) + { + m_curPages = 0; + m_pageNums = 0; + qDebug() << "dirpath not exist, name=" << m_curFilePath; + + dir.mkdir(m_curFilePath);//创建花样文件夹 + } + + QString fileName; + QString filePath; + FileItem item; + + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); // 设置类型过滤器,只为文件夹和文件格式 + dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase); // 设置排序方式 + + QFileInfoList fileList = dir.entryInfoList(); + int count = fileList.count(); + + for(int i = 0; i < count; i++) + { + QImage image(QSize(ui->buttonImage1->labelImage->width(), ui->buttonImage1->labelImage->height()), IMAGE_TYPE); + QFileInfo fileInfo = fileList[i]; + + if(fileInfo.isDir())//为文件夹 + { + filePath = fileInfo.absoluteFilePath(); + fileName = fileInfo.baseName(); + //QString imageName = ":/images/folder.png"; + if(g_emResolut == resolution1006) + { + image.load(":/images/folder.png"); + } + else if(g_emResolut == resolution1910) + { + image.load(":/images/folderBig.png"); + } + if(g_emResolut == resolution0804) + { + image.load(":/images/folder.png"); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else//为文件 + { + filePath = fileInfo.absoluteFilePath(); + fileName = fileInfo.fileName(); + QString imageName = filePath + ".preview.png"; + QFile imageFile(imageName); + + if(fileInfo.suffix().toUpper() == "DST")//为dst文件 + { + //排除机型 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING || g_emMacType == MACHINE_CUTTINGWALK) + continue; + + if(!imageFile.exists())//图片不存在时生成图片 + { + DataFileDst dst; + //重新改变图片大小,因为文件夹的图标大小与图片大小不同 + dst.initFile(filePath); + dst.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + else + { + image.load(imageName); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else if(fileInfo.suffix().toUpper() == "DSR")//dsr文件 + { + if(g_emMacType == MACHINE_CUTTINGWALK) + continue; + + if(!imageFile.exists())//图片不存在时生成图片 + { + DataFileDsr dsr; + dsr.initFile(filePath); + dsr.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + else + { + image.load(imageName); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else if(fileInfo.suffix().toUpper() == "QUI") + { + //排除机型 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING + || g_emMacType == MACHINE_THICK_WIRING || g_emMacType == MACHINE_CUTTINGWALK + ) + continue; + + if(!imageFile.exists())//图片不存在时生成图片 + { + DataFileQui qui; + qui.initFile(filePath); + qui.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + else + { + image.load(imageName); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else if(fileInfo.suffix().toUpper() == "QUIX") + { + //排除机型 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING + || g_emMacType == MACHINE_THICK_WIRING || g_emMacType == MACHINE_CUTTINGWALK) + continue; + if(!imageFile.exists())//图片不存在时生成图片 + { + DataFileQuix quix; + quix.initFile(filePath); + if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI) + { + quix.doubleHeadCreatePreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + else + { + quix.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + } + else + { + image.load(imageName); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else if(fileInfo.suffix().toUpper() == "PLT") + { + //排除机型 + if(g_emMacType == MACHINE_FIVEHEADPRECISIONSEWING + || g_emMacType == MACHINE_THICK_WIRING) + continue; + if(!imageFile.exists())//图片不存在时生成图片 + { + ImportHPGL importHPGL; + //判断是否为加密文件 + if (importHPGL.IsSecretFile(filePath) == true) + { + // 文件路径 + QDir apppath(qApp->applicationDirPath()); + QString strSecretFile = apppath.path() + apppath.separator() + "Secret.plt"; + + importHPGL.BitMapDtat(filePath,strSecretFile); + importHPGL.IniPara(); + importHPGL.ReadSecretFile(strSecretFile); + } + else + { + importHPGL.IniPara(); + importHPGL.Read(filePath); + } + importHPGL.createPreviewImage(&image, 1, PEN_WIDTH);// 生成预览文件 + } + else + { + image.load(imageName); + } + item.setFileInfo(filePath,fileName,image); + m_fileItemList.append(item); + } + else if(fileInfo.suffix().toUpper() == "DXF" && g_emMacType != MACHINE_FIVEHEADPRECISIONSEWING) + { + } + } + } + + refreshPageUi(); + refreshChecked(); +} + +//获取绘图区域大小 +QSize PatternSelectWidget::getImageSize() +{ + QSize size = ui->buttonImage1->labelImage->size(); + return size; +} + +void PatternSelectWidget::on_buttonImage1_clicked() +{ + clickItem(1); +} + +void PatternSelectWidget::on_buttonImage2_clicked() +{ + clickItem(2); +} + +void PatternSelectWidget::on_buttonImage3_clicked() +{ + clickItem(3); +} + +void PatternSelectWidget::on_buttonImage4_clicked() +{ + clickItem(4); +} + +void PatternSelectWidget::on_buttonImage5_clicked() +{ + clickItem(5); +} + +void PatternSelectWidget::on_buttonImage6_clicked() +{ + clickItem(6); +} + +void PatternSelectWidget::on_buttonImage7_clicked() +{ + clickItem(7); +} + +void PatternSelectWidget::on_buttonImage8_clicked() +{ + clickItem(8); +} + +void PatternSelectWidget::on_buttonImage9_clicked() +{ + clickItem(9); +} + +void PatternSelectWidget::on_buttonImage10_clicked() +{ + clickItem(10); +} + +void PatternSelectWidget::on_buttonBackUpDir_clicked() +{ + if(m_curFilePath.size() <= 0) + { + return; + } + + QDir dir(m_curFilePath); + dir.cdUp();//返回上级目录 + QString path = dir.absolutePath();//得到上级目录 + m_fileItemList.clear(); + m_selectedPattenIdx = -1; + getDirPatternFiles(path);//打开上级目录 +} + +void PatternSelectWidget::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshPageUi(); +} + +void PatternSelectWidget::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshPageUi(); +} + +void PatternSelectWidget::on_buttonOk_clicked() +{ + if(m_selectedPattenIdx < 0) + { + return; + } + + int patternNeedles = ui->labelTotalNeedleValue->text().toInt(); + if(patternNeedles > EMBALLOWNEEDLELIMIT)//大于200万针 + { + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + //所选花样针数已达上限(200万针),不可绣作! + str = tr("The number of stitches of the selected pattern has reached the upper limit (2 million stitches), and it cannot be embroidered!"); + promptDlg.setContentStr(str); + + promptDlg.exec(); + return; + } + + emit siSelectPattern(m_fileItemList.at(m_selectedPattenIdx).getFilePath()); + + //this->hide(); +} + +void PatternSelectWidget::on_buttonCancel_clicked() +{ + this->hide(); +} + +void PatternSelectWidget::mousePressEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mousePressX = e->x(); + m_mousePressY = e->y(); + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + } +} + +void PatternSelectWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mouseReleaseX = e->x(); + m_mouseReleaseY = e->y(); + } + + int width = this->width(); + int height = this->height(); + if ((m_mousePressX >= 0 && m_mousePressX <= 100) && + ((m_mousePressY >= (height - 100)) && m_mousePressY <= height) && + ((m_mouseReleaseX >= (width - 100)) && m_mouseReleaseX <= width) && + ((m_mouseReleaseY >= (height - 100)) && m_mouseReleaseY <= height)) + { + MainWidgetFunction mainFunction; + QString usbPath;//优盘路径 + usbPath = mainFunction.detectUsb();//优盘检测 + if(usbPath.length() <= 0) + { + //优盘不存在 + return; + } + else + { + QPixmap pixmap=QPixmap::grabWindow(this->winId(),0,0,this->width(),this->height());//截屏存放在pixmap + QString name_pc = usbPath + "EMB" + // + QDateTime::currentDateTime().toString("yyyyMMdd") +//获取时期时间 + +"_"+ + QDateTime::currentDateTime().toString("hhmmss") + ".png"; + + pixmap.save(name_pc,"png"); // 路径 + } + } + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; +} + +//花样编辑 +void PatternSelectWidget::on_buttonPatternEdit_clicked() +{ + if(m_selectedPattenIdx < 0) + { + return; + } + QString filePath = m_fileItemList.at(m_selectedPattenIdx).getFilePath(); + emit siPatternEdit(filePath); +} diff --git a/sharedviews/patternselectwidget.h b/sharedviews/patternselectwidget.h new file mode 100644 index 0000000..4f80875 --- /dev/null +++ b/sharedviews/patternselectwidget.h @@ -0,0 +1,123 @@ +#ifndef PATTERNSELECTWIDGET_H +#define PATTERNSELECTWIDGET_H + +#include +#include +#include +#include + +#include "mybutton.h" +#include "items/fileitem.h" +#include "setcontrolstyle.h" +//#include "Include/datafiledst.h" +//#include "Include/datafilecomb.h" +//#include "Include/embdata.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "datafile/datafilequi.h" +#include "datafile/datafilequix.h" +#include "datafile/hpgl/importhpgl.h" +#include "promptdialog.h" +#include +#include +#include "mctype/mainwidgetfunction.h" + + +#define EMBALLOWNEEDLELIMIT 2000000 //绣作允许最大针数上限 + +namespace Ui { +class PatternSelectWidget; +} + +class PatternSelectWidget : public QWidget +{ + Q_OBJECT + +public: + explicit PatternSelectWidget(QWidget *parent = 0); + ~PatternSelectWidget(); + + bool usbFlag; + QString usbPath;//usb目录 +private: + Ui::PatternSelectWidget *ui; + int m_itemPerPage;//花样选择界面每页图片数 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + +private: + QString m_firstFilePath;//文件一级目录 + QString m_curFilePath;//当前选择目录 + QList m_fileItemList;//花样选择界面花样文件列表 + + int m_curPages;//花样选择界面当前页数 + int m_pageNums;//总页数 + int m_selectedPattenIdx;//被选中的花版号 + + QList m_imageButtonList; + +private: + void initialize();//初始化 + void initPattern();//初始化花样 + void getDirPatternFiles(QString dirPath);//获取路径下的花样 + void refreshPageUi();//刷新界面显示 + void refreshCheckedPage();//刷新条目选中状态 + void refreshChecked();//刷新条目选中状态 + void clickItem(int idx);//点击花样图片 + void clearFileInfo();//清空花样信息 + void getFileInfo(QString filePath, QString suffix);//获取花样信息 + +public: + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + +public slots: + void createCurDirPatterns();//生成当前路径花样 + +public: + QSize getImageSize();//获取绘图区域大小 + +private slots: + //点击图片按钮事件 + void on_buttonImage1_clicked(); + void on_buttonImage2_clicked(); + void on_buttonImage3_clicked(); + void on_buttonImage4_clicked(); + void on_buttonImage5_clicked(); + void on_buttonImage6_clicked(); + void on_buttonImage7_clicked(); + void on_buttonImage8_clicked(); + void on_buttonImage9_clicked(); + void on_buttonImage10_clicked(); + void on_buttonBackUpDir_clicked(); + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void on_buttonPatternEdit_clicked(); + +signals: + void siSelectPattern(QString filePath, s16 showFlag = 0);//选择花样并点击确定按钮 + void siPatchPattern(QString filePath,s16 showFlag = 0);//贴补绣花样并点击确定按钮 + void siPatternEdit(QString filePath); + + //鼠标事件 +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + int m_mousePressX; + int m_mousePressY; + int m_mouseReleaseX; + int m_mouseReleaseY; + + void initControlStyle_BlueVer(); + void initResolution_BlueVer(); +}; + +#endif // PATTERNSELECTWIDGET_H diff --git a/sharedviews/patternselectwidget.ui b/sharedviews/patternselectwidget.ui new file mode 100644 index 0000000..8cb3f52 --- /dev/null +++ b/sharedviews/patternselectwidget.ui @@ -0,0 +1,664 @@ + + + PatternSelectWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + background-color: rgb(162, 162, 162); + + + + + 0 + 90 + 791 + 431 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 10 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 270 + 10 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 400 + 10 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 530 + 10 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 10 + 196 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 530 + 196 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 400 + 196 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 270 + 196 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 196 + 120 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + + 710 + 540 + 301 + 60 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + 80 + 10 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + 150 + 10 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + 220 + 10 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + + 800 + 90 + 222 + 191 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 110 + 16 + + + + Name: + + + + + + 10 + 30 + 110 + 16 + + + + N + + + + + + 10 + 90 + 110 + 16 + + + + H + + + + + + 10 + 70 + 110 + 16 + + + + W + + + + + + 10 + 110 + 110 + 16 + + + + X + + + + + + 10 + 130 + 110 + 16 + + + + Y + + + + + + 130 + 70 + 84 + 16 + + + + Width + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 130 + 130 + 84 + 16 + + + + Y + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 130 + 30 + 84 + 16 + + + + NeedleNum + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 130 + 110 + 84 + 16 + + + + X + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 130 + 10 + 84 + 16 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 130 + 90 + 84 + 16 + + + + Height + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 0 + 0 + 1024 + 600 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 20 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 100 + 10 + 181 + 21 + + + + + + + Pattern Select + + + + + + 130 + 40 + 181 + 21 + + + + + + + Pattern Select < Pattern Setting + + + + + + 629 + 20 + 381 + 61 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 300 + 20 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + 220 + 20 + 64 + 40 + + + + Qt::NoFocus + + + + + + + + + + 20 + 560 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 0/0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + frameBack + frameImage + framePageBtn + frameInfo1 + buttonTypeLogo + labelMainTitle + labelSubTitle + frameRightUp + labelPageNum + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/promptdialog.cpp b/sharedviews/promptdialog.cpp new file mode 100644 index 0000000..d99c05b --- /dev/null +++ b/sharedviews/promptdialog.cpp @@ -0,0 +1,2099 @@ +#include "promptdialog.h" +#include "ui_promptdialog.h" +#include +#include + +PromptDialog::PromptDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PromptDialog) +{ + ui->setupUi(this); + + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + setAttribute(Qt::WA_TranslucentBackground, true); + connect(g_pMachine, SIGNAL(siMcInfoChange()), this, SLOT(slotMCInfoChange())); + + connect(ui->pushButton_BValue,SIGNAL(clicked(bool)),this,SLOT(slot_BladePressure_Clicked())); + + initDialog(); + initControl(); +} + +PromptDialog::~PromptDialog() +{ + delete ui; +} + +//初始化窗体 +void PromptDialog::initDialog(int sel) +{ + m_funType = sel; + m_filePath.clear(); + + m_spindleAngle = 0;//主轴旋转角度值 + m_length = 0;// 自动拉料长度 + m_area = 0; + m_time = 0;//主轴研车-时间 + m_speed = 0;//主轴研车-速度 + + setTitleStr(""); + setContentStr(""); + setContentProcessStr(""); + ui->labelContentInfo->setText(""); + ui->labeBreakHead->setText(""); + ui->buttonOk->setEnabled(true); + + ui->frameDetecBtn->hide(); + ui->frameTwo->hide(); + ui->frameThree->hide(); + ui->frameProcessBtn->hide(); + ui->frameWarrantBtn->hide(); + ui->frameProcess->hide(); + ui->frameChangePassword->hide(); + ui->frameSpindleRotate->hide(); + ui->frameWorkArea->hide(); + ui->frameHMIDecrypt->hide(); + ui->frameKnifePressure->hide(); + ui->frameFanArea->hide(); + ui->frameSpdSelect->hide(); + + ui->labelContentInfo->hide(); + ui->labeBreakHead->hide(); + ui->labelContentProcess->hide(); + ui->labelContentWarrant->hide(); + + ui->frame_Force->hide();//刀压设置弹窗 + ui->frame_FileTransfer->hide();//文件传输弹窗 + ui->frame_KnifeAndPenSd->hide();//铣切机--速度选择 + ui->frameWorkHeadSet->hide();//工作机头设置 + + ui->buttonForward->hide();//隐藏正转按钮 + ui->buttonReverse->hide();//隐藏反转按钮 + + if (sel == BTN_OK_CANCEL)//确定、取消 + { + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if (sel == BTN_OK)//确定 + { + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonOk->move(m_btnCancelPoint); + } + else if (sel == BTN_R_R_S || sel == BTN_O_S_C)//重命名、替换、跳过 覆盖、另存为、关闭 + { + ui->frameThree->show(); + ui->buttonClose->hide(); + ui->buttonOverWrite->hide(); + ui->buttonRename->hide(); + ui->buttonReplace->hide(); + ui->buttonSaveAs->hide(); + ui->buttonSkip->hide(); + + if(sel == BTN_R_R_S) + { + ui->buttonRename->show(); + ui->buttonReplace->show(); + ui->buttonSkip->show(); + } + else + { + ui->buttonClose->show(); + ui->buttonOverWrite->show(); + ui->buttonSaveAs->show(); + } + } + else if (sel == BTN_RESTART)//重启 + { + ui->frameProcessBtn->show(); + ui->buttonRestart->show(); + ui->buttonUpdataCancel->hide(); + ui->buttonRestart->move(m_btnCancelPoint); + } + else if (sel == BTN_UCANCEL)//升级取消 + { + ui->frameProcessBtn->show(); + ui->buttonRestart->hide(); + ui->buttonUpdataCancel->show(); + } + else if (sel == BTN_WARRANT)//授权按钮 + { + ui->frameWarrantBtn->show(); + } + // 底线检测,面线检测 + else if(sel == BTN_BOTTOM || sel == BTN_FACE) + { + ui->frameDetecBtn->show(); + } + else if(sel == BTN_NONE)//无按钮 + { + } + else if(sel == BTN_P_NONE)//无按钮 + { + } + else if(sel == BTN_HMI_DECRYPT)//界面解密 + { + ui->frameHMIDecrypt->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_CHANGE_PASSWORD)//修改一级密码 + { + ui->frameChangePassword->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_SPINDLE_ROTATE)//主轴旋转角度 + { + ui->frameSpindleRotate->show(); + float angle = m_spindleAngle*0.01; + QString angleStr; + angleStr.sprintf("%.2f",angle); + ui->buttonSpindleAngleValue->setText(angleStr); + ui->labelSpindleAngle->setText(tr("Spindle angle")); + ui->labelSpindleAngleUnit->setText(tr("deg")); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + // ui->buttonForward->show();//显示正转按钮 + // ui->buttonReverse->show();//显示反转按钮 + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_ROTATE_ROTATE)//旋转电机旋转 + { + ui->frameSpindleRotate->show(); + ui->buttonSpindleAngleValue->setText("0.00"); + ui->labelSpindleAngle->setText(tr("Rotate angle")); + ui->labelSpindleAngleUnit->setText(tr("deg")); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + // ui->buttonForward->show();//显示正转按钮 + // ui->buttonReverse->show();//显示反转按钮 + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_SPINDLE_GRANDE)//主轴研车 + { + ui->frameSpindleRotate->show(); + ui->buttonSpindleAngleValue->setText("0"); + ui->labelSpindleAngle->setText(tr("Spindle time")); + ui->labelSpindleAngleUnit->setText(tr("s")); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_AUTOMATIC_PULLMA)//自动拉料 + { + ui->frameSpindleRotate->show(); + ui->buttonSpindleAngleValue->setText("0"); + ui->labelSpindleAngle->setText(tr("autoPull")); + ui->labelSpindleAngleUnit->setText(tr("mm")); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + // ui->buttonForward->show();//显示正转按钮 + // ui->buttonReverse->show();//显示反转按钮 + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_WORK_AREA)//设置可工作区域 + { + ui->frameWorkArea->show(); + + ui->buttonX1->setText("X +"); + ui->buttonX2->setText("X -"); + ui->buttonY1->setText("Y +"); + ui->buttonY2->setText("Y -"); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + } + else if(sel == BTN_KNIFE_PRESSURE)//刀压设置 + { + ui->frameKnifePressure->show(); + ui->buttonUp->hide(); + ui->buttonDn->hide(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonOk->move(m_btnCancelPoint); + refreshMcPara(); + } + else if(sel == BTN_FAN_AREA)//风机区域 + { + ui->frameFanArea->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonOk->move(m_btnCancelPoint); + refreshWkPara(); + } + else if(sel == BTN_SPD_SELECT)//平板切割速度选择 + { + ui->frameSpdSelect->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonOk->move(m_btnCancelPoint); + + //发送下位机 + ParaStruct mcPara = g_pMachine->getMcPara(); + //写数据 + ui->buttonKn2_MaxSpd->setText(tr("Kn2Max:")+QString::number(mcPara.buf[171]));//刀2最大 + ui->buttonKn2_MinSpd->setText(tr("Kn2Min:")+QString::number(mcPara.buf[170]));//刀2最小 + ui->buttonKn2_AccSpd->setText(tr("Kn2Acc:")+QString::number(mcPara.buf[172]));//刀2加速 + + if(!g_pSettings->ifKeyExists("FlatPanelSpd/Model")){ + g_pSettings->writeOneToIniFile("FlatPanelSpd/Model",QVariant(1)); + + for(int i = 1; i<6; i++){ + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn1Min",QVariant(10)); + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn1Max",QVariant(600)); + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn1Acc",QVariant(500)); + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn2Min",QVariant(10)); + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn2Max",QVariant(600)); + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn2Acc",QVariant(500)); + } + } + + int model = g_pSettings->readFromIniFile("FlatPanelSpd/Model").toInt(); + // 根据名称查找指针id + QRadioButton *searchedButton = this->findChild("radioButtonSpd_" + QString::number(model)); + searchedButton->click(); + } + else if(sel == BTN_FORCE)//铣切机--刀压 + { + ui->frame_Force->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + + ui->pushButton_collect->setText(tr("Collect"));//刀压采集 + ui->pushButton_collect_bit->setText(tr("Positioning"));//去采集位 + ui->pushButton_test->setText(tr("Testing"));//刀压测试 + ui->pushButton_Blade->setText("4"); + ui->pushButton_Blade->setStyleSheet(knifeStyle4()); + + refreshMcPara(); + } + else if(sel == BTN_FILETRANSFER)//铣切机--文件传输 + { + ui->frame_FileTransfer->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + + ui->button_USB->setText(tr("USB")); + ui->button_Local->setText(tr("Local")); + } + else if(sel == BTN_WORKHEADSET)//工作机头设置 + { + g_pMachine->getParasFromMachine();//读取参数 + delay(100); + int readValue = g_pMachine->getMcPara().buf[PARA_HEADSET]; + + unsigned int data1 = 0, data2 = 0, data = 0; + //int readValue = /* 你的读数,假设 ≥ 0 */; + data1 |= (1U << 0); // data == 1 + data2 |= (1U << 1); + data |= 0b11; // 二进制写法更直观 + if (static_cast(readValue) == data1) //机头1 + { + ui->check_WorkHead_1->setChecked(true); + ui->check_WorkHead_2->setChecked(false); + } + else if (static_cast(readValue) == data2) //机头2 + { + ui->check_WorkHead_1->setChecked(false); + ui->check_WorkHead_2->setChecked(true); + } + else if (static_cast(readValue) == data) //机头12 + { + ui->check_WorkHead_1->setChecked(true); + ui->check_WorkHead_2->setChecked(true); + } + + ui->frameWorkHeadSet->show(); + ui->frameTwo->show(); + ui->buttonOk->show(); + ui->buttonCancel->show(); + ui->buttonOk->move(m_btnOkPoint); + ui->buttonCancel->move(m_btnCancelPoint); + + } + else + { + return; + } +} + +//初始化窗体控件,包括位置、尺寸、样式 +void PromptDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + initResolution(); + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void PromptDialog::initResolution() +{ + int frameLeft = 259; + int frameTop = 156; + int frameWight = 513; + int frameHeight = 291; + int titleHeight = 50; + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + //上状态栏 + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->labelTitle->setGeometry((frameLeft+GLB_EDGE_WIGHT)*factoryX,(frameTop+(titleHeight-GLB_TEXT_HEIGHT)/2)*factoryY,(frameWight-GLB_TAB_WIGHT*2)*factoryX,(GLB_TEXT_HEIGHT+4)*factoryY); + ui->labelContent->setGeometry((frameLeft+GLB_TAB_WIGHT)*factoryX ,(frameTop+GLB_EDGE_HEIGHT)*factoryY, + (frameWight-GLB_TAB_WIGHT*2)*factoryX,(frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT*2)*factoryY);//(46,40,340,285) + ui->labelContentInfo->setGeometry((frameLeft+GLB_TAB_WIGHT)*factoryX ,(frameTop+GLB_EDGE_HEIGHT)*factoryY, + (frameWight-GLB_TAB_WIGHT*2)*factoryX,(frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT*2)*factoryY);//(46,40,350,285) + + ui->labeBreakHead->setGeometry(40*factoryX,40*factoryY,380*factoryX,285*factoryY); + ui->labelContentWarrant->setGeometry(302*factoryX,193*factoryY,300*factoryX,225*factoryY); + ui->frameProcess->setGeometry(145*factoryX,150*factoryY,800*factoryX,280*factoryY);//(20,70,480,130) + ui->labelContentProcess->setGeometry(150*factoryX,80*factoryY,398*factoryX,40*factoryY);//(10,10,398,40) + ui->progressBar->setGeometry(150*factoryX,120*factoryY,446*factoryX,26*factoryY);//进度条(10,50,446,26) + + + ui->frameTwo->setGeometry(frameLeft*factoryX, + (frameTop+frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT)*factoryY, + frameWight*factoryX, + (GLB_LBUT_HEIGHT+GLB_EDGE_HEIGHT)*factoryY); + ui->buttonForward->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*3)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonReverse->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*2)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + + m_btnOkPoint.setX((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX);//ok按钮位置(284) + m_btnOkPoint.setY(0*factoryY); + m_btnCancelPoint.setX((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX);//cancel按钮位置(390) + m_btnCancelPoint.setY(0*factoryY); + + + ui->frameProcessBtn->setGeometry(frameLeft*factoryX, + (frameTop+frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT)*factoryY, + frameWight*factoryX, + (GLB_LBUT_HEIGHT+GLB_EDGE_HEIGHT)*factoryY); + ui->buttonRestart->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonUpdataCancel->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + + ui->frameWarrantBtn->setGeometry(frameLeft*factoryX, + (frameTop+frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT)*factoryY, + frameWight*factoryX, + (GLB_LBUT_HEIGHT+GLB_EDGE_HEIGHT)*factoryY); + ui->buttonWarrant->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonWarrantCancel->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + + ui->frameSpdSelect->setGeometry((frameLeft+25)*factoryX,(frameTop+58)*factoryY,455*factoryX,161*factoryY); + + // ui->buttonKn1_AccSpd->setSizePolicy(); + QString strSpd = tr("Spd"); + ui->radioButtonSpd_1->setText(strSpd + "1");//速度1 + ui->radioButtonSpd_2->setText(strSpd + "2");//速度2 + ui->radioButtonSpd_3->setText(strSpd + "3");//速度3 + ui->radioButtonSpd_4->setText(strSpd + "4");//速度4 + ui->radioButtonSpd_5->setText(strSpd + "5");//速度5 + + connect(ui->radioButtonSpd_1,SIGNAL(clicked(bool)),this,SLOT(slot_SpdSelect_clicked())); + connect(ui->radioButtonSpd_2,SIGNAL(clicked(bool)),this,SLOT(slot_SpdSelect_clicked())); + connect(ui->radioButtonSpd_3,SIGNAL(clicked(bool)),this,SLOT(slot_SpdSelect_clicked())); + connect(ui->radioButtonSpd_4,SIGNAL(clicked(bool)),this,SLOT(slot_SpdSelect_clicked())); + connect(ui->radioButtonSpd_5,SIGNAL(clicked(bool)),this,SLOT(slot_SpdSelect_clicked())); + + connect(ui->buttonKn1_MaxSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + connect(ui->buttonKn1_MinSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + connect(ui->buttonKn1_AccSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + connect(ui->buttonKn2_MaxSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + connect(ui->buttonKn2_MinSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + connect(ui->buttonKn2_AccSpd,SIGNAL(clicked(bool)),this,SLOT(slot_buttonSpdParaModify_clicked())); + + ui->frameWorkArea->setGeometry((frameLeft+25)*factoryX,(frameTop+58)*factoryY,455*factoryX,161*factoryY); + ui->buttonX1->setGeometry(170*factoryX,60*factoryY,70*factoryX,38*factoryY); + ui->buttonX2->setGeometry(10*factoryX,60*factoryY,70*factoryX,38*factoryY); + ui->buttonY1->setGeometry(90*factoryX,10*factoryY,70*factoryX,38*factoryY);//y+ + ui->buttonY2->setGeometry(90*factoryX,120*factoryY,70*factoryX,38*factoryY); + + ui->frameKnifePressure->setGeometry((frameLeft+25)*factoryX,(frameTop+58)*factoryY,455*factoryX,161*factoryY); + + int btny = 70; + int btnwidth = 80; + int btnheight = 38; + + ui->label_LKPara->setGeometry(10*factoryX,20*factoryY,200*factoryX,btnheight*factoryY); + ui->buttonLKParaModify->setGeometry(10*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + ui->buttonLKTest->setGeometry(110*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + + ui->label_RKPara->setGeometry(260*factoryX,20*factoryY,200*factoryX,btnheight*factoryY); + ui->buttonRKParaModify->setGeometry(260*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + ui->buttonRKTest->setGeometry(360*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + + ui->buttonUp->setGeometry(260*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + ui->buttonDn->setGeometry(360*factoryX,btny*factoryY,btnwidth*factoryX,btnheight*factoryY); + + ui->buttonLKParaModify->setText("U1" + tr("Modify"));//U1修改 + ui->buttonLKTest->setText("U1" + tr("Test"));//U1测试 + ui->buttonRKParaModify->setText("U2" + tr("Modify"));//U2修改 + ui->buttonRKTest->setText("U2" + tr("Test"));//U2测试 + + ui->buttonLKParaModify->setStyleSheet(textButtonStyle()); + ui->buttonLKTest->setStyleSheet(textButtonStyle()); + ui->buttonRKParaModify->setStyleSheet(textButtonStyle()); + ui->buttonRKTest->setStyleSheet(textButtonStyle()); + + ui->buttonUp->setStyleSheet(textButtonStyle()); + ui->buttonUp->setText(tr("Up"));//上升 + ui->buttonDn->setStyleSheet(textButtonStyle()); + ui->buttonDn->setText(tr("Down"));//下降 + + ui->label_LKPara->setText("U1:");//U1: + ui->label_RKPara->setText("U2:");//U2: + + QFont size = fontSize_L(); + QString pSize = QString::number(size.pointSize() + 5); + QString style = "QLabel{border-radius:" + borderRadius() + "px;font-size:"+ pSize +"px;font-family:"+ "Microsoft YaHei"+";}"; + + ui->label_LKPara->setStyleSheet(style); + ui->label_RKPara->setStyleSheet(style); + + ui->frameFanArea->setGeometry((frameLeft+25)*factoryX,(frameTop+58)*factoryY,455*factoryX,161*factoryY); + + if(g_emMacType == MACHINE_CUTTINGWALK){ + ui->buttonFanOpen5->setGeometry(70*factoryX,25*factoryY,150*factoryX,80*factoryY); + ui->buttonFanClose5->setGeometry(250*factoryX,25*factoryY,150*factoryX,80*factoryY); + ui->buttonFanSet4->setVisible(false); + ui->buttonFanSet2->setVisible(false); + ui->buttonFanSet3->setVisible(false); + ui->buttonFanSet1->setVisible(false); + ui->buttonFanSet5->setVisible(false); + }else{ + ui->buttonFanOpen5->setGeometry(270*factoryX,25*factoryY,80*factoryX,38*factoryY); + ui->buttonFanClose5->setGeometry(370*factoryX,25*factoryY,80*factoryX,38*factoryY); + + int gapx = 80; + int y = 25; + int x = 60; + ui->buttonFanSet4->setGeometry((x)*factoryX,y*factoryY,70*factoryX,38*factoryY); + ui->buttonFanSet2->setGeometry((x+=gapx)*factoryX,y*factoryY,70*factoryX,38*factoryY); + y+=45; + x = 60; + ui->buttonFanSet3->setGeometry(x*factoryX,y*factoryY,70*factoryX,38*factoryY); + ui->buttonFanSet1->setGeometry((x+=gapx)*factoryX,y*factoryY,70*factoryX,38*factoryY); + ui->buttonFanSet5->setGeometry((270)*factoryX,y*factoryY,80*factoryX,38*factoryY); + } + + connect(ui->buttonFanOpen5,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanClose5,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanSet1,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanSet2,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanSet3,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanSet4,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + connect(ui->buttonFanSet5,SIGNAL(clicked(bool)),this,SLOT(slot_FanArea_clicked())); + ui->buttonFanOpen5->setText(tr("Ctrl Open"));//控制开启 + ui->buttonFanClose5->setText(tr("Ctrl Close"));//控制关闭 + ui->buttonFanClose5->setStyleSheet(textButtonStyle()); + ui->buttonFanOpen5->setStyleSheet(textButtonStyle()); + + //主轴角度旋转 + ui->frameSpindleRotate->setGeometry(180*factoryX,178*factoryY,440*factoryX,161*factoryY); + ui->labelSpindleAngle->setGeometry(150*factoryX,112*factoryY,120*factoryX,40*factoryY); + ui->buttonSpindleAngleValue->setGeometry(275*factoryX,110*factoryY,78*factoryX,40*factoryY); + ui->labelSpindleAngleUnit->setGeometry(364*factoryX,112*factoryY,91*factoryX,40*factoryY); + + //界面解密 + ui->frameHMIDecrypt->setGeometry(40*factoryX,78*factoryY,440*factoryX,161*factoryY); + ui->labelNetworkCardID->setGeometry(10*factoryX,12*factoryY,110*factoryX,40*factoryY); + ui->labelNetworkCardIDValue->setGeometry(130*factoryX,12*factoryY,200*factoryX,40*factoryY); + ui->labelHMIPassword->setGeometry(10*factoryX,52*factoryY,110*factoryX,40*factoryY); + ui->buttonHMIPassword->setGeometry(130*factoryX,50*factoryY,200*factoryX,40*factoryY); + ui->labelDecryptInfo->setGeometry(10*factoryX,92*factoryY,110*factoryX,40*factoryY); + ui->labelDecryptInfoValue->setGeometry(130*factoryX,92*factoryY,200*factoryX,40*factoryY); + + //修改一级密码 + ui->frameChangePassword->setGeometry(0*factoryX,78*factoryY,440*factoryX,161*factoryY); + ui->labelNewPassword->setGeometry(0*factoryX,0*factoryY,140*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonNewPassword->setGeometry(180*factoryX,0*factoryY,200*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelConfirmPassword->setGeometry(0*factoryX,52*factoryY,140*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonConfirmPassword->setGeometry(180*factoryX,52*factoryY,200*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->frameThree->setGeometry(frameLeft*factoryX, + (frameTop+frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT)*factoryY, + frameWight*factoryX, + (GLB_LBUT_HEIGHT+GLB_EDGE_HEIGHT)*factoryY); + ui->buttonRename->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*2)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonReplace->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonSkip->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonOverWrite->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*2)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonSaveAs->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonClose->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + + ui->frameDetecBtn->setGeometry(frameLeft*factoryX, + (frameTop+frameHeight-GLB_LBUT_HEIGHT-GLB_EDGE_HEIGHT)*factoryY, + frameWight*factoryX, + (GLB_LBUT_HEIGHT+GLB_EDGE_HEIGHT)*factoryY); + ui->buttonDetectBegin->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*2)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonDetectEnd->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT-(GLB_BAS_WIGHT+GLB_LBUT_WIGHT)*1)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + ui->buttonDetectClose->setGeometry((frameWight-GLB_EDGE_WIGHT-GLB_LBUT_WIGHT)*factoryX, + 0*factoryY, + GLB_LBUT_WIGHT*factoryX, + GLB_LBUT_HEIGHT*factoryY); + + ui->frame_Force->setGeometry(256*factoryX,188*factoryY,512*factoryX,200*factoryY); + ui->pushButton_collect->setGeometry(104*factoryX,24*factoryY,98*factoryX,48*factoryY); + ui->pushButton_collect_bit->setGeometry(20*factoryX,24*factoryY,70*factoryX,48*factoryY); + ui->pushButton_test->setGeometry(310*factoryX,24*factoryY,98*factoryX,48*factoryY); + ui->pushButton_Pre->setGeometry(52*factoryX,100*factoryY,48*factoryX,64*factoryY); + ui->pushButton_Next->setGeometry(206*factoryX,100*factoryY,48*factoryX,64*factoryY); + ui->pushButton_Blade->setGeometry(104*factoryX,100*factoryY,98*factoryX,64*factoryY); + ui->pushButton_BValue->setGeometry(310*factoryX,100*factoryY,98*factoryX,64*factoryY); + + ui->frame_KnifeAndPenSd->setGeometry(256*factoryX,188*factoryY,512*factoryX,200*factoryY); + ui->label_SpdPen->setGeometry(20*factoryX,10*factoryY,482*factoryX,30*factoryY); + ui->label_SpdKnife->setGeometry(20*factoryX,110*factoryY,482*factoryX,30*factoryY); + ui->frame_Pen->setGeometry(0*factoryX,0*factoryY,512*factoryX,100*factoryY); + ui->frame_Knife->setGeometry(0*factoryX,100*factoryY,512*factoryX,100*factoryY); + ui->radioButton_KMax->setGeometry(80*factoryX,50*factoryY,80*factoryX,40*factoryY); + ui->radioButton_KMid->setGeometry(230*factoryX,50*factoryY,80*factoryX,40*factoryY); + ui->radioButton_KMin->setGeometry(380*factoryX,50*factoryY,80*factoryX,40*factoryY); + ui->radioButton_PMax->setGeometry(80*factoryX,50*factoryY,80*factoryX,40*factoryY); + ui->radioButton_PMid->setGeometry(230*factoryX,50*factoryY,80*factoryX,40*factoryY); + ui->radioButton_PMin->setGeometry(380*factoryX,50*factoryY,80*factoryX,40*factoryY); + + ui->frame_FileTransfer->setGeometry(256*factoryX,188*factoryY,512*factoryX,200*factoryY); + ui->button_USB->setGeometry(100*factoryX,64*factoryY,106*factoryX,68*factoryY); + ui->button_Local->setGeometry(306*factoryX,64*factoryY,106*factoryX,68*factoryY); + + ui->frameWorkHeadSet->setGeometry(216*factoryX,158*factoryY,512*factoryX,200*factoryY); + ui->check_WorkHead_1->setGeometry(100*factoryX,64*factoryY,106*factoryX,68*factoryY); + ui->check_WorkHead_2->setGeometry(286*factoryX,64*factoryY,106*factoryX,68*factoryY); + +} + +//初始化窗体控件样式 +void PromptDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //设置控件图标 + //背景图 + this->setStyleSheet(titleTextColour()); + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + if(g_emTheme == theme2) + { + ui->labelTitle->setStyleSheet(titleTextColour2()); + }else + { + ui->labelTitle->setStyleSheet(transparentStyle()); + } + ui->labelTitle->setFont(fontSize_L()); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); + + ui->frameProcess->setStyleSheet(transparentStyle()); + ui->progressBar->setFont(fontSize_M()); + + ui->labelContent->setStyleSheet(warnTextColour()); + ui->labelContent->setFont(fontSize_L()); + ui->labelContent->setAlignment(Qt::AlignLeft); + ui->labelContent->setAlignment(Qt::AlignVCenter); + + ui->labeBreakHead->setStyleSheet(warnTextColour()); // 断线机头 红色 字体加大 -rq + ui->labeBreakHead->setFont(fontSize_L()); + ui->labeBreakHead->setAlignment(Qt::AlignLeft); + ui->labeBreakHead->setAlignment(Qt::AlignVCenter); + + ui->labelContentInfo->setStyleSheet(warnTextColour()); + ui->labelContentInfo->setFont(fontSize_M()); + ui->labelContentInfo->setAlignment(Qt::AlignLeft); + ui->labelContentInfo->setAlignment(Qt::AlignVCenter); + + ui->labelContentProcess->setStyleSheet(numButtonStyle()); + + ui->labelContentProcess->setFont(fontSize_M()); + ui->labelContentProcess->setAlignment(Qt::AlignLeft); + ui->labelContentProcess->setAlignment(Qt::AlignVCenter); + + ui->labelContentWarrant->setStyleSheet(warnTextColour()); + ui->labelContentWarrant->setFont(fontSize_M()); + ui->labelContentWarrant->setAlignment(Qt::AlignLeft); + ui->labelContentWarrant->setAlignment(Qt::AlignVCenter); + + ui->frameTwo->setStyleSheet(transparentStyle()); + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } + + ui->buttonOverWrite->setStyleSheet(confirmIconStyle()); + ui->buttonSaveAs->setStyleSheet(confirmIconStyle()); + ui->buttonClose->setStyleSheet(confirmIconStyle()); + ui->buttonOverWrite->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonSaveAs->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonSaveAs->objectName())); + ui->buttonClose->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + + ui->buttonForward->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonForward->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonForward->objectName())); + ui->buttonReverse->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonReverse->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonReverse->objectName())); + + ui->frameThree->setStyleSheet(transparentStyle()); + ui->buttonRename->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonReplace->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonSkip->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonRename->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonRename->objectName())); + ui->buttonReplace->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonReplace->objectName())); + ui->buttonSkip->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonSkip->objectName())); + + ui->frameDetecBtn->setStyleSheet(transparentStyle()); + ui->buttonDetectBegin->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonDetectBegin->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonDetectBegin->objectName())); + ui->buttonDetectEnd->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonDetectEnd->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonDetectEnd->objectName())); + ui->buttonDetectClose->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonDetectClose->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName()+"_1")); + + ui->frameProcessBtn->setStyleSheet(transparentStyle()); + ui->buttonRestart->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonRestart->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonRestart->objectName())); + ui->buttonUpdataCancel->setBottomImage(setControlStyle.getSharedBottomStyleSheet("frameBtn")); + ui->buttonUpdataCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName()+"_1")); + + //设置可工作区域 + ui->frameWorkArea->setStyleSheet(transparentStyle()); + ui->buttonX1->setFont(fontSize_M()); + ui->buttonX2->setFont(fontSize_M()); + ui->buttonY1->setFont(fontSize_M()); + ui->buttonY2->setFont(fontSize_M()); + + ui->frameKnifePressure->setStyleSheet(transparentStyle()); + + ui->frameFanArea->setStyleSheet(transparentStyle()); + ui->frameSpdSelect->setStyleSheet(transparentStyle()); + + ui->buttonKn1_MaxSpd->setStyleSheet(flippingStyle()); + ui->buttonKn1_MinSpd->setStyleSheet(flippingStyle()); + ui->buttonKn1_AccSpd->setStyleSheet(flippingStyle()); + + ui->buttonKn2_MaxSpd->setStyleSheet(flippingStyle()); + ui->buttonKn2_MinSpd->setStyleSheet(flippingStyle()); + ui->buttonKn2_AccSpd->setStyleSheet(flippingStyle()); + + //主轴角度旋转 + ui->frameSpindleRotate->setStyleSheet(transparentStyle()); + ui->labelSpindleAngle->setStyleSheet(titleTextColour()); + ui->labelSpindleAngle->setFont(fontSize_M()); + ui->labelSpindleAngleUnit->setStyleSheet(titleTextColour()); + ui->labelSpindleAngleUnit->setFont(fontSize_M()); + ui->buttonSpindleAngleValue->setFont(fontSize_M()); + + //界面解密 + ui->frameHMIDecrypt->setStyleSheet(transparentStyle()); + ui->labelNetworkCardID->setStyleSheet(titleTextColour()); + ui->labelNetworkCardID->setFont(fontSize_M()); + ui->labelNetworkCardIDValue->setStyleSheet(titleTextColour()); + ui->labelNetworkCardIDValue->setFont(fontSize_M()); + ui->labelHMIPassword->setStyleSheet(titleTextColour()); + ui->labelHMIPassword->setFont(fontSize_M()); + ui->buttonHMIPassword->setFont(fontSize_M()); + ui->labelDecryptInfo->setStyleSheet(titleTextColour()); + ui->labelDecryptInfo->setFont(fontSize_M()); + ui->labelDecryptInfoValue->setStyleSheet(titleTextColour()); + ui->labelDecryptInfoValue->setFont(fontSize_M()); + + //修改一级密码 + ui->frameChangePassword->setStyleSheet(transparentStyle()); + ui->labelNewPassword->setStyleSheet(titleTextColour()); + ui->labelNewPassword->setFont(fontSize_M()); + ui->labelConfirmPassword->setStyleSheet(titleTextColour()); + ui->labelConfirmPassword->setFont(fontSize_M()); + ui->buttonNewPassword->setFont(fontSize_M()); + ui->buttonConfirmPassword->setFont(fontSize_M()); + + ui->frameWarrantBtn->setStyleSheet(transparentStyle()); + ui->buttonWarrant->setStyleSheet(confirmIconStyle()); + ui->buttonWarrantCancel->setStyleSheet(confirmIconStyle()); + ui->buttonWarrant->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonWarrantCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + + //铣切机--刀压设置 + ui->frame_Force->setStyleSheet(transparentStyle()); + ui->pushButton_collect->setFont(fontSize_M()); + ui->pushButton_collect_bit->setFont(fontSize_M()); + ui->pushButton_test->setFont(fontSize_M()); + ui->pushButton_collect->setStyleSheet(confirmIconStyle()); + ui->pushButton_collect_bit->setStyleSheet(confirmIconStyle()); + ui->pushButton_test->setStyleSheet(confirmIconStyle()); + ui->pushButton_Blade->setFont(fontSize_L()); + ui->pushButton_BValue->setFont(fontSize_L()); + ui->pushButton_Blade->setStyleSheet(knifeStyle4()); + ui->pushButton_BValue->setStyleSheet(confirmIconStyle()); + ui->pushButton_Pre->setText(""); + ui->pushButton_Next->setText(""); + ui->pushButton_Pre->setRevDirectionButtonStyle(); + ui->pushButton_Next->setRevDirectionButtonStyle(); + ui->pushButton_Pre->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->pushButton_Pre->objectName())); + ui->pushButton_Next->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->pushButton_Next->objectName())); + + //文件传输方式选择 + ui->frame_FileTransfer->setStyleSheet(transparentStyle()); + ui->button_Local->setStyleSheet(confirmIconStyle()); + ui->button_USB->setStyleSheet(confirmIconStyle()); + ui->button_Local->setFont(fontSize_M()); + ui->button_USB->setFont(fontSize_M()); + +// QPixmap p(32, 32) + ui->frameWorkHeadSet->setStyleSheet(transparentStyle()); + ui->check_WorkHead_1->setFont(fontSize_M()); + ui->check_WorkHead_1->setStyleSheet(R"( + QCheckBox::indicator { + background-color: white; /* 白色背景 */ + width: 25px; /* 原默认约16px,按需调整(如24/32px) */ + height: 25px; + margin-right: 0px; /* 可选:调整勾选框与文本的间距(适配原生布局) */ + } + QCheckBox::indicator:checked { + image: url(:/images/MainWidget/checked.png); /* 替换为你的√图片路径 */ + width: 25px; /* 图片宽度(与原生复选框尺寸匹配更佳) */ + height: 25px; /* 图片高度 */ + border: none; /* 去掉可能的额外边框,避免与原生样式冲突 */ + } + )"); + + ui->check_WorkHead_2->setStyleSheet(R"( + QCheckBox::indicator { + background-color: white; /* 白色背景 */ + width: 25px; /* 原默认约16px,按需调整(如24/32px) */ + height: 25px; + margin-right: 0px; /* 可选:调整勾选框与文本的间距(适配原生布局) */ + } + QCheckBox::indicator:checked { + image: url(:/images/MainWidget/checked.png); /* 替换为你的√图片路径 */ + width: 25px; /* 图片宽度(与原生复选框尺寸匹配更佳) */ + height: 25px; /* 图片高度 */ + border: none; /* 去掉可能的额外边框,避免与原生样式冲突 */ + } + )"); + + ui->check_WorkHead_2->setFont(fontSize_M()); +} + +/// +/// \brief 刷新显示 +/// +void PromptDialog::refreshMcPara() +{ + ParaStruct mcPara = g_pMachine->getMcPara(); + //刀压测试 + int LkHeight = 0; + int RkHeight = 0; + double Lkdouble = 0; + double Rkdouble = 0; + + // 刀座1安装刀类型选择 0,无 1,圆刀 2,震刀 3,铣刀 4,偏心刀1 5,偏心刀2 6,画笔 7,尖刀 8,钻孔 9,压轮 + if (mcPara.buf[10] == 1) + {//1,圆刀 + LkHeight = mcPara.buf[87]; + } + else if (mcPara.buf[10] == 2) + {//2,震刀 + LkHeight = mcPara.buf[90]; + } + else if (mcPara.buf[10] == 3) + {//3,铣刀 + LkHeight = mcPara.buf[93]; + } + else if (mcPara.buf[10] == 4) + {//4,偏心刀1 + LkHeight = mcPara.buf[96]; + } + else if (mcPara.buf[10] == 5) + {//5,偏心刀2 + LkHeight = mcPara.buf[98]; + } + else if (mcPara.buf[10] == 7) + {//7,尖刀 + LkHeight = mcPara.buf[105]; + } + else if (mcPara.buf[10] == 8) + {//8,钻孔 + LkHeight = mcPara.buf[103]; + } + else if (mcPara.buf[10] == 9) + {//9,压轮 + LkHeight = mcPara.buf[100]; + } + else + {// + LkHeight = 0; + } + + // 刀座2安装刀类型选择 0,无 1,圆刀 2,震刀 3,铣刀 4,偏心刀1 5,偏心刀2 6,画笔 7,尖刀 8,钻孔 9,压轮 + if (mcPara.buf[11] == 1) + {//1,圆刀 + RkHeight = mcPara.buf[87]; + } + else if (mcPara.buf[11] == 2) + {//2,震刀 + RkHeight = mcPara.buf[90]; + } + else if (mcPara.buf[11] == 3) + {//3,铣刀 + RkHeight = mcPara.buf[93]; + } + else if (mcPara.buf[11] == 4) + {//4,偏心刀1 + RkHeight = mcPara.buf[96]; + } + else if (mcPara.buf[11] == 5) + {//5,偏心刀2 + RkHeight = mcPara.buf[98]; + } + else if (mcPara.buf[11] == 7) + {//7,尖刀 + RkHeight = mcPara.buf[105]; + } + else if (mcPara.buf[11] == 8) + {//8,钻孔 + RkHeight = mcPara.buf[103]; + } + else if (mcPara.buf[11] == 9) + {//9,压轮 + RkHeight = mcPara.buf[100]; + } + else + {// + RkHeight = 0; + } + + Lkdouble = LkHeight; + Rkdouble = RkHeight; + + ui->label_LKPara->setText(("U1:") + QString::number(Lkdouble/100,'f',2));//U1: + ui->label_RKPara->setText(("U2:") + QString::number(Rkdouble/100,'f',2));//U2: +} + +using namespace std; +void PromptDialog::refreshWkPara() +{ + ParaStruct wkPara = g_pMachine->getWkPara(); + //单独吸附区域 + bitset<32> intbit(wkPara.buf[83]); + + btnDisplay(ui->buttonFanSet1,intbit.test(0),"1"); + btnDisplay(ui->buttonFanSet2,intbit.test(1),"2"); + btnDisplay(ui->buttonFanSet3,intbit.test(2),"3"); + btnDisplay(ui->buttonFanSet4,intbit.test(3),"4"); + + //手动自动 + bitset<32> intbit2(wkPara.buf[102]); + if(intbit2.test(0)) + ui->buttonFanSet5->setText(tr("Auto"));//自动 + else + ui->buttonFanSet5->setText(tr("Manual"));//手动 +} + +void PromptDialog::btnDisplay(MyButton *btn, bool isTrue,QString str) +{ + if(isTrue) + { + btn->setText(str + tr("Opened"));//已开启 + btn->setStyleSheet(flippingStyle()); + } + else + { + btn->setText(str + tr("Closed"));//已关闭 + btn->setStyleSheet(confirmIconStyle()); + } +} + +//设置标题 +void PromptDialog::setTitleStr(QString str) +{ + ui->labelTitle->setText(str); +} + +//设置断线机头字体颜色 +void PromptDialog::setStrColor(QString str) +{ + ui->frameProcess->hide(); + ui->labelContentInfo->setText(""); + ui->labelContentInfo->hide(); + ui->labelContentWarrant->setText(""); + ui->labelContentWarrant->hide(); + ui->labelContent->setText(""); + ui->labelContent->hide(); + ui->labeBreakHead->setText(str); + ui->labeBreakHead->show(); +} + +//设置显示内容 +void PromptDialog::setContentStr(QString str) +{ + ui->frameProcess->hide(); + ui->labelContentInfo->setText(""); + ui->labelContentInfo->hide(); + ui->labeBreakHead->setText("");//断线机头显示 + ui->labeBreakHead->hide(); + ui->labelContentWarrant->setText(""); + ui->labelContentWarrant->hide(); + ui->labelContent->setText(str); + ui->labelContent->show(); +} + +void PromptDialog::setContentProcessStr(QString str) +{ + ui->frameProcess->show(); + ui->labelContentInfo->setText(""); + ui->labelContentInfo->hide(); + ui->labeBreakHead->setText("");//断线机头显示 + ui->labeBreakHead->hide(); + ui->labelContent->setText(""); + ui->labelContent->hide(); + ui->labelContentWarrant->setText(""); + ui->labelContentWarrant->hide(); + ui->labelContentProcess->show(); + ui->labelContentProcess->setText(str); +} + +void PromptDialog::setContentInfoShow() +{ + ui->labelContent->hide(); + ui->labeBreakHead->hide(); + ui->frameProcess->hide(); + ui->labelContentWarrant->hide(); + ui->labelContentInfo->show(); + ui->labelContentInfo->raise(); +} + +void PromptDialog::setContentWarrantShow() +{ + ui->labelContent->hide(); + ui->labeBreakHead->hide(); + ui->frameProcess->hide(); + ui->labelContentInfo->hide(); + ui->labelContentWarrant->show(); +} + +void PromptDialog::setContentHMIDecryptShow(QString id) +{ + //将id中的冒号去掉 + QStringList strlist = id.split(":", QString::SkipEmptyParts); + QString nId; + nId.clear(); + for(int i = 0; i < strlist.size(); i++) + { + nId += strlist[i]; + } + ui->labelNetworkCardIDValue->setText(nId); + ui->buttonHMIPassword->setText(""); + + QDir apppath(qApp->applicationDirPath()); + QString HMIDecryptConfigfile; + HMIDecryptConfigfile = apppath.path() + apppath.separator() + "HMIDecryptConfig.ini"; + QSettings iniSetting(HMIDecryptConfigfile, QSettings::IniFormat); + int decryptFlag = iniSetting.value("HMIDecrypt/ifdecrypt").toInt(); + QFile iniFile(HMIDecryptConfigfile); + if(decryptFlag != 0 || !iniFile.exists())//等于1或者配置文件不存在 + { + ui->labelDecryptInfoValue->setText("HMI decrypted");//界面已解密 + } + else + { + ui->labelDecryptInfoValue->setText("HMI unresolved");//界面未解密 + } + + ui->buttonOk->setEnabled(false); +} + +void PromptDialog::setContentChangePasswordShow()//修改一级用户密码内容显示 +{ + ui->buttonNewPassword->setText(""); + ui->buttonConfirmPassword->setText(""); + ui->buttonOk->setEnabled(false); +} + +void PromptDialog::setValue(int progress) +{ + ui->progressBar->setValue(progress); +} + +void PromptDialog::setButtonUCancelStr(QString str) +{ + ui->buttonUpdataCancel->setText(str); +} + +void PromptDialog::setRange(int minimum, int maximum) +{ + ui->progressBar->setRange(minimum,maximum); +} + +QString PromptDialog::getNetworkCardID() +{ + return ui->labelNetworkCardIDValue->text(); +} + +QString PromptDialog::getInputPassword() +{ + return ui->buttonHMIPassword->text(); +} + +void PromptDialog::slotMCInfoChange() +{ + QString strInfo; + MCInfo info;//机器信息 + char softwareVerStr[48+1];//软件版本 + char mBoardVerStr[16+1];//主板(n1)板卡版本 + char exBoardVerStr[16+1];//主板(n1-1)板卡版本 + char buildInfoStr[32+1];//编译日期信息 + + info = g_pMachine->getMcInfo(); + memcpy(softwareVerStr, info.softwareVerStr, 48); + memcpy(mBoardVerStr, info.mBoardVerStr, 16); + memcpy(exBoardVerStr, info.exBoardVerStr, 16); + memcpy(buildInfoStr, info.buildInfoStr, 32); + + softwareVerStr[48] = 0; + mBoardVerStr[16]= 0; + exBoardVerStr[16]= 0; + buildInfoStr[32]=0; + + QString strBoardVer; + strBoardVer.sprintf("%s", softwareVerStr); + + QString strMBoardVer; + strMBoardVer.sprintf("%s", mBoardVerStr); + + QString strExBoardVer; + strExBoardVer.sprintf("%s", exBoardVerStr); + + QString strBuildInfo; + strBuildInfo.sprintf("%s", buildInfoStr); + + + strInfo += tr("Board:") + " " + strBoardVer + "\n"+ + strBuildInfo+ "\n" + + strMBoardVer + "\n" + + strExBoardVer + "\n" ; + + QString verInfo = "\n" + strInfo; + ui->labelContentInfo->setText(verInfo); + + //连接多块主板也是从g_pMachine[0](第一块)获取软件授权信息 + MCStatus mcStatus; + mcStatus = g_pMachine->getMcStatus(); //读的一个主板的可工作时间计数器(分钟) + + MCInfo infoID;//机器信息 + infoID = g_pMachine->getMcInfo(); + + QString IDStr(infoID.boardId); + if(IDStr.indexOf(":") != -1) + { + QStringList list = IDStr.split(":"); + IDStr = list.at(1); + } + + QString passwordStr(infoID.installment); + if(passwordStr.indexOf(":") != -1) + { + QStringList list = passwordStr.split(":"); + passwordStr = list.at(1); + } + + int time = mcStatus.workableTimer;//只在上电的时候读取 + QString timeStr; + if( time > TIMELIMITMIN && time < TIMELIMITMAX) + { + timeStr = (tr("Unlimited time")); // 无时间限制 + } + if(time <= 0) + { + timeStr = (tr("Time has run out")); // 时间已用完 + } + if(time > 0 && time < TIMELIMITMIN) + { + QString strDay; + QString strHour; + QString strSec; + + strDay = QString::number(time/(60 *24) , 10); + strHour = QString::number((time%(60 *24))/60 , 10) ; + strSec = QString::number(time%60 , 10); + + timeStr = strDay + " " + tr("Day") + " " + strHour + " " + tr("Hour") + " " + strSec + " " + tr("Minutes") ; // 天 小时 分钟 + } + + QString strBoardInfo; + strBoardInfo = QString(tr("ID: %1\n")).arg(IDStr); + strBoardInfo += QString(tr("Password: %1\n")).arg(passwordStr); + strBoardInfo += QString(tr("Time: %1")).arg(timeStr); + ui->labelContentWarrant->setText(strBoardInfo); +} + +void PromptDialog::on_buttonOk_clicked() +{ + if(m_funType == BTN_SPINDLE_ROTATE) + { + emit siSpindleRotate(m_spindleAngle); + done(0); + } + else if(m_funType == BTN_ROTATE_ROTATE) + { + emit siRotateRotate(m_spindleAngle); + done(0); + } + else if(m_funType == BTN_AUTOMATIC_PULLMA) + { + emit siAutoPull(m_length); + done(0); + } + else if(m_funType == BTN_SPINDLE_GRANDE) + { + emit siSpindleTime(m_time,m_speed); + done(0); + } + else if(m_funType == BTN_SPD_SELECT) + { + done(0); + } + else if(m_funType == BTN_FORCE) + { + done(0); + } + if(m_funType == BTN_WORKHEADSET) + { + unsigned int data1 = 0, data2 = 0, data = 0; + //int readValue = /* 你的读数,假设 ≥ 0 */; + data1 |= (1U << 0); // data == 1 + data2 |= (1U << 1); + data |= 0b11; // 二进制写法 + if (ui->check_WorkHead_1->isChecked() && ui->check_WorkHead_2->isChecked()) //机头12 + { + g_pMachine->setAMcPara(PARA_HEADSET + 1, data); + } + else if (ui->check_WorkHead_1->isChecked()) //机头1 + { + g_pMachine->setAMcPara(PARA_HEADSET + 1, data1); + } + else if (ui->check_WorkHead_2->isChecked()) //机头2 + { + g_pMachine->setAMcPara(PARA_HEADSET + 1, data2); + } + done(0); + + } + else + { + done(1); + } +} +void PromptDialog::on_buttonCancel_clicked() +{ + done(0); +} + +void PromptDialog::on_buttonRename_clicked() +{ + done(1); +} + +void PromptDialog::on_buttonReplace_clicked() +{ + done(2); +} + +void PromptDialog::on_buttonSkip_clicked() +{ + done(0); +} + +//重启 +void PromptDialog::on_buttonRestart_clicked() +{ +#ifdef Q_OS_WIN + qApp->exit(); +#endif + +#ifdef Q_OS_LINUX + system("reboot"); +#endif +} + +//升级中断 +void PromptDialog::on_buttonUpdataCancel_clicked() +{ + emit(siUpdataCancel()); + done(0); +} + +void PromptDialog::on_buttonWarrant_clicked() +{ + //输入框 + WordsInputDialog wordInputDlg; + wordInputDlg.clean(); + wordInputDlg.setTitleStr(tr("Warrant")); + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { + QString textStr = wordInputDlg.getInputStr(); + //连接多块主板也是从g_pMachine(第一块)获取软件授权信息,所以解锁也是通过第一块主板 + g_pMachine->setMacKey(( unsigned char * ) textStr.toLatin1().data() ,textStr.toLatin1().size()); + done(1); + } +} + +void PromptDialog::on_buttonWarrantCancel_clicked() +{ + done(0); +} + +//开始检测 +void PromptDialog::on_buttonDetectBegin_clicked() +{ + if(m_funType == BTN_BOTTOM)//等于底线检测 + { + return; + } + if(m_funType == BTN_FACE)//等于面线检测 + { + return; + } +} + +//停止检测 +void PromptDialog::on_buttonDetectEnd_clicked() +{ + if(g_pMachine!= NULL) + { + g_pMachine->exitDetectTest(); + } +} + +//关闭检测窗体 +void PromptDialog::on_buttonDetectClose_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->exitDetectTest(); + } + done(0); +} + +//界面解密ID号输入按钮 +void PromptDialog::on_buttonHMIPassword_clicked() +{ + //输入框 + WordsInputDialog wordInputDlg; + wordInputDlg.clean(); + wordInputDlg.setTitleStr(tr("HMI decrypt")); + wordInputDlg.setOldWordsStr(""); + if(wordInputDlg.exec() == 1) + { + QString textStr = wordInputDlg.getInputStr(); + ui->buttonHMIPassword->setText(textStr); + if(textStr.length() > 0) + { + ui->buttonOk->setEnabled(true); + } + } +} + +void PromptDialog::on_buttonSpindleAngleValue_clicked() +{ + if(m_funType == BTN_AUTOMATIC_PULLMA) + { + int rslt; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(tr("autoPull"));//自动拉料 + ndlg.setUnitStr(tr("mm")); + ndlg.setValueAndRange(ui->buttonSpindleAngleValue->text().toInt(), 0, 36000, 0); + rslt = ndlg.exec(); + + if (rslt == 1)//输入弹窗点击了确认 + { + s32 val = ndlg.getValue(); + m_length = val; + float angle = m_length; + QString angleStr; + angleStr.sprintf("%.0f",angle); + ui->buttonSpindleAngleValue->setText(angleStr); + } + } + else if(m_funType == BTN_SPINDLE_GRANDE) + { + //时间 + int rslt; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(tr("Research vehicle time"));//研车时间 + ndlg.setUnitStr(tr("s")); + ndlg.setValueAndRange(ui->buttonSpindleAngleValue->text().toInt(), 0, 36000, 0); + rslt = ndlg.exec(); + + if (rslt == 1)//输入弹窗点击了确认 + { + s32 val = ndlg.getValue(); + m_time = val; + float time = m_time; + QString timeStr; + timeStr.sprintf("%.0f",time); + ui->buttonSpindleAngleValue->setText(timeStr); + } + + // //速度 + // int rosh; + // NumerInputDialog ndsh(this); + // ndsh.setTitleStr(tr("Research vehicle speed"));//研车速度 + // ndsh.setUnitStr(tr("s")); + // ndsh.setValueAndRange(ui->buttonSpindleAngleValue->text().toInt(), 0, 36000, 0); + // rosh = ndsh.exec(); + + } + else + { + QTextCodec *cod = QTextCodec::codecForLocale(); + int rslt; + NumerInputDialog ndlg(this); + if(m_funType == BTN_SPINDLE_ROTATE) + { + ndlg.setTitleStr(tr("Spindle angle rotation"));//主轴角度旋转 + } + else if(m_funType == BTN_ROTATE_ROTATE) + { + ndlg.setTitleStr(tr("Rotation angle rotation"));//旋转角度旋转 + } + else if(m_funType == BTN_SPINDLE_GRANDE) + { + + } + else + { + ndlg.setTitleStr(tr("Spindle angle rotation"));//主轴角度旋转 + } + ndlg.setUnitStr(cod->toUnicode("°")); + ndlg.setValueAndRange(ui->buttonSpindleAngleValue->text().toInt()*100, 0, 36000, 2); + rslt = ndlg.exec(); + + if (rslt == 1)//输入弹窗点击了确认 + { + s32 val = ndlg.getValue(); + m_spindleAngle = val; + float angle = m_spindleAngle*0.01; + QString angleStr; + angleStr.sprintf("%.2f",angle); + ui->buttonSpindleAngleValue->setText(angleStr); + } + } + +} + +//修改一级密码:新密码输入按钮 +void PromptDialog::on_buttonNewPassword_clicked() +{ + //密码输入框 + PassWordDialog passWordDlg; + passWordDlg.setTitleStr(tr("New Password input"));//设置新密码输入的标题 + if(passWordDlg.exec() == 1)//确认 + { + m_newPassword = passWordDlg.getInputStr();//获取输入框里的密码 + QString showStr(""); + for (int var = 0; var < m_newPassword.size(); var++) + { + showStr = showStr + "*"; + } + ui->buttonNewPassword->setText(showStr);//新密码框里显示获取的密码 + } +} +//修改一级密码:确认新密码输入按钮 +void PromptDialog::on_buttonConfirmPassword_clicked() +{ + //密码输入框 + PassWordDialog passWordDlg; + passWordDlg.setTitleStr(tr("Confirm Password input"));//设置确认密码输入的标题 + if(passWordDlg.exec() == 1)//确认 + { + m_confirmPassword = passWordDlg.getInputStr();//获取输入框里的密码 + QString showStr(""); + for (int var = 0; var < m_confirmPassword.size(); var++) + { + showStr = showStr + "*"; + } + ui->buttonConfirmPassword->setText(showStr);//确认密码框里显示获取的密码 + if(m_confirmPassword.length() > 0 ) + { + ui->buttonOk->setEnabled(true); + } + } + +} + +//主轴正转 +void PromptDialog::on_buttonForward_pressed() +{ + emit siSpindleAction(MT_MOVE_DIR_POSI); +} + +//主轴正转停止 +void PromptDialog::on_buttonForward_released() +{ + emit siSpindleAction(MT_MOVE_DIR_STOP); +} + +//主轴反转 +void PromptDialog::on_buttonReverse_pressed() +{ + emit siSpindleAction(MT_MOVE_DIR_NEGA); +} + +//主轴反转停止 +void PromptDialog::on_buttonReverse_released() +{ + emit siSpindleAction(MT_MOVE_DIR_STOP); +} + +void PromptDialog::on_buttonX1_pressed() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(XY_MOVE_RIGHT, 2);//速度等级默认是2 + } +} + +void PromptDialog::on_buttonX1_released() +{ + if(g_pMachine != NULL) + { + g_pMachine->motoMove(XY_MOVE_RIGHT, MT_MOVE_DIR_STOP, 0); + } + m_area = 2; +} + +void PromptDialog::on_buttonX2_pressed() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(XY_MOVE_LEFT, 2); + } +} + +void PromptDialog::on_buttonX2_released() +{ + if(g_pMachine != NULL) + { + g_pMachine->motoMove(XY_MOVE_LEFT, MT_MOVE_DIR_STOP, 0); + } + m_area = 1; +} + +void PromptDialog::on_buttonY1_pressed() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(XY_MOVE_FRONT, 2); + } +} +//Y+ +void PromptDialog::on_buttonY1_released() +{ + if(g_pMachine != NULL) + { + g_pMachine->motoMove(XY_MOVE_FRONT, MT_MOVE_DIR_STOP, 0); + } + m_area = 4; +} + +void PromptDialog::on_buttonY2_pressed() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(XY_MOVE_BACK, 2); + } +} +//Y- +void PromptDialog::on_buttonY2_released() +{ + if(g_pMachine != NULL) + { + g_pMachine->motoMove(XY_MOVE_BACK, MT_MOVE_DIR_STOP, 0); + } + m_area = 3; +} + +void PromptDialog::on_buttonLKTest_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(KNIFE_U1_TEST); + } +} + +void PromptDialog::on_buttonRKTest_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(KNIFE_U2_TEST); + } +} + +void PromptDialog::on_buttonLKParaModify_clicked() +{ + ParaStruct mcPara = g_pMachine->getMcPara(); + // 刀座1安装刀类型选择 0,无 1,圆刀 2,震刀 3,铣刀 4,偏心刀1 5,偏心刀2 6,画笔 7,尖刀 8,钻孔 9,压轮 + if (mcPara.buf[10] == 1) + {//1,圆刀 + slot_Modify_McPara_int(87,tr("Height of tool drop during circular cutting"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 2) + {//2,震刀 + slot_Modify_McPara_int(90,tr("Height of tool drop Shock knife"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 3) + {//3,铣刀 + slot_Modify_McPara_int(93,tr("Height of tool drop milling cutter"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 4) + {//4,偏心刀1 + slot_Modify_McPara_int(96,tr("Eccentric knife") + " 1 " + tr("machining tool drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 5) + {//5,偏心刀2 + slot_Modify_McPara_int(98,tr("Eccentric knife") + " 2 " + tr("machining tool drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 7) + {//7,尖刀 + slot_Modify_McPara_int(105,tr("Knife and pen drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 8) + {//8,钻孔 + slot_Modify_McPara_int(103,tr("Cutting height of drilling tool during machining"),"mm",10000,-100,2); + } + else if (mcPara.buf[10] == 9) + {//9,压轮 + slot_Modify_McPara_int(100,tr("Height of tool drop during wheel pressing"),"mm",10000,-100,2); + } + else + {// + } + + refreshMcPara(); +} + +void PromptDialog::on_buttonRKParaModify_clicked() +{ + ParaStruct mcPara = g_pMachine->getMcPara(); + // 刀座2安装刀类型选择 0,无 1,圆刀 2,震刀 3,铣刀 4,偏心刀1 5,偏心刀2 6,画笔 7,尖刀 8,钻孔 9,压轮 + if (mcPara.buf[11] == 1) + {//1,圆刀 + slot_Modify_McPara_int(87,tr("Height of tool drop during circular cutting"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 2) + {//2,震刀 + slot_Modify_McPara_int(90,tr("Height of tool drop Shock knife"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 3) + {//3,铣刀 + slot_Modify_McPara_int(93,tr("Height of tool drop milling cutter"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 4) + {//4,偏心刀1 + slot_Modify_McPara_int(96,tr("Eccentric knife") + " 1 " + tr("machining tool drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 5) + {//5,偏心刀2 + slot_Modify_McPara_int(98,tr("Eccentric knife") + " 2 " + tr("machining tool drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 7) + {//7,尖刀 + slot_Modify_McPara_int(105,tr("Knife and pen drop height"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 8) + {//8,钻孔 + slot_Modify_McPara_int(103,tr("Cutting height of drilling tool during machining"),"mm",10000,-100,2); + } + else if (mcPara.buf[11] == 9) + {//9,压轮 + slot_Modify_McPara_int(100,tr("Height of tool drop during wheel pressing"),"mm",10000,-100,2); + } + else + {// + } + refreshMcPara(); +} + +/// +/// \brief 速度选择界面点击修改速度按钮 +/// 注意更新速度的范围 +/// +void PromptDialog::slot_buttonSpdParaModify_clicked() +{ + MyButton *p = (MyButton*)this->sender(); + QString btnName = p->objectName(); + int model = g_pSettings->readFromIniFile("FlatPanelSpd/Model").toInt(); + + //不同模式 读数据 配置文件 + if(btnName.contains("buttonKn1_MinSpd")){ + } + else if(btnName.contains("buttonKn1_MaxSpd")){ + } + else if(btnName.contains("buttonKn1_AccSpd")){ + } + else if(btnName.contains("buttonKn2_MinSpd")){ + //偏心刀2最小切割速度 + int val = slot_Modify_McPara_int(170,tr("Minimum cutting speed of Eccentric knife2"),"mm/s", 100, 1, 0); + p->setText(tr("Kn2Min:")+QString::number(val));//刀2最小 + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(model)+"Kn2Min",QVariant(val)); + } + else if(btnName.contains("buttonKn2_MaxSpd")){ + //偏心刀2最大切割速度 + int val = slot_Modify_McPara_int(171,tr("Maximum cutting speed of Eccentric knife2"),"mm/s", 800, 1, 0); + p->setText(tr("Kn2Max:")+QString::number(val));//刀2最大 + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(model)+"Kn2Max",QVariant(val)); + } + else if(btnName.contains("buttonKn2_AccSpd")){ + //偏心刀2切割加速度 + int val = slot_Modify_McPara_int(172,tr("Eccentric knife") + (" 2 ")+tr("cutting acceleration"),"mm/s2", 5000, 1, 0); + p->setText(tr("Kn2Acc:")+QString::number(val));//刀2加速 + g_pSettings->writeOneToIniFile("FlatPanelSpd/M"+ QString::number(model)+"Kn2Acc",QVariant(val)); + } + +} + +/// +/// \brief 修改int类型的机器参数 +/// +int PromptDialog::slot_Modify_McPara_int(int index, QString descStr, QString unitStr, int Max, int Min, int afterpoint) +{ + int val = g_pMachine->getMcPara().buf[index]; + NumerInputDialog ndlg(this); + ndlg.setTitleStr(descStr); + ndlg.setUnitStr(unitStr); + ndlg.setValueAndRange(val, Min, Max, afterpoint); + int rslt = ndlg.exec(); + if (rslt == 1)//点了确认按钮 + { + val = ndlg.getValue(); + ParaStruct para = g_pMachine->getMcPara(); + para.buf[index] = val; + g_pMachine->setMcPara(¶);//发送下位机 + } + return val; +} + +void PromptDialog::slot_FanArea_clicked() +{ + MyButton *p = (MyButton*)this->sender(); + QString btnName = p->objectName(); + qDebug()<outputCtrl(OT_MAINADSORB, UP_OPEN_ON, 0); + } + else if(btnName.contains("FanClose5")) + { + g_pMachine->outputCtrl(OT_MAINADSORB, DOWN_CLOSE_OFF, 0); + } + else if(btnName.contains("FanSet")) + { + int index = btnName.right(1).toInt(); + ParaStruct wkPara = g_pMachine->getWkPara(); + bitset<32> intbit(wkPara.buf[83]);//吸附区域 83 bit 0-3 + if(index == 1) + { + bool val = intbit.test(0); //按位修改 + intbit.set(0, !val); + wkPara.buf[83] = intbit.to_ulong(); + } + else if(index == 2) + { + bool val = intbit.test(1); + intbit.set(1, !val); + wkPara.buf[83] = intbit.to_ulong(); + } + else if(index == 3) + { + bool val = intbit.test(2); + intbit.set(2, !val); + wkPara.buf[83] = intbit.to_ulong(); + } + else if(index == 4) + { + bool val = intbit.test(3); + intbit.set(3, !val); + wkPara.buf[83] = intbit.to_ulong(); + } + else if(index == 5) + {//风机吸附开关 102 bit0 + bitset<32> intAllBit(wkPara.buf[102]); + bool val = intAllBit.test(0); + intAllBit.set(0, !val); + wkPara.buf[102] = intAllBit.to_ulong(); + } + g_pMachine->setWkPara(&wkPara); + refreshWkPara(); + } +} + +void PromptDialog::slot_SpdSelect_clicked() +{ + MyButton *p = (MyButton*)this->sender(); + QString btnName = p->objectName(); + int kn1Min{0}, kn1Acc{0}, kn2Min{0}, kn2Acc{0}; + + for(int i = 1;i < 6; i++){ + if(btnName.contains("radioButtonSpd_"+QString::number(i))){ + g_pSettings->writeOneToIniFile("FlatPanelSpd/Model",QVariant(i)); + kn1Min = g_pSettings->readFromIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn1Min").toInt(); + kn1Acc = g_pSettings->readFromIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn1Acc").toInt(); + kn2Min = g_pSettings->readFromIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn2Min").toInt(); + kn2Acc = g_pSettings->readFromIniFile("FlatPanelSpd/M"+ QString::number(i)+"Kn2Acc").toInt(); + } + } + + //验证数据范围是否正确 + if(kn1Min<1 || kn1Min>100) + kn1Min = 10; + if(kn2Min<1 || kn2Min>100) + kn2Min = 10; + + if(kn1Acc<1 || kn1Acc>5000) + kn1Acc = 500; + if(kn2Acc<1 || kn2Acc>5000) + kn2Acc = 500; +} + +void PromptDialog::on_buttonFanClose5_clicked() +{ + +} + +//一键上升 +void PromptDialog::on_buttonUp_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->outputCtrl(OT_U_LIFT, UP_OPEN_ON, 0); + } +} + +//一键下降 +void PromptDialog::on_buttonDn_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->outputCtrl(OT_U_LIFT, DOWN_CLOSE_OFF, 0); + } +} + +void PromptDialog::on_pushButton_collect_clicked() +{ + emit siBladePressureCol(); + return; +} + +void PromptDialog::on_button_USB_clicked() +{ + //文件传输方式--USB传输 + emit siFileTransfer(0); + done(0); +} + +void PromptDialog::on_button_Local_clicked() +{ + //文件传输方式--本地文件传输 + emit siFileTransfer(1); + done(0); +} + +void PromptDialog::slot_BladePressure_Clicked() +{ + //铣切机--刀压设置 + int BladeVal = static_cast(ui->pushButton_BValue->text().toDouble()*1000); + + ParaStruct para = g_pMachine->getMcPara(); + NumerInputDialog ndlg(this); + ndlg.setUnitStr("mm"); + ndlg.setValueAndRange(BladeVal, -2000, 10000, 3); + int paramIndex = 0; + switch (ui->pushButton_Blade->text().toInt()) + { + case 2: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "2"); + paramIndex = 80; + break; + case 3: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "3"); + paramIndex = 81; + break; + case 4: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "4"); + paramIndex = 82; + break; + case 5: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "5"); + paramIndex = 83; + break; + case 6: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "6"); + paramIndex = 84; + break; + case 7: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "7"); + paramIndex = 85; + break; + case 8: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "8"); + paramIndex = 86; + break; + case 9: + ndlg.setTitleStr(tr("Custom Knife Pressure") + "9"); + paramIndex = 87; + break; + default: + return; + } + if (ndlg.exec())//点了确认按钮 + { + ui->pushButton_BValue->setText(ndlg.getShowStringPublic(ndlg.getValue(),4)); + para.buf[paramIndex] = static_cast(ui->pushButton_BValue->text().toDouble()*1000); + g_pMachine->setAMcPara(paramIndex + 1, para.buf[paramIndex]);//发送下位机 + } +} + +void PromptDialog::on_pushButton_test_clicked() +{ + int BladeNum = ui->pushButton_Blade->text().toInt(); + double BladeVal = ui->pushButton_BValue->text().toDouble(); + qDebug()<<"BladeVal:"< 1) + { + PromptDialog pPromptDlg; + pPromptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + pPromptDlg.setTitleStr(tr("Back anchor point"));//回定位点 + QString str; + str = tr("The machine is about to move, please pay attention to safety!");//机器即将运动,请注意安全! + pPromptDlg.setContentStr(str); + + if(pPromptDlg.exec() == 1) + { + if(g_pMachine != NULL) + { + g_pMachine->manualAction(MILLING_TEST,(BladeNum),BladeVal*1000); + qDebug() << "button selected:"<pushButton_Blade->text().toInt(); + BladeNum += 1; + if(BladeNum > 9) + { + BladeNum = 2; + } + ui->pushButton_Blade->setText(QString::number(BladeNum)); + + switch (BladeNum) + { + case 2: + ui->pushButton_Blade->setStyleSheet(knifeStyle2()); + break; + case 3: + ui->pushButton_Blade->setStyleSheet(knifeStyle3()); + break; + case 4: + ui->pushButton_Blade->setStyleSheet(knifeStyle4()); + break; + case 5: + ui->pushButton_Blade->setStyleSheet(knifeStyle5()); + break; + case 6: + ui->pushButton_Blade->setStyleSheet(knifeStyle6()); + break; + case 7: + ui->pushButton_Blade->setStyleSheet(knifeStyle7()); + break; + case 8: + ui->pushButton_Blade->setStyleSheet(knifeStyle8()); + break; + case 9: + ui->pushButton_Blade->setStyleSheet(knifeStyle9()); + break; + default: + break; + } + + ParaStruct mcPara = g_pMachine->getMcPara(); + int pressureHighValue = mcPara.buf[78+BladeNum]; + double dValue = static_cast(pressureHighValue); + QString strVal = QString::number(dValue/1000,'f',3); + ui->pushButton_BValue->setText(strVal); +} + +void PromptDialog::on_pushButton_Pre_clicked() +{ + int BladeNum = ui->pushButton_Blade->text().toInt(); + BladeNum -= 1; + if(BladeNum < 2) + { + BladeNum = 9; + } + ui->pushButton_Blade->setText(QString::number(BladeNum)); + + switch (BladeNum) + { + case 2: + ui->pushButton_Blade->setStyleSheet(knifeStyle2()); + break; + case 3: + ui->pushButton_Blade->setStyleSheet(knifeStyle3()); + break; + case 4: + ui->pushButton_Blade->setStyleSheet(knifeStyle4()); + break; + case 5: + ui->pushButton_Blade->setStyleSheet(knifeStyle5()); + break; + case 6: + ui->pushButton_Blade->setStyleSheet(knifeStyle6()); + break; + case 7: + ui->pushButton_Blade->setStyleSheet(knifeStyle7()); + break; + case 8: + ui->pushButton_Blade->setStyleSheet(knifeStyle8()); + break; + case 9: + ui->pushButton_Blade->setStyleSheet(knifeStyle9()); + break; + default: + break; + } + + ParaStruct mcPara = g_pMachine->getMcPara(); + int pressureHighValue = mcPara.buf[78+BladeNum]; + double dValue = static_cast(pressureHighValue); + QString strVal = QString::number(dValue/1000,'f',3); + ui->pushButton_BValue->setText(strVal); +} + +void PromptDialog::on_pushButton_collect_bit_clicked() +{ + PromptDialog promptDlg; + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Go to the collection location"));//去采集位 + promptDlg.setContentStr(tr("The machine is about to move, please pay attention to safety!"));//机器即将运动,请注意安全! + if(promptDlg.exec()) + g_pMachine->manualAction(SET_KNIFETEST_DOT); +} + +void PromptDialog::delay(int millisecondsToWait) +{ + QEventLoop loop; + QTimer::singleShot(millisecondsToWait, &loop, SLOT(quit())); + loop.exec(); +} + +void PromptDialog::on_buttonOverWrite_clicked() +{ + done(1); +} + +void PromptDialog::on_buttonSaveAs_clicked() +{ + done(2); +} + +void PromptDialog::on_buttonClose_clicked() +{ + done(0); +} diff --git a/sharedviews/promptdialog.h b/sharedviews/promptdialog.h new file mode 100644 index 0000000..308022e --- /dev/null +++ b/sharedviews/promptdialog.h @@ -0,0 +1,184 @@ +#ifndef PROMPTDIALOG_H +#define PROMPTDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "wordsinputdialog.h" +#include "numerinputdialog.h" +#include "setcontrolstyle.h" +#include "sharedviews/passworddialog.h" + +#define NOODLES 1 +#define BOTTOM 2 +#define TIMELIMITMAX 2147483647 +#define TIMELIMITMIN 2147385345 + +#define PARA_HEADSET 14 + +namespace Ui { +class PromptDialog; +} + +class PromptDialog : public QDialog +{ + Q_OBJECT + +public: + explicit PromptDialog(QWidget *parent = nullptr); + ~PromptDialog(); + + enum BTN_SHOW + { + BTN_OK_CANCEL, //ok和cancel按钮 + BTN_OK, //ok按钮 + BTN_R_R_S, //重命名、替换、跳过 + BTN_RESTART, //重启按钮 + BTN_UCANCEL, //升级取消按钮 + BTN_WARRANT, //授权按钮 + BTN_BOTTOM, //底线检测 + BTN_FACE, //面线检测 + BTN_NONE, //无按钮 + BTN_P_NONE, //进度条模式下无按钮(文件导入导出) + BTN_HMI_DECRYPT, //界面解密 + BTN_CHANGE_PASSWORD, //修改一级密码 + BTN_SPINDLE_ROTATE, //主轴旋转 + BTN_ROTATE_ROTATE, //旋转电机旋转 + BTN_AUTOMATIC_PULLMA, //自动拉料 + BTN_SPINDLE_GRANDE, //主轴研车 + BTN_WORK_AREA, //设置可工作区域 + BTN_KNIFE_PRESSURE, //刀压设置 + BTN_FAN_AREA, //风机区域 + BTN_SPD_SELECT, //速度选择 + BTN_FORCE, //刀压 + BTN_FILETRANSFER, //文件传输 + BTN_WORKHEADSET, //工作机头设置 + BTN_O_S_C //覆盖、另存为、关闭 + }; + +private: + Ui::PromptDialog *ui; + + QPoint m_btnOkPoint;//ok按钮位置 + QPoint m_btnCancelPoint;//cancel按钮位置 + + int m_funType;//功能类型 + + QString m_filePath; + + QString m_speedStr1; + QString m_speedStr2; + QString m_speedStr3; + + int m_spindleAngle;//主轴旋转角度值 + int m_length;//自动拉料长度 + int m_time;//主轴研车-时间 + int m_speed;//主轴研车-速度 + + int m_area;//xy正负位置 + QString m_newPassword;//获取新密码字符串 + QString m_confirmPassword;//获取确认新密码字符串 +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initControlStyle();//初始化窗体控件样式 + void refreshColorOrderHead();//刷新当前色序的机头工作号 + void refreshMcPara();//刷新机器参数 + void refreshWkPara();//刷新工作参数 + void btnDisplay(MyButton *btn, bool isTrue,QString str); + void delay(int millisecondsToWait);//延时 + +public: + void initDialog(int sel = 0);//初始化窗体 + void setTitleStr(QString str);//设置标题 + void setStrColor(QString str);//设置底线面线断线机头显示字体的颜色 + void setContentStr(QString str);//设置显示内容 + void setContentProcessStr(QString str);//设置进度条显示内容 + void setContentInfoShow();//主板信息内容显示 + void setContentWarrantShow();//授权信息内容显示 + void setContentHMIDecryptShow(QString id);//界面解密网卡ID号显示 + void setContentChangePasswordShow();//修改一级用户密码内容显示 + void setValue(int progress); + void setButtonUCancelStr(QString str); + void setRange(int minimum, int maximum); + inline int getSpindleRotateAngle(){return m_spindleAngle;}//获取主轴旋转角度 + inline int getArea(){return m_area;} + inline QString getInputNewPassword(){return m_newPassword;}//获取新密码 + inline QString getInputConfirmPassword(){return m_confirmPassword;}//获取确认新密码 + + QString getNetworkCardID();//获取网卡ID + QString getInputPassword();//获取界面输入密码 + + void setDefaultButton(int flag);// +signals: + void siUpdataCancel(); + void siSpindleAction(int action);//主轴动作(正转、反转、停止) + void siSpindleRotate(int angle);//主轴旋转角度 + void siRotateRotate(int angle);//旋转电机旋转角度 + void siAutoPull(int length); //自动拉料 + void siSpindleTime(int time, int speed);//主轴研车-时间 + + void siBladePressureCol();//刀压采集 + void siFileTransfer(int);//文件传输 +public slots: + void slotMCInfoChange(); + +private slots: + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); + void on_buttonRename_clicked(); + void on_buttonReplace_clicked(); + void on_buttonSkip_clicked(); + void on_buttonRestart_clicked(); + void on_buttonUpdataCancel_clicked(); + void on_buttonWarrant_clicked(); + void on_buttonWarrantCancel_clicked(); + void on_buttonDetectBegin_clicked(); + void on_buttonDetectEnd_clicked(); + void on_buttonDetectClose_clicked(); + void on_buttonHMIPassword_clicked(); + void on_buttonSpindleAngleValue_clicked(); + void on_buttonNewPassword_clicked(); + void on_buttonConfirmPassword_clicked(); + void on_buttonForward_pressed(); + void on_buttonForward_released(); + void on_buttonReverse_pressed(); + void on_buttonReverse_released(); + void on_buttonX1_pressed(); + void on_buttonX1_released(); + void on_buttonX2_pressed(); + void on_buttonX2_released(); + void on_buttonY1_pressed(); + void on_buttonY1_released(); + void on_buttonY2_pressed(); + void on_buttonY2_released(); + void on_buttonLKTest_clicked(); + void on_buttonRKTest_clicked(); + void on_buttonLKParaModify_clicked(); + void on_buttonRKParaModify_clicked(); + void slot_buttonSpdParaModify_clicked(); //速度选择界面点击修改速度按钮 + void slot_FanArea_clicked(); + void slot_SpdSelect_clicked();//速度选择界面点击速度模式按钮 + int slot_Modify_McPara_int(int index, QString descStr, QString unitStr, int Max, int Min, int afterpoint); // 修改int类型机器参数 + void on_buttonFanClose5_clicked(); + void on_buttonUp_clicked(); + void on_buttonDn_clicked(); + void on_pushButton_collect_clicked(); + void on_button_USB_clicked(); + void on_button_Local_clicked(); + void slot_BladePressure_Clicked(); + void on_pushButton_test_clicked(); + void on_pushButton_Next_clicked(); + void on_pushButton_Pre_clicked(); + void on_pushButton_collect_bit_clicked(); + void on_buttonOverWrite_clicked(); + void on_buttonSaveAs_clicked(); + void on_buttonClose_clicked(); +}; + +#endif // PROMPTDIALOG_H diff --git a/sharedviews/promptdialog.ui b/sharedviews/promptdialog.ui new file mode 100644 index 0000000..a6133fb --- /dev/null +++ b/sharedviews/promptdialog.ui @@ -0,0 +1,2077 @@ + + + PromptDialog + + + + 0 + 0 + 768 + 450 + + + + + 5 + 5 + + + + Dialog + + + + + + + + 0 + 0 + 472 + 48 + + + + + + + Prompt + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 20 + 70 + 440 + 130 + + + + + 0 + 0 + + + + + 1000 + 200 + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + 100 + 210 + 361 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 270 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 110 + 9 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 30 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 190 + 210 + 271 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 100 + 9 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 20 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 10 + 11 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 90 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 180 + 11 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 20 + 70 + 440 + 130 + + + + + 0 + 0 + + + + + 1000 + 200 + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + 0 + 0 + 472 + 274 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 20 + 70 + 440 + 130 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 411 + 51 + + + + + 100 + 10 + + + + + 600 + 80 + + + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + 10 + 80 + 411 + 32 + + + + QProgressBar +{ + color: rgb(255, 255, 255); + border-radius: 5px; + border:0px; + background-color: qlineargradient(spread:pad, x1:0.97, y1:1, x2:1, y2:0, stop:0 rgba(163, 165, 165, 255), stop:1 rgba(214, 214, 214, 255)); +} + +QProgressBar::chunk +{ + background-color: rgb(170, 255, 127); + width: 20px; +} + +QProgressBar +{ + border-radius: 5px; + text-align: center; +} + + + 0 + + + + + + + 190 + 210 + 271 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 100 + 9 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 190 + 210 + 271 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 100 + 9 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 20 + 70 + 440 + 130 + + + + + 0 + 0 + + + + + 1000 + 200 + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + 190 + 210 + 271 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 9 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 110 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 20 + 40 + 440 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 10 + 91 + 16 + + + + ID: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 20 + 50 + 91 + 16 + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 120 + 10 + 71 + 16 + + + + ID + + + Qt::AlignCenter + + + + + + 120 + 100 + 71 + 16 + + + + DecryptInfo + + + Qt::AlignCenter + + + + + + 20 + 100 + 91 + 16 + + + + DecryptInfo: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 20 + 40 + 440 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 10 + 91 + 16 + + + + Spindle angle: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 10 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 210 + 10 + 91 + 16 + + + + deg + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + 20 + 40 + 440 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 50 + 91 + 16 + + + + New Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 20 + 100 + 91 + 16 + + + + Confirm Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 100 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + 40 + 40 + 440 + 130 + + + + + 0 + 0 + + + + + 1000 + 200 + + + + border:0px; +background-color: rgb(240, 240, 240, 255); + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + 20 + 40 + 441 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 20 + 80 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 110 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 110 + 80 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + 90 + 40 + 371 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 30 + 90 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 20 + 20 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 30 + 30 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 100 + 100 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 110 + 110 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 120 + 120 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + 90 + 50 + 391 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 30 + 70 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 90 + 70 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 270 + 70 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 200 + 70 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 60 + 20 + 72 + 15 + + + + TextLabel + + + + + + 210 + 30 + 72 + 15 + + + + TextLabel + + + + + + 130 + 110 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 20 + 110 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + 20 + 70 + 511 + 191 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 652 + 40 + + + + + + + RadioButton + + + + + + + RadioButton + + + + + + + RadioButton + + + + + + + RadioButton + + + + + + + RadioButton + + + + + + + + + 10 + 40 + 461 + 91 + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + 0 + 0 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + + + + 40 + 40 + 448 + 240 + + + + background-color: rgb(168, 168, 168); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 30 + 75 + 23 + + + + PushButton + + + + + + 280 + 30 + 75 + 23 + + + + PushButton + + + + + + 80 + 110 + 75 + 23 + + + + PushButton + + + + + + 60 + 110 + 16 + 20 + + + + PushButton + + + + + + 160 + 110 + 16 + 20 + + + + PushButton + + + + + + 220 + 110 + 80 + 20 + + + + PushButton + + + + + + 0 + 0 + 75 + 23 + + + + PushButton + + + + + + + 160 + 160 + 321 + 51 + + + + background-color: rgb(184, 184, 184); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 190 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 40 + 10 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + + 30 + 30 + 511 + 191 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 50 + 481 + 41 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 122 + 22 + + + + RadioButton + + + + + + 140 + 10 + 122 + 22 + + + + RadioButton + + + + + + 280 + 10 + 122 + 22 + + + + RadioButton + + + + + + + 20 + 130 + 481 + 41 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 122 + 22 + + + + RadioButton + + + + + + 140 + 10 + 122 + 22 + + + + RadioButton + + + + + + 280 + 10 + 122 + 22 + + + + RadioButton + + + + + + + 20 + 20 + 126 + 27 + + + + + + + + + + 20 + 100 + 126 + 27 + + + + + + + + + + + 100 + 100 + 441 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 30 + 20 + 101 + 19 + + + + WorkHead1 + + + + + + 170 + 20 + 101 + 19 + + + + WorkHead2 + + + + frameBack + labelTitle + labelContent + labelContentInfo + frameProcess + frameProcessBtn + frameWarrantBtn + labelContentWarrant + frameDetecBtn + frameHMIDecrypt + frameSpindleRotate + frameChangePassword + frameTwo + labeBreakHead + frameWorkArea + frameFanArea + frameKnifePressure + frame_Force + frame_FileTransfer + frameSpdSelect + frame_KnifeAndPenSd + frameWorkHeadSet + frameThree + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/sensorinputwidget.cpp b/sharedviews/sensorinputwidget.cpp new file mode 100644 index 0000000..ed6e108 --- /dev/null +++ b/sharedviews/sensorinputwidget.cpp @@ -0,0 +1,602 @@ +#include "sensorinputwidget.h" +#include "ui_sensorinputwidget.h" + +SensorInputWidget::SensorInputWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::SensorInputWidget), + m_itemPerPage(16), + m_pGetSenserTimer(NULL) +{ + ui->setupUi(this); + + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + m_sensorsTypeIdx = -1; + + m_pGetSenserTimer = new QTimer(this); + connect(m_pGetSenserTimer, SIGNAL(timeout()), + this, SLOT(slotOnRefTimer())); + + initData(); + initControl(); + refreshUi(); +} + +SensorInputWidget::~SensorInputWidget() +{ + delete m_pGetSenserTimer; + delete ui; +} + +void SensorInputWidget::initData() +{ + m_curPage = 0; // 当前页 + m_allSensorItemList.clear(); + m_sensorItemList.clear(); + m_itemList.clear(); + m_sensorsDat.clear(); +} + +//初始化窗体控件,包括位置、尺寸、样式 +void SensorInputWidget::initControl() +{ + m_SensorBtnList.append(ui->button1); + m_SensorBtnList.append(ui->button2); + m_SensorBtnList.append(ui->button3); + m_SensorBtnList.append(ui->button4); + m_SensorBtnList.append(ui->button5); + ui->button6->setVisible(true);//显示 + ui->button7->setVisible(true); + ui->button8->setVisible(true); + m_SensorBtnList.append(ui->button6); + m_SensorBtnList.append(ui->button7); + m_SensorBtnList.append(ui->button8); + + m_SensorBtnList.append(ui->button1_2); + m_SensorBtnList.append(ui->button2_2); + m_SensorBtnList.append(ui->button3_2); + m_SensorBtnList.append(ui->button4_2); + m_SensorBtnList.append(ui->button5_2); + ui->button6_2->setVisible(true); + ui->button7_2->setVisible(true); + ui->button8_2->setVisible(true); + m_SensorBtnList.append(ui->button6_2); + m_SensorBtnList.append(ui->button7_2); + m_SensorBtnList.append(ui->button8_2); + + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void SensorInputWidget::initResolution() +{ + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + int sensor_w = (GLB_PARA_WIGHT - GLB_BAS_WIGHT) / 2; // 传感器宽度 + + QRect rectName(GLB_TAB_WIGHT*factoryX, + (GLB_EDGE_WIGHT+(GLB_PARA_HEIGHT-GLB_TEXT_L_HEIGHT)/2)*factoryY, + GLB_TEXT_HEIGHT*factoryX, + GLB_TEXT_HEIGHT*factoryY); + QRect rectValue((GLB_TAB_WIGHT+GLB_TEXT_HEIGHT)*factoryX, + (GLB_BAS_WIGHT+(GLB_PARA_HEIGHT-GLB_TEXT_HEIGHT)/2)*factoryY, + (sensor_w-GLB_TAB_WIGHT-GLB_TEXT_HEIGHT)*factoryX, + GLB_TEXT_HEIGHT*factoryY); + for(int i = 0; i < 2; i++) + { + for(int j = 0; j < m_itemPerPage/2; j++) + { + m_SensorBtnList[i*(m_itemPerPage/2) + j]->setGeometry((GLB_PARA_LEFT+i*(sensor_w + GLB_BAS_WIGHT))*factoryX, + (GLB_PARA_TOP + j * GLB_PARA_HEIGHT +3)*factoryY, + sensor_w*factoryX, + (GLB_PARA_HEIGHT-3)*factoryY); + + m_SensorBtnList[i*(m_itemPerPage/2) + j]->initLeftNameRightValue(rectName,rectValue); + } + } + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonBack->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); +} + +//初始化窗体控件样式 +void SensorInputWidget::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(commonTextColour()); + + for(int i = 0; i < m_SensorBtnList.size(); i++) + { + if(g_emTheme == theme2) + { + + m_SensorBtnList[i]->setEnabled(false); + m_SensorBtnList[i]->labelValue->setStyleSheet("background-color: rgb(0, 0, 0,0);color: rgba(0, 0, 0);"); + m_SensorBtnList[i]->labelName->setStyleSheet("background-color: rgb(0, 0, 0,0);color: rgba(0, 0, 0);"); + m_SensorBtnList[i]->setLabelValueFont(fontSize_M()); + m_SensorBtnList[i]->setLabelNameFont(fontSize_L()); + + }else + { + m_SensorBtnList[i]->setEnabled(false); + m_SensorBtnList[i]->setLabelValueFont(fontSize_M()); + m_SensorBtnList[i]->setLabelNameFont(fontSize_L()); + } + + } + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + ui->buttonBack->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonBack->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonBack->objectName()+"_1")); + }else + { + ui->buttonBack->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonBack->objectName())); + } +} + +//初始化窗体分辨率 +void SensorInputWidget::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,533*scaleX,24*scaleY); + + QRect rectName(35*scaleX,0*scaleY,49*scaleX,49*scaleY); + QRect rectValue(50*scaleX,0,380*scaleX,48*scaleY);//传感器信号的名称 + for(int i = 0; i < 2; i++) + { + for(int j = 0; j < m_itemPerPage/2; j++) + { + m_SensorBtnList[i*(m_itemPerPage/2) + j]->setGeometry(140*scaleX+i*340*scaleX,100*scaleY+j*48*scaleY,380*scaleX,48*scaleY); + m_SensorBtnList[i*(m_itemPerPage/2) + j]->initLeftNameRightValue(rectName,rectValue); + } + } + + ui->framePageBtn->setGeometry(584*scaleX,530*scaleY,427*scaleX,40*scaleY); + ui->labelPage->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonBack->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); +} + +//设置类型图标 +void SensorInputWidget::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +void SensorInputWidget::setMainTitle(QString title) +{ + ui->labelMainTitle->setText(title); +} + +//设置副title +void SensorInputWidget::setSubTitle(QString title) +{ + ui->labelSubTitle->setText(title); +} + +int SensorInputWidget::addSensorItems(QList itemList) +{ + m_allSensorItemList.append(itemList); + return (m_allSensorItemList.size() - itemList.size()); +} + +int SensorInputWidget::addTempSensorItems(QList itemList) +{ + m_tempSensorItemList.append(itemList); + return 0; +} + +void SensorInputWidget::setMachine(Machine *pMc) +{ + g_pMachine = pMc; +} + +void SensorInputWidget::refreshUi() +{ + // QList itemList; + // itemList.clear(); + +#if(0)//测试用 + m_SensorBtnList[0]->setLabelValue("11111"); + m_SensorBtnList[0]->setLabelName("■"); +#endif + + if(m_itemPerPage <= 0) + { + return; + } + + if(m_sensorsTypeIdx == -1)//传感器信号不分类 + { + m_itemList.clear(); +#ifdef Q_OS_WIN + m_itemList.append(m_tempSensorItemList); +#else + m_itemList.append(m_sensorItemList);//根据下位机位图过滤的传感器信号列表放在itemList里 +#endif + } + else + { + getItemList(m_itemList); //根据不同主板加载的分类传感器信号 + } + + //----------- + int itemNum, pageNums; + itemNum = m_itemList.size(); + + //qDebug()<< "RefreshUi m_sensorItemList = "< pageNums) // 当前页 + { + m_curPage = pageNums; + } + if (m_curPage <= 1) + { + m_curPage = 1; + } + + // 刷新文本 + int i, itemidx; + itemidx = (m_curPage-1) * m_itemPerPage; + for (i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + if(m_itemList[itemidx].m_name.length() <= 0)//字符长度为空 + { + //QString str = "byte:" + QString::number(itemList[itemidx].m_byte_offset) + " bit:" + QString::number(m_sensorItemList[itemidx].m_bit_offset); + QString str = "byte:" + QString::number(m_itemList[itemidx].m_byte_offset,16).toUpper() + " bit:" + QString::number(m_itemList[itemidx].m_bit_offset); + qDebug()<<"字符长度为空"<setLabelValue(str); + } + else + { + m_SensorBtnList.at(i)->setLabelValue(m_itemList.at(itemidx).m_name); + } + m_SensorBtnList.at(i)->show(); + } + else + { + m_SensorBtnList.at(i)->hide(); + } + itemidx++; + } + + // 刷新信号 + refreshSensors(); + + // 刷新按钮 + if (m_curPage <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPage >= pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + if(pageNums == 0) + { + m_curPage = 0; + } + + // 页信息 + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPage).arg(pageNums);//页数: + ui->labelPage->setText(str); +} + +void SensorInputWidget::refreshSensors() +{ + QTextCodec *cod = QTextCodec::codecForLocale(); + if(m_sensorsDat.size() <= 0) + { + return; + } + + //-------------------------- + int itemNum, pageNums; + // itemNum = m_sensorItemList.size();//m_sensorItemList + itemNum = m_itemList.size(); + pageNums = (itemNum+m_itemPerPage-1) / m_itemPerPage; + + if (m_curPage > pageNums) // 当前页 + { + m_curPage = pageNums; + } + if (m_curPage <= 1) + { + m_curPage = 1; + } + + // 刷新文本 + int i, itemidx; + itemidx = (m_curPage-1) * m_itemPerPage; + for (i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + //const SensorItem & item = m_sensorItemList.at(itemidx);//m_sensorItemList + const SensorItem & item = m_itemList.at(itemidx); + + int bytepos = item.m_byte_offset; + int bitinbyte = item.m_bit_offset; + + if ( bytepos >= 0 && + bitinbyte >= 0 && + bytepos < m_sensorsDat.size()) + { + u8 curbyte = m_sensorsDat.at(bytepos); + u8 mod = 0x01 << bitinbyte; + + if ((curbyte & mod) != 0) + { + m_SensorBtnList.at(i)->setLabelName(cod->toUnicode("■")); + m_SensorBtnList.at(i)->setLabelNameStyle(ledTextColour()); + } + else + { + m_SensorBtnList.at(i)->setLabelName(cod->toUnicode("□")); + m_SensorBtnList.at(i)->setLabelNameStyle(commonTextColour()); + } + } + else + { + m_SensorBtnList.at(i)->setText(""); + } + } + else + { + break; + } + itemidx++; + } +} + +void SensorInputWidget::getItemList(QList &ItemList) +{ + ItemList.clear(); + + for(int i = 0; i < m_sensorItemList.size(); i++) + { + int type = m_sensorItemList[i].m_type; + + if((type & m_sensorsTypeIdx) != 0 && (type != -1)) + { + ItemList.append(m_sensorItemList[i]);//筛选好的传感器信号,分类传感器信号 + } + } +} + +void SensorInputWidget::show() +{ + m_sensorsDat.clear(); + + if (g_pMachine != NULL) + { //如果没有传感器信号位图 + if (g_pMachine->isSensorBmpEn() == 0) + { + m_sensorItemList.clear(); + g_pMachine->getSensorEnBmpFromMachine();//读取传感器有效位图 + refreshUi(); + + qDebug("send GetSensorEnBmpFromMachine"); + } + } + + //emit(siEntrySensorScan()); + if (m_pGetSenserTimer != NULL) + { + m_pGetSenserTimer->start(500);//读取传感器信号 + } + + if (g_pMachine != NULL) + { + g_pMachine->entrySensorScan(); + } + + qDebug("SensorInputWidget::show"); + + QWidget::show(); +} + +void SensorInputWidget::hide() +{ + if (m_pGetSenserTimer != NULL) + { + m_pGetSenserTimer->stop(); + } + + //emit(siExitSensorScan()); + + if (g_pMachine != NULL) + { + g_pMachine->exitSensorScan(); + } + + qDebug("SensorInputWidget::hide"); + + QWidget::hide(); +} + +void SensorInputWidget::slotRefSensorBitmap(SensorsBitmap map) +{ + qDebug("SensorInputWidget::slotRefSensorBitmap"); + m_sensorItemList.clear(); + if (g_pMachine != NULL) + { + if (g_pMachine->isSensorBmpEn() != 0) + { + QByteArray sensorsbmp; + sensorsbmp.resize(sizeof(SensorsBitmap)); + memcpy(sensorsbmp.data(), &map, sizeof(SensorsBitmap)); + + int ssize = m_allSensorItemList.size() ;//m_allSensorItemList 8192个 机型里的所有主板的传感器信号 + int fsize = sensorsbmp.size(); + int size = (ssize < fsize) ? ssize:fsize; + for (int i = 0; i < size; i++) + { + unsigned char fdat = sensorsbmp.at(i); + for (int j = 0; j < 8; j++) + { + const SensorItem & item = m_allSensorItemList.at( i*8 + j); + if ((fdat & 0x01) != 0) + { + m_sensorItemList.append(item);//根据下位机过滤好的传感器列表 + } + fdat >>= 1 ; + } + } + + qDebug("m_sensorItemList.size=%d", m_sensorItemList.size()); + refreshUi(); + } + } + +} +//接收传感器状态改变的槽函数 +void SensorInputWidget::slotRefSensorsDat(SensorsBitmap dat) +{ + // 读取信号 + m_sensorsDat.clear(); + m_sensorsDat.resize(sizeof(SensorsBitmap)); + memcpy(m_sensorsDat.data(),&dat,sizeof(SensorsBitmap)); + + // 更新视图 + refreshSensors(); +} + +void SensorInputWidget::slotOnRefTimer() +{ + if (g_pMachine != NULL) + { + g_pMachine->getSensorsFromMachine(); // 读取一次信号 + } +} + +void SensorInputWidget::on_buttonPgUp_clicked() +{ + m_curPage--; + refreshUi(); +} + +void SensorInputWidget::on_buttonPgDn_clicked() +{ + m_curPage++; + refreshUi(); +} + +void SensorInputWidget::on_buttonBack_clicked() +{ + this->hide(); +} + +void SensorInputWidget::mousePressEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mousePressX = e->x(); + m_mousePressY = e->y(); + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; + } +} + +void SensorInputWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if ( e->button() == Qt::LeftButton) + { + m_mouseReleaseX = e->x(); + m_mouseReleaseY = e->y(); + } + + int width = this->width(); + int height = this->height(); + if ((m_mousePressX >= 0 && m_mousePressX <= 100) && + ((m_mousePressY >= (height - 100)) && m_mousePressY <= height) && + ((m_mouseReleaseX >= (width - 100)) && m_mouseReleaseX <= width) && + ((m_mouseReleaseY >= (height - 100)) && m_mouseReleaseY <= height)) + { + MainWidgetFunction mainFunction; + QString usbPath;//优盘路径 + usbPath = mainFunction.detectUsb();//优盘检测 + if(usbPath.length() <= 0) + { + //优盘不存在 + return; + } + else + { + QPixmap pixmap=QPixmap::grabWindow(this->winId(),0,0,this->width(),this->height());//截屏存放在pixmap + QString name_pc = usbPath + "EMB" + // + QDateTime::currentDateTime().toString("yyyyMMdd") +//获取时期时间 + +"_"+ + QDateTime::currentDateTime().toString("hhmmss") + ".png"; + + pixmap.save(name_pc,"png"); // 路径 + } + } + + m_mousePressX = 0; + m_mousePressY = 0; + m_mouseReleaseX = 0; + m_mouseReleaseY = 0; +} diff --git a/sharedviews/sensorinputwidget.h b/sharedviews/sensorinputwidget.h new file mode 100644 index 0000000..312f109 --- /dev/null +++ b/sharedviews/sensorinputwidget.h @@ -0,0 +1,103 @@ +#ifndef SENSORINPUTWIDGET_H +#define SENSORINPUTWIDGET_H + +#include +#include +#include + +#include "items/sensoritem.h" +#include "setcontrolstyle.h" +#include "mybutton.h" +#include "mctype/mainwidgetfunction.h" + +#include +#include + +namespace Ui { +class SensorInputWidget; +} + +class SensorInputWidget : public QWidget +{ + Q_OBJECT + +public: + explicit SensorInputWidget(QWidget *parent = 0); + ~SensorInputWidget(); + +private: + Ui::SensorInputWidget *ui; + +public: + void initData(); + void setTypeLogo(QString tStyle); + void setMainTitle(QString title); + void setSubTitle(QString title); + int addSensorItems(QList itemList); + int addTempSensorItems(QList itemList); + void setMachine(Machine *pMc);//设置不同板卡号对应的不同Machine + +public: + void clear(); + +signals: + //void siEntrySensorScan(); + //void siExitSensorScan(); + +public slots: + void slotRefSensorBitmap(SensorsBitmap map); + void slotRefSensorsDat(SensorsBitmap dat); + +private slots: + void slotOnRefTimer(); + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + void on_buttonBack_clicked(); + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initResolution_BlueVer(); + void initControlStyle();//初始化窗体控件样式 + +private: + void refreshUi(); + void refreshSensorBtn(); + void refreshSensors(); + +private: + int m_itemPerPage; + QString m_title; + int m_curPage; + QList m_allSensorItemList;//全部传感器信号列表 8196个 + QList m_tempSensorItemList;//全部传感器信号列表 8196个 + QList m_sensorItemList;//根据下位机位图过滤的传感器信号列表 + QList m_itemList;//根据不同主板筛选传感器信号(20220418-rq) + QByteArray m_sensorsDat; + + QTimer * m_pGetSenserTimer; + QList m_SensorBtnList; + int m_sensorsTypeIdx; // 传感器板卡的索引 + +private: + void getItemList(QList & ItemList); + +public slots: + void show(); + void hide(); + + //鼠标事件 +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + int m_mousePressX; + int m_mousePressY; + int m_mouseReleaseX; + int m_mouseReleaseY; + + +}; + +#endif // SENSORINPUTWIDGET_H diff --git a/sharedviews/sensorinputwidget.ui b/sharedviews/sensorinputwidget.ui new file mode 100644 index 0000000..2790274 --- /dev/null +++ b/sharedviews/sensorinputwidget.ui @@ -0,0 +1,520 @@ + + + SensorInputWidget + + + + 0 + 0 + 1024 + 600 + + + + Form + + + background-color: rgb(139, 139, 139); + + + + + 60 + 120 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 60 + 160 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 30 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 60 + 240 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 60 + 200 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 110 + 10 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sensor + + + + + + 60 + 280 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 60 + 80 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 40 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Sensor + + + + + + 20 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 1/1 + + + + + + 60 + 360 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 60 + 320 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 750 + 560 + 241 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + + 520 + 120 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 280 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 80 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 240 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 160 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 360 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 200 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 520 + 320 + 440 + 32 + + + + Qt::NoFocus + + + + + + + + + frameBack + buttonTypeLogo + labelMainTitle + labelSubTitle + labelPage + framePageBtn + button2 + button5 + button8 + button1 + button4 + button3 + button7 + button6 + button2_2 + button6_2 + button1_2 + button5_2 + button3_2 + button8_2 + button4_2 + button7_2 + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/setcontrolstyle.cpp b/sharedviews/setcontrolstyle.cpp new file mode 100644 index 0000000..c4f83bb --- /dev/null +++ b/sharedviews/setcontrolstyle.cpp @@ -0,0 +1,1199 @@ +#include "setcontrolstyle.h" + +//-------------------------------------------------------------------- +// 窗体尺寸 +const QColor sewcolorYel = QColor(Qt::darkYellow);//黄色 +const QColor sewcolorGreen = QColor(0x35,0xC0,0x5C);//绿色 +const QColor sewcolorGray = QColor(Qt::lightGray); +const QColor sewcolorblue = QColor(0,128,255);//蓝色 + +double getFactoryX() +{ + double factoryX = 1.0; + switch (g_emResolut) + { + case resolution1910: + factoryX = 1920.0/GLB_SCR_WIGHT; + break; + case resolution1006: + factoryX = 1024.0/GLB_SCR_WIGHT; + break; + case resolution0804: + factoryX = 800.0/GLB_SCR_WIGHT; + break; + default: + break; + } + return factoryX; +} + +double getFactoryY() +{ + double factoryY = 1.0; + + switch (g_emResolut) + { + case resolution1910: + factoryY = 1080.0/GLB_SCR_HEIGHT; + break; + case resolution1006: + factoryY = 600.0/GLB_SCR_HEIGHT; + break; + case resolution0804: + factoryY = 480.0/GLB_SCR_HEIGHT; + break; + default: + break; + } + return factoryY; +} + +//-------------------------------------------------------------------- +// 圆角 +QString borderRadius() +{ + int r = 4; +#ifdef Q_OS_WIN + r = 4; +#endif +#ifdef Q_OS_LINUX + r = 4; +#endif + + r *= getFactoryY(); + + QString radius=QString::number(r,10); + return radius; +} +//-------------------------------------------------------------------- +// 字体 + +// 大号字体(标题) +QFont fontSize_L() +{ + QFont size(FONTTYPE,g_fontsize + 2, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + return size; +} + +// 中号字体(正文) +QFont fontSize_M() +{ + QFont size(FONTTYPE,g_fontsize, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + return size; +} + +// 双头组合中号字体(正文) +QFont fontSize_M_DoubleHead() +{ + QFont size(FONTTYPE,g_fontsize-1, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + return size; +} + +// 小号字体(注释) +QFont fontSize_S() +{ + QFont size(FONTTYPE,g_fontsize, FONTNORMAL); + size.setPointSize(size.pointSize()*getFactoryY()); + return size; +} + +//----------------------------------------------------------- +// 字体颜色 + +// 标题栏文本字体颜色 +QString titleTextColour() + +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 标题栏文本字体颜色 2 +QString titleTextColour2() +{ + QString colour = "background-color: rgba(138, 210, 208);color: rgb(0, 0, 0);"; + return colour; +} + +// 主图标文本字体颜色 +// 主窗体左侧主按钮 +QString mainIconTextColour() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 分类图标文本字体颜色 +// 主界面中间分类图标 +QString classIconTextColour() +{ + QString colour = ""; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(57, 57, 57);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 状态栏文本字体颜色 +// 主界面右侧状态栏 +QString stateTextColour() +{ + QString colour = ""; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 警示文本字体颜色 +QString warnTextColour() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 239, 0);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 239, 0);"; + break; + case theme2: + //透明背景色,深蓝色前景色 + colour = "background-color: rgba(255, 255, 255, 0);color: rgb(57, 95, 140);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +QString numValue() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 239, 0);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 239, 0);"; + break; + case theme2: + //透明背景色,深蓝色前景色 + colour = "background-color: rgba(255, 255, 255, 0);color: rgb(57, 95, 140);border:2px solid;"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 弹窗标题栏文本字体颜色 +QString windowTitleTextColour() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);"; + break; + case theme2: + break; + case theme3: + break; + default: + break; + } + + return colour; +} + + +// 普通文本 字体颜色 +// 参数等界面文字,页码颜色 +QString commonTextColour() +{ + QString colour = "QLabel {background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);}" + "QLabel:disabled {color: rgb(127, 127, 127);}";//失效时字体颜色 + + switch (g_emTheme) + { + case theme1: + colour = "QLabel {background-color: rgba(0, 0, 0, 0);color: rgb(255, 255, 255);}" + "QLabel:disabled {color: rgb(127, 127, 127);}";//失效时字体颜色 + break; + case theme2: + colour = "QLabel {background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);}" + "QLabel:disabled {color: rgb(127, 127, 127);}";//失效时字体颜色 + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 注释文本 字体颜色 +// 参数等界面副标题文字 +QString noteTextColour() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(128, 128, 128);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(128, 128, 128);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + + +// 传感器信号 指示灯颜色 +QString ledTextColour() +{ + QString colour = "background-color: rgba(0, 0, 0, 0);color: rgb(63, 193, 216);"; + + switch (g_emTheme) + { + case theme1: + colour = "background-color: rgba(0, 0, 0, 0);color: rgb(234, 170, 58);"; + break; + case theme2: + colour = "background-color: rgba(245, 245, 245, 0);color: rgb(0, 0, 0);"; + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +//----------------------------------------------------------- +// 绘图颜色 +// 未缝制跨步颜色 +u32 getNoJumpColour() +{ + u32 colour = 0; + + switch (g_emTheme) + { + case theme1://黄色 + colour = qRgb(sewcolorYel.red(),sewcolorYel.green(),sewcolorYel.blue()); + break; + case theme2://透明 + colour = qRgba(255,255,255,0); + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 缝制后跨步颜色 +u32 getJumpedColour() +{ + u32 colour{0}; + + switch (g_emTheme) + { + case theme1://黄色 + colour = qRgb(sewcolorYel.red(),sewcolorYel.green(),sewcolorYel.blue()); + break; + case theme2: + colour = qRgb(255,255,255); + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 未缝制颜色颜色 +u32 getNoSewColour() +{ + u32 colour{0}; + + switch (g_emTheme) + { + case theme1: + colour = qRgb(sewcolorGray.red(),sewcolorGray.green(),sewcolorGray.blue()); + break; + case theme2: + colour = qRgba(255,255,255,0); + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +// 缝制后颜色颜色 +u32 getSewedColour() +{ + u32 colour{0}; + + switch (g_emTheme) + { + case theme1://蓝色 + colour = qRgb(sewcolorblue.red(),sewcolorblue.green(),sewcolorblue.blue()); + break; + case theme2: + colour = qRgba(255,255,255,0); + break; + case theme3: + break; + default: + break; + } + + return colour; +} + +//----------------------------------------------------------- +// 控件样式 +// 文本按钮样式 +QString textButtonStyle() +{ + QFont size = fontSize_L(); + QString pSize = QString::number(size.pointSize() + 5); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;font-size:"+ pSize +"px;font-family:"+FONTTYPE+";}"; + + switch (g_emTheme) + { + case theme1: + // 银色按钮,黑字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(255, 255, 255), stop:1 rgb(215, 243, 254));color:rgb(0, 0, 0)}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(217, 222, 224), stop:1 rgb(191,213,223));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(230, 230, 230), stop:1 rgb(182,182,182));}"; + break; + case theme2: + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(215, 243, 254));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +// 数字按钮样式 +QString numButtonStyle() +{ + QFont size = fontSize_L(); + QString pSize = QString::number(size.pointSize() + 5); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;font-size:"+ pSize +"px;font-family:"+FONTTYPE+";}"; + + switch (g_emTheme) + { + case theme1: + // 银色按钮,黑字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(255, 255, 255), stop:1 rgb(215, 243, 254));color:rgb(57, 57, 57);color:rgb(0, 0, 0)}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(217, 222, 224), stop:1 rgb(191,213,223));color:rgb(57, 57, 57);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(230, 230, 230), stop:1 rgb(182,182,182));color:rgb(57, 57, 57);}"; + break; + case theme2: + style += "QPushButton{background-color:rgba(95, 164, 162);}"; + style += "QPushButton:pressed{background-color: rgba(95, 164, 162,100);}"; + style += "QPushButton:disabled{background-color: rgba(176,176,176);}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +// 机头间距按钮样式 +QString headButtonStyle() +{ + QFont size = fontSize_L(); + QString pSize = QString::number(size.pointSize() + 5); + QString style = "QPushButton{border-radius:" + borderRadius() + "px;font-size:"+ pSize +"px;font-family:"+FONTTYPE+";color: rgb(255, 255, 255);}"; + + switch (g_emTheme) + { + case theme1: + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(59, 182, 205), stop:1 rgb(59, 182, 205));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(59, 182, 205), stop:1 rgb(59, 182, 205));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(59, 182, 205), stop:1 rgb(59, 182, 205));}"; + break; + case theme2: + break; + case theme3: + break; + default: + break; + } + + return style; +} + +//弹出窗口背景颜色 +QString frameBackStyle() +{ + QString style = "background-color: rgba(240, 245, 249);"; + return style; +} + +// 主图标样式 +// 主窗体左侧主按钮 +QString mainIconStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(65,197,220), stop:1 rgb(57,176,198));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));}"; + break; + case theme2: + // 淡蓝色 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(215, 243, 254));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +QString mainIconStyleReversal() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(65,197,220), stop:1 rgb(57,176,198));}"; + break; + case theme2: + // 淡蓝色 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(240, 245, 249), stop:1 rgb(215, 243, 254));}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +QString shortBtnStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + // 橙红色按钮 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(254, 177, 133), stop:1 rgb(215, 107, 62));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(220,87,40), stop:1 rgb(200, 67, 30));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(220,87,40), stop:1 rgb(220,117,40));}"; + return style; +} +// 分类图标样式 +// 主界面中间分类图标 +QString classIconStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + break; + case theme2: + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(214, 234, 244), stop:1 rgb(197, 233, 244));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(234, 234, 234), stop:1 rgb(176,176,176));}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(186, 226, 227), stop:1 rgb(105,198,194));}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +// 确认图标样式 +QString confirmIconStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 橙色按钮,白字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + break; + case theme2: + style += "QPushButton{background-color:rgb(95, 164, 162);}"; + style += "QPushButton:pressed{background-color: rgb(95, 164, 162,100);}"; + style += "QPushButton:disabled{background-color: rgba(176,176,176);}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +// 返回图标样式 +// 右上角图标 +QString backIconStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 绿色按钮,黑字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(139, 195, 163), stop:1 rgb(86,172,123));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(105, 147, 123), stop:1 rgb(84,138,107));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(105, 147, 100), stop:1 rgb(84,138,90));}"; + break; + case theme2: + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(139, 195, 163), stop:1 rgb(86,172,123));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(105, 147, 123), stop:1 rgb(84,138,107));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(84,138,90), stop:1 rgb(62,102,67));}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +// 标题图标 +// 左上角图标 +QString titleIconStyle(QString pic) +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(65,197,220), stop:1 rgb(57,176,198));border-image: url(" + pic + ");border:0px;outline: none;}"; + break; + case theme2: + //橙色渐变 + style += "QPushButton{background-color: rgba(138, 210, 208);border-image: url(" + pic + ");border:0px;outline: none;}"; + break; + case theme3: + break; + default: + break; + } + return style; +} + +// 选项卡样式 +// 主控升级 +QString optionsIconStyle() +{ + QString style = "QPushButton{border-radius:0px;}"; + + switch (g_emTheme) + { + case theme1: + style += "QPushButton{border:0px;text-align:left;background-color:rgba(255, 255, 255, 0);color: rgb(255, 255, 255);}"; + style += "QPushButton:checked{background-color: rgba(255, 255, 255, 50);}"; + break; + case theme2: + style += "QPushButton{border:0px;text-align:left;background-color:rgba(255, 255, 255, 0);color: rgb(0, 0, 0);}"; + style += "QPushButton:checked{background-color: rgba(255, 255, 255, 50);}"; + break; + case theme3: + break; + default: + break; + } + return style; +} + +// 进度条样式 +QString progressStyle() +{ + QString style = "QProgressBar{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + style += "QProgressBar{border:0px;}QProgressBar::chunk{background-color: rgb(255, 255, 255);}"; + break; + case theme2: + style += "QProgressBar{border:0px;}QProgressBar::chunk{background-color: rgb(255, 255, 255);}"; + break; + case theme3: + break; + default: + break; + } + return style; +} + +// 透明样式 +//透明色、无焦点、无边框 +QString transparentStyle() +{ + QString style = ""; + + style += "outline:none;border:0px;background-color: rgba(255, 255, 255, 0);border-radius:" + borderRadius() + "px;"; + return style; +} + +// 灰白/白蓝 色样式、无焦点、无边框 +QString ashenStyle() +{ + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style += "outline:none;border:0px;background-color: rgb(86, 86, 86);border-radius:" + borderRadius() + "px;"; + break; + case theme2: + style += "outline:none;border:0px;background-color: rgb(187, 228, 227);border-radius:" + borderRadius() + "px;"; + break; + default: + break; + } + return style; +} + +//黑色 +QString blackStyle() +{ + QString style = "outline:none;border:0px;background-color: rgb(60, 60, 60);border-radius:" + borderRadius() + "px;"; + + return style; +} + +// 灰黑/白灰 色样式、无焦点、无边框 +QString darkgrayStyle() +{ + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style += "outline:none;border:0px;background-color: rgb(67, 67, 67);border-radius:" + borderRadius() + "px;"; + break; + case theme2: + style += "outline:none;border:0px;background-color: rgb(247, 247, 249);border-radius:" + borderRadius() + "px;"; + break; + default: + break; + } + return style; +} + +//----------------------------------------------------------- +SetStyle::SetStyle(QObject *parent) : QObject(parent) +{ + m_uiName.clear(); +} + +void SetStyle::setUiName(QString uiName) +{ + m_uiName = uiName; +} + +QString SetStyle::getStyleSheet(QString controlName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如图片路径 :/images/MainWidget/ButtonConnect_logo.png + QString style; + + switch (g_emTheme) + { + case theme1: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images/"; + break; + case theme2: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images2/"; + break; + case theme3: + break; + default: + break; + } + style += m_uiName + "/"; + style += controlName + "_logo.png);"; + return style; +} + +QString SetStyle::getStyleSheet1(QString controlName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如图片路径 :/images/1920x1080/theme1/EmbMainWidget/ButtonConnect_logo.png + QString style; + style.clear(); + //分辨率 + QString str; + str.clear(); + switch (g_emTheme) + { + case theme1: + { + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images/"; + switch (g_emResolut) + { + case resolution1910: + str = "_1910"; + break; + case resolution1006: + str = "_1006"; + break; + case resolution0804: + str = "_1006"; + break; + default: + break; + } + break; + } + case theme2: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images2/"; + break; + case theme3: + break; + default: + break; + } + + style += m_uiName + "/"; + style += controlName + str + "_logo.png);"; + + return style; +} + +QString SetStyle::getBorderImageStyleSheet(QString controlName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如图片路径 :/images/1920x1080/theme1/EmbMainWidget/ButtonConnect_logo.png + QString style; + switch (g_emTheme) + { + case theme1: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images/"; + break; + case theme2: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images2/"; + break; + case theme3: + break; + default: + break; + } + + //分辨率 + QString str; + str.clear(); + switch (g_emResolut) + { + case resolution1910: + str = "_1910"; + break; + case resolution1006: + str = "_1006"; + break; + case resolution0804: + str = "_1006"; + break; + default: + break; + } + + style += m_uiName + "/"; + style += controlName + str + "_logo.png);"; + + return style; +} + +QString SetStyle::getTopStyleSheet(QString controlName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如 :/images/1920x1080/theme1/EmbMainWidget/buttonPatternSet_logo + QString style = ""; + switch (g_emTheme) + { + case theme1: + style = ":/images/"; + break; + case theme2: + style = ":/images2/"; + break; + case theme3: + break; + default: + break; + } + + style += m_uiName + "/"; + style += controlName + "_logo.png"; + + return style; +} + +QString SetStyle::getBottomStyleSheet(QString parentName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片前缀> + //例如 :/images/EmbMainWidget/frameMainFunction + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style = ":/images/"; + break; + case theme2: + style = ":/images2/"; + break; + case theme3: + break; + default: + break; + } + style += m_uiName + "/"; + style += parentName; + + return style; +} + +QString SetStyle::getBottomStyleSheet1(QString parentName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片前缀> + //例如 :/images/EmbMainWidget/frameMainFunction + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style = ":/images/"; + break; + case theme2: + style = ":/images2/"; + break; + case theme3: + break; + default: + break; + } + //分辨率 + QString str; + str.clear(); + switch (g_emResolut) + { + case resolution1910: + str = "1910_"; + break; + case resolution1006: + str = "1006_"; + break; + case resolution0804: + str = "1006_"; + break; + default: + break; + } + + style += m_uiName +"/"+str; + style += parentName; + + return style; +} + + +QString SetStyle::getSharedStyleSheet() +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如图片路径 :/images/1920x1080/theme1/EmbMainWidget/ButtonConnect_logo.png + QString style; + switch (g_emTheme) + { + case theme1: + style = "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images/"; + break; + case theme2: + style += "background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255);border:0px;border-image:url(:/images2/"; + break; + case theme3: + break; + default: + break; + } + //分辨率 + QString str = "_1006"; + style += "SharedIcon/WidgetFrameBack"+ str +"_logo.png);"; + return style; +} + +QString SetStyle::getSharedTopStyleSheet(QString controlName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片名称> + //例如 :/images/1920x1080/theme1/EmbMainWidget/buttonPatternSet_logo + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style = ":/images/"; + break; + case theme2: + style = ":/images2/"; + break; + case theme3: + break; + default: + break; + } + style += "SharedIcon/"; + style += controlName + "_logo.png"; + + return style; +} + +QString SetStyle::getSharedBottomStyleSheet(QString parentName) +{ + //样式表格式 <分辨率><主题><窗体名称><图片前缀> + //例如 :/images/1920x1080/theme1/EmbMainWidget/frameMainFunction + QString style = ""; + + switch (g_emTheme) + { + case theme1: + style = ":/images/"; + break; + case theme2: + style = ":/images2/"; + break; + case theme3: + break; + default: + break; + } + style += "SharedIcon/"; + style += parentName; + + return style; +} + +/** + * @brief 快捷按钮翻页 + * @return + */ +QString flippingStyle() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;}"; + + switch (g_emTheme) + { + case theme1: + // 绿色按钮,黑字 + style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(139, 195, 163), stop:1 rgb(86,172,123));}"; + style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(105, 147, 123), stop:1 rgb(84,138,107));}"; + style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}"; + style += "QPushButton:checked{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(105, 147, 100), stop:1 rgb(84,138,90));}"; + break; + case theme2: + //蓝色渐变带边框 + style += "QPushButton{background-color: rgb(38, 172, 221);}"; + style += "QPushButton:pressed{background-color: rgb(38, 172, 221,50);}"; + style += "QPushButton:disabled{background-color: rgb(200, 200, 200);}"; + break; + case theme3: + break; + default: + break; + } + + return style; +} + +QString knifeStyle2() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(245,245,245);}"; + style += "QPushButton{background-color: rgb(128,128,64);}"; + style += "QPushButton:pressed{background-color: rgb(108,108,44);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle3() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(245,245,245);}"; + style += "QPushButton{background-color: rgb(0,0,255);}"; + style += "QPushButton:pressed{background-color: rgb(20,20,255);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle4() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(0,0,0);}"; + style += "QPushButton{background-color: rgb(0, 255, 0);}"; + style += "QPushButton:pressed{background-color: rgb(20, 255, 20);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle5() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(0,0,0);}"; + style += "QPushButton{background-color: rgb(255,0,255);}"; + style += "QPushButton:pressed{background-color: rgb(255,20,255);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle6() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(0,0,0);}"; + style += "QPushButton{background-color: rgb(192,192,192);}"; + style += "QPushButton:pressed{background-color: rgb(212,212,212);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle7() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(245,245,245);}"; + style += "QPushButton{background-color: rgb(0,128,0);}"; + style += "QPushButton:pressed{background-color: rrgb(0,148,0);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle8() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(0,0,0);}"; + style += "QPushButton{background-color: rgb(0,255,255);}"; + style += "QPushButton:pressed{background-color: rgb(20,255,255);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} + +QString knifeStyle9() +{ + QString style = "QPushButton{border-radius:" + borderRadius() + "px;color: rgb(0,0,0);}"; + style += "QPushButton{background-color: rgb(255,255,0);}"; + style += "QPushButton:pressed{background-color: rgb(255,255,20);}"; + style += "QPushButton:disabled{background-color: rgb(140, 140, 140);}"; + return style; +} diff --git a/sharedviews/setcontrolstyle.h b/sharedviews/setcontrolstyle.h new file mode 100644 index 0000000..6d928fb --- /dev/null +++ b/sharedviews/setcontrolstyle.h @@ -0,0 +1,138 @@ +#ifndef SETSTYLE_H +#define SETSTYLE_H + +#include +#include +#include "main.h" + +//--------------------------------------- +// 基准分辨率(1024*600)下的控件尺寸/位置 + +//-------------------- +// 全局尺寸 +#define GLB_SCR_WIGHT (1024) // 基础屏幕宽 +#define GLB_SCR_HEIGHT (600) // 基准屏幕高 +#define GLB_EDGE_WIGHT (20) // 控件距边间距 +#define GLB_EDGE_HEIGHT (30) // 上下边缘 +#define GLB_BAS_WIGHT (12) // 控件之间间距 + +#define GLB_ICON_TEXT (6) // 图标与图标文本间距 +#define GLB_TEXT_HEIGHT (20) // 文本高度(中字体) +#define GLB_TEXT_L_HEIGHT (32) // 文本高度(大字体) +#define GLB_TEXT_S_HEIGHT (16) // 文本高度(小字体) + +// 图标 +#define GLB_LICON_SIZE (58) // 大图标尺寸 +#define GLB_MICON_SIZE (42) // 中图标尺寸 +#define GLB_SICON_SIZE (16) // 小图标尺寸 + +// 按钮宽高比 2.5:1 +#define GLB_SBUT_WIGHT (80) // 小按钮宽度 +#define GLB_SBUT_HEIGHT (32) // 小按钮高度 + +#define GLB_MBUT_WIGHT (90) // 中按钮宽度 +#define GLB_MBUT_HEIGHT (36) // 中按钮宽度 + +#define GLB_LBUT_WIGHT (100) // 大按钮宽度 +#define GLB_LBUT_HEIGHT (40) // 大按钮高度 + +// 参数窗口控件位置 +#define GLB_PARA_LEFT (152) // 选项范围 +#define GLB_PARA_TOP (96) // +#define GLB_PARA_WIGHT (720) // +#define GLB_PARA_HEIGHT (53) // + +#define GLB_TAB_WIGHT (24) // 缩进 + +//--------------------------------------- +// 窗体尺寸 +double getFactoryX(); // 宽 +double getFactoryY(); // 高 + +// 圆角 +QString borderRadius(); + +// 字体 +QFont fontSize_L(); // 大号字体(标题) +QFont fontSize_M(); // 中号字体(正文) +QFont fontSize_S(); // 小号字体(注释) +QFont fontSize_M_DoubleHead(); // 双头组合中号字体(正文) + +// 字体颜色 +QString titleTextColour(); // 标题栏文本字体颜色 +QString titleTextColour2(); +QString mainIconTextColour(); // 主图标文本字体颜色 +QString classIconTextColour(); // 分类图标文本字体颜色 +QString stateTextColour(); // 状态栏文本字体颜色 +QString windowTitleTextColour(); // 弹窗标题栏文本字体颜色 + +QString warnTextColour(); // 警示文本字体颜色 +QString commonTextColour(); // 普通文本字体颜色 +QString noteTextColour(); // 注释文本字体颜色 +QString ledTextColour(); // 传感器信号 指示灯颜色 +QString numValue(); + +// 绘图颜色 +u32 getNoJumpColour(); // 未缝制 跨步 +u32 getJumpedColour(); // 缝制后 跨步 +u32 getNoSewColour(); // 未缝制 缝纫针步 +u32 getSewedColour(); // 缝制后 缝纫针步 + +// 控件样式 +QString textButtonStyle(); // 文本按钮样式 +QString headButtonStyle(); // 机头间距按钮样式 +QString numButtonStyle(); // 数字按钮样式 +QString mainIconStyle(); // 主图标样式 +QString mainIconStyleReversal(); // 主图标反转样式 +QString classIconStyle(); // 分类图标样式 +QString confirmIconStyle(); // 确认图标样式 +QString flippingStyle(); // 快捷按钮翻页 +QString backIconStyle(); // 返回图标样式 +QString titleIconStyle(QString pic); // 标题图标 +QString optionsIconStyle(); // 选项卡样式 +QString progressStyle(); // 进度条样式 +QString transparentStyle(); // 透明样式 +QString ashenStyle(); // 灰白样式 +QString darkgrayStyle(); // 灰黑样式 +QString shortBtnStyle(); // 快捷按钮样式 +QString frameBackStyle(); // 弹窗背景 +QString blackStyle(); // 黑色背景 + +//刀号颜色 +QString knifeStyle2(); +QString knifeStyle3(); +QString knifeStyle4(); +QString knifeStyle5(); +QString knifeStyle6(); +QString knifeStyle7(); +QString knifeStyle8(); +QString knifeStyle9(); + +class SetStyle : public QObject +{ + Q_OBJECT +public: + explicit SetStyle(QObject *parent = 0); + +private: + QString m_uiName;//窗体名称 + +public: + void setUiName(QString uiName);//设置窗体名称 + QString getStyleSheet(QString controlName);//获取普通按钮样式表 + QString getStyleSheet1(QString controlName);//获取样式表 + QString getBorderImageStyleSheet(QString controlName);//获取九宫格frame样式表 + QString getTopStyleSheet(QString controlName);//获取自定义按钮顶层样式表 + QString getBottomStyleSheet(QString parentName);//获取自定义按钮底层样式表 + QString getBottomStyleSheet1(QString parentName);//获取自定义按钮底层样式表 + + QString getSharedStyleSheet();//获取普通按钮样式表 + QString getSharedTopStyleSheet(QString controlName);//获取自定义按钮顶层样式表 + QString getSharedBottomStyleSheet(QString parentName);//获取自定义按钮底层样式表 + +signals: + +public slots: +}; + +#endif // SETSTYLE_H diff --git a/sharedviews/setworkarea.cpp b/sharedviews/setworkarea.cpp new file mode 100644 index 0000000..1df0d11 --- /dev/null +++ b/sharedviews/setworkarea.cpp @@ -0,0 +1,190 @@ +#include "setworkarea.h" +#include "ui_setworkarea.h" + +SetWorkArea::SetWorkArea(QWidget *parent) : + QWidget(parent), + ui(new Ui::SetWorkArea) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::NonModal );//用以设置窗口模态类型 ,ApplicationModal阻塞整个应用程序的所有窗口 + initWidget(); + initControl(); +} + +SetWorkArea::~SetWorkArea() +{ + delete ui; +} +void SetWorkArea::initWidget() +{ + m_headValue= 0; + m_area = 2; + ui->frameWorkArea->show(); + + //蓝色 + buttonStyle1 = "QPushButton{outline: none;color:rgb(10,10,10);background-color:rgb(0,151,226);border:0px solid rgb(0,0,0);border-style:inset;border-radius:5px;}"; + //白色 + buttonStyle2 = "QPushButton{outline: none;color:rgb(10,10,10);background-color:rgb(250,250,250);border:0px solid rgb(0,0,0);border-style:inset;border-radius:5px;}"; + ui->buttonX1->setText(tr("X +")); + ui->buttonX2->setText(tr("X -")); + ui->buttonY1->setText(tr("Y +")); + ui->buttonY2->setText(tr("Y -")); + + ui->buttonX1->setStyleSheet(buttonStyle1);//初始化默认都是白色,根据从主控上读上来的当前位置值,显示哪个是蓝色 + ui->buttonX2->setStyleSheet(buttonStyle2); + ui->buttonY1->setStyleSheet(buttonStyle2); + ui->buttonY2->setStyleSheet(buttonStyle2); +} + +void SetWorkArea::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + switch (g_emResolut) + { + case resolution1910: + initResolution1910(); + break; + case resolution1006: + initResolution1006(); + break; + default: + this->resize(1920,1080); + break; + } + initControlStyle();//初始化窗体控件样式 +} +void SetWorkArea::initResolution1910() +{ + //上状态栏 + this->resize(896,497); + this->move((1920-this->width())/2,(1080-this->height())/2); + + ui->frameBack->setGeometry(0,0,946,564); + ui->labelTitle->setGeometry(40,2,754,56); + //设置可移动区域 + ui->frameWorkArea->setGeometry(40,78,904,340); + ui->buttonX1->setGeometry(300,110,160,58);//x+ + ui->buttonX2->setGeometry(10,110,160,58);//x- + ui->buttonY1->setGeometry(150,10,160,58);//y+ + ui->buttonY2->setGeometry(150,205,160,58);//y- + + ui->buttonOk->setGeometry(522,400,174,70); + ui->buttonCancel->setGeometry(704,400,174,70); +} +void SetWorkArea::initResolution1006() +{ + //上状态栏 + + this->resize(480,268); + this->move((1024-this->width())/2,(600-this->height())/2); + + ui->frameBack->setGeometry(0,0,508,304); + ui->labelTitle->setGeometry(5,-10,400,56); + + ui->frameWorkArea->setGeometry(40,58,440,161); + ui->buttonX1->setGeometry(170,60,70,38); + ui->buttonX2->setGeometry(10,60,70,38); + ui->buttonY1->setGeometry(90,10,70,38);//y+ + ui->buttonY2->setGeometry(90,120,70,38); + + ui->buttonOk->setGeometry(274,216,96,40); + ui->buttonCancel->setGeometry(380,216,96,40); +} +//初始化窗体控件样式 +void SetWorkArea::initControlStyle() +{ + SetControlStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //设置控件图标 + //背景图 + //ui->SetWorkArea->setStyleSheet(TRANSPARENTSTYLE); + // ui->frameWorkArea->setStyleSheet(TRANSPARENTSTYLE); + //ui->frameBack->setStyleSheet(TRANSPARENTSTYLE); + // this->setStyleSheet(LABELWHITESTYLE); + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->labelTitle->setStyleSheet(LABELWHITESTYLE); + ui->labelTitle->setFont(fontNormal_1); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); + //设置可工作区域 + ui->frameWorkArea->setStyleSheet(TRANSPARENTSTYLE); + ui->buttonX1->setFont(fontNormal_1); + ui->buttonX2->setFont(fontNormal_1); + ui->buttonY1->setFont(fontNormal_1); + ui->buttonY2->setFont(fontNormal_1); + + ui->buttonOk->setWhiteBlueBottomStyle(); + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonOk->objectName()+"_1"),12); + ui->buttonCancel->setWhiteBlueBottomStyle(); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName()+"_1"),12); +} +//设置标题 +void SetWorkArea::setTitleStr(QString str) +{ + ui->labelTitle->setText(str); +} +void SetWorkArea::show() +{ + QWidget::show(); +} +void SetWorkArea::setHead(int m_head) +{ + m_headValue= m_head; +} +void SetWorkArea::on_buttonCancel_clicked() +{ + + this->hide(); +} + +void SetWorkArea::on_buttonOk_clicked() +{ + if(g_pMachine != NULL) + { + g_pMachine->manualAction(SET_WORK_AREA,m_headValue,m_area); + } + + //this->hide(); +} + +//X+ +void SetWorkArea::on_buttonX1_clicked() +{ + ui->buttonX1->setStyleSheet(buttonStyle1); + ui->buttonX2->setStyleSheet(buttonStyle2); + ui->buttonY1->setStyleSheet(buttonStyle2); + ui->buttonY2->setStyleSheet(buttonStyle2); + + m_area = 2; +} + +//Y+ +void SetWorkArea::on_buttonY1_clicked() +{ + ui->buttonX1->setStyleSheet(buttonStyle2); + ui->buttonX2->setStyleSheet(buttonStyle2); + ui->buttonY1->setStyleSheet(buttonStyle1); + ui->buttonY2->setStyleSheet(buttonStyle2); + m_area = 4; +} + +//Y- +void SetWorkArea::on_buttonY2_clicked() +{ + ui->buttonX1->setStyleSheet(buttonStyle2); + ui->buttonX2->setStyleSheet(buttonStyle2); + ui->buttonY1->setStyleSheet(buttonStyle2); + ui->buttonY2->setStyleSheet(buttonStyle1); + m_area = 3; +} + +void SetWorkArea::on_buttonX2_clicked() +{ + ui->buttonX1->setStyleSheet(buttonStyle2); + ui->buttonX2->setStyleSheet(buttonStyle1); + ui->buttonY1->setStyleSheet(buttonStyle2); + ui->buttonY2->setStyleSheet(buttonStyle2); + m_area =1; +} diff --git a/sharedviews/setworkarea.h b/sharedviews/setworkarea.h new file mode 100644 index 0000000..a3f721d --- /dev/null +++ b/sharedviews/setworkarea.h @@ -0,0 +1,63 @@ +#ifndef SETWORKAREA_H +#define SETWORKAREA_H + +#include +#include +#include +#include "promptdialog.h" +#include "mybutton.h" +#include "setcontrolstyle.h" +//#include "Include/datafiledst.h" +#include "datafile/datafiledst.h" +#include "datafile/datafiledsr.h" +#include "mctype/mainwidgetfunction.h" +#include +namespace Ui { +class SetWorkArea; +} + +class SetWorkArea : public QWidget +{ + Q_OBJECT + +public: + explicit SetWorkArea(QWidget *parent = 0); + ~SetWorkArea(); + +private slots: + void on_buttonCancel_clicked(); + + void on_buttonOk_clicked(); + + void on_buttonX1_clicked(); + + void on_buttonY1_clicked(); + + void on_buttonY2_clicked(); + + void on_buttonX2_clicked(); + +private: + Ui::SetWorkArea *ui; + +private: + int m_area; + int m_headValue; + + QString buttonStyle1; + QString buttonStyle2; +private: + void initWidget(); + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution1910();//初始化窗体控件为1920x1080分辨率 + void initResolution1006();//初始化窗体控件为1024x600分辨率 + void initControlStyle();//初始化窗体控件样式 + +public: + inline int getArea(){return m_area;} + void setHead(int m_head); + void setTitleStr(QString str);//设置标题 + void show(); +}; + +#endif // SETWORKAREA_H diff --git a/sharedviews/setworkarea.ui b/sharedviews/setworkarea.ui new file mode 100644 index 0000000..2acbba7 --- /dev/null +++ b/sharedviews/setworkarea.ui @@ -0,0 +1,216 @@ + + + SetWorkArea + + + + 0 + 0 + 473 + 274 + + + + Form + + + outline:none;border:0px;background-color: rgba(255, 255, 255, 0); + + + + + 0 + 0 + 472 + 274 + + + + background-color: rgba(245, 245, 245, 0);color: rgb(255, 255, 255); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 40 + 40 + 440 + 161 + + + + background-color: rgb(206, 206, 206); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 20 + 80 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 110 + 50 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + 110 + 80 + 75 + 23 + + + + QPushButton +{ +background-color:rgba(250, 250, 250);color: rgb(80, 80, 80);border:0px;border-radius:5px; +} +QPushButton:pressed +{ +background-color: rgba(199, 226, 255); +} + + + + + + + + + + 10 + 10 + 472 + 48 + + + + + + + Prompt + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 350 + 250 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + 250 + 250 + 71 + 31 + + + + Qt::NoFocus + + + + + + + + + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/shuttlebottomlinedialog.cpp b/sharedviews/shuttlebottomlinedialog.cpp new file mode 100644 index 0000000..5a1b36c --- /dev/null +++ b/sharedviews/shuttlebottomlinedialog.cpp @@ -0,0 +1,282 @@ +#include "shuttlebottomlinedialog.h" +#include "ui_shuttlebottomlinedialog.h" + +shuttlebottomlineDialog::shuttlebottomlineDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::shuttlebottomlineDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + initControlStyle(); +} + +shuttlebottomlineDialog::~shuttlebottomlineDialog() +{ + delete ui; +} + +void shuttlebottomlineDialog::on_buttonOk_clicked() +{ + done(0); +} + +void shuttlebottomlineDialog::on_buttonCancel_clicked() +{ + done(0); +} + + +void shuttlebottomlineDialog::initControlStyle() +{ + + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + // ui->frameShuttleline->setStyleSheet(transparentStyle()); + // ui->frameShuttleline->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->frameShuttleline->setGeometry(0,0,1920,900); + + + + //范围 只写了1920*1080的 + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX, 0*factoryY, GLB_SCR_WIGHT*factoryX, GLB_SCR_HEIGHT*factoryY); + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonOk->objectName())); + + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName())); + + ui->ShuttleButton->setGeometry(200,400,120,120); + ui->ShuttleButtonlabel->setGeometry(190,550,150,120); + ui->ShuttleButton->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_2->setGeometry(400,400,120,120); + ui->ShuttleButtonlabel_2->setGeometry(390,550,150,120); + ui->ShuttleButton_2->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_2->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_3->setGeometry(600,400,120,120); + ui->ShuttleButtonlabel_3->setGeometry(590,550,150,120); + ui->ShuttleButton_3->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_3->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_4->setGeometry(800,400,120,120); + ui->ShuttleButtonlabel_4->setGeometry(790,550,150,120); + ui->ShuttleButton_4->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_4->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_5->setGeometry(1000,400,120,120); + ui->ShuttleButtonlabel_5->setGeometry(990,550,150,120); + ui->ShuttleButton_5->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_5->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_6->setGeometry(1200,400,120,120); + ui->ShuttleButtonlabel_6->setGeometry(1190,550,150,120); + ui->ShuttleButton_6->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_6->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButton_7->setGeometry(1400,400,120,120); + ui->ShuttleButtonlabel_7->setGeometry(1390,550,150,120); + ui->ShuttleButton_7->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_7->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + + ui->ShuttleButton_8->setGeometry(1600,400,120,120); + ui->ShuttleButtonlabel_8->setGeometry(1590,550,150,120); + ui->ShuttleButton_8->setStyleSheet(confirmIconStyle()); + ui->ShuttleButton_8->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->ShuttleButton->objectName())); + + ui->ShuttleButtonlabel->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel->setWordWrap(true); + ui->ShuttleButtonlabel->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_2->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_2->setWordWrap(true); + ui->ShuttleButtonlabel_2->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_2->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_3->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_3->setWordWrap(true); + ui->ShuttleButtonlabel_3->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_3->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_4->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_4->setWordWrap(true); + ui->ShuttleButtonlabel_4->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_4->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_5->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_5->setWordWrap(true); + ui->ShuttleButtonlabel_5->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_5->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_6->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_6->setWordWrap(true); + ui->ShuttleButtonlabel_6->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_6->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_7->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_7->setWordWrap(true); + ui->ShuttleButtonlabel_7->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_7->setFont(fontSize_M()); + + ui->ShuttleButtonlabel_8->setStyleSheet(stateTextColour()); + ui->ShuttleButtonlabel_8->setWordWrap(true); + ui->ShuttleButtonlabel_8->setAlignment((Qt::AlignTop|Qt::AlignHCenter)); + ui->ShuttleButtonlabel_8->setFont(fontSize_M()); + + +} + +void shuttlebottomlineDialog::showShuttlenumber(int remainShuttle , int NowBottom) +{ + ui->frameShuttleline->show(); + ui->framePageBtn->show(); + if(remainShuttle == 1) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButton_4->setEnabled(false); + ui->ShuttleButton_5->setEnabled(false); + ui->ShuttleButton_6->setEnabled(false); + ui->ShuttleButton_7->setEnabled(false); + + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + tr("finally"));//已用完 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 2) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButton_4->setEnabled(false); + ui->ShuttleButton_5->setEnabled(false); + ui->ShuttleButton_6->setEnabled(false); + + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 3) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButton_4->setEnabled(false); + ui->ShuttleButton_5->setEnabled(false); + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 4) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButton_4->setEnabled(false); + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 5) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 6) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 7) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + tr("finally"));//已用完 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 8) + { + ui->ShuttleButtonlabel->setText(tr("Remaining quantity:") + " " + QString::number(NowBottom) +"%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_2->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_3->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_4->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_5->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_6->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_7->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + ui->ShuttleButtonlabel_8->setText(tr("Remaining quantity:") + " " + "100%");//当前梭芯底线剩余量 + } + else if(remainShuttle == 0) + { + ui->ShuttleButton->setEnabled(false); + ui->ShuttleButton_2->setEnabled(false); + ui->ShuttleButton_3->setEnabled(false); + ui->ShuttleButton_4->setEnabled(false); + ui->ShuttleButton_5->setEnabled(false); + ui->ShuttleButton_6->setEnabled(false); + ui->ShuttleButton_7->setEnabled(false); + ui->ShuttleButton_8->setEnabled(false); + } + +} diff --git a/sharedviews/shuttlebottomlinedialog.h b/sharedviews/shuttlebottomlinedialog.h new file mode 100644 index 0000000..d5b2c33 --- /dev/null +++ b/sharedviews/shuttlebottomlinedialog.h @@ -0,0 +1,35 @@ +#ifndef SHUTTLEBOTTOMLINEDIALOG_H +#define SHUTTLEBOTTOMLINEDIALOG_H + +#include +#include "machine/comm/protocol.h" + +namespace Ui { +class shuttlebottomlineDialog; +} + +class shuttlebottomlineDialog : public QDialog +{ + Q_OBJECT + +public: + explicit shuttlebottomlineDialog(QWidget *parent = 0); + ~shuttlebottomlineDialog(); + + void showShuttlenumber(int remainShuttle , int NowBottom); + + MCStatus m_mcStatus; + +public slots: + void initControlStyle();//初始化窗体控件样式 + +private slots: + void on_buttonOk_clicked(); + + void on_buttonCancel_clicked(); + +private: + Ui::shuttlebottomlineDialog *ui; +}; + +#endif // SHUTTLEBOTTOMLINEDIALOG_H diff --git a/sharedviews/shuttlebottomlinedialog.ui b/sharedviews/shuttlebottomlinedialog.ui new file mode 100644 index 0000000..32942c1 --- /dev/null +++ b/sharedviews/shuttlebottomlinedialog.ui @@ -0,0 +1,329 @@ + + + shuttlebottomlineDialog + + + + 0 + 0 + 875 + 438 + + + + Dialog + + + + + 330 + 390 + 531 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 450 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 370 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + + 0 + 90 + 871 + 231 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 250 + 130 + 72 + 15 + + + + TextLabel + + + + + + 340 + 90 + 93 + 28 + + + + + + + + + + 550 + 90 + 93 + 28 + + + + + + + + + + 650 + 90 + 93 + 28 + + + + + + + + + + 670 + 130 + 72 + 15 + + + + TextLabel + + + + + + 770 + 130 + 72 + 15 + + + + TextLabel + + + + + + 30 + 130 + 72 + 15 + + + + TextLabel + + + + + + 230 + 90 + 93 + 28 + + + + + + + + + + 140 + 130 + 72 + 15 + + + + TextLabel + + + + + + 470 + 130 + 72 + 15 + + + + TextLabel + + + + + + 570 + 130 + 72 + 15 + + + + TextLabel + + + + + + 120 + 90 + 93 + 28 + + + + + + + + + + 10 + 90 + 93 + 28 + + + + + + + + + + 360 + 130 + 72 + 15 + + + + TextLabel + + + + + + 450 + 90 + 93 + 28 + + + + + + + + + + 750 + 90 + 93 + 28 + + + + + + + + + + + 0 + 0 + 1024 + 600 + + + + background-color: rgb(182, 182, 182); + + + QFrame::StyledPanel + + + QFrame::Raised + + + frameBack + frameShuttleline + framePageBtn + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/systemmanagedialog.cpp b/sharedviews/systemmanagedialog.cpp new file mode 100644 index 0000000..5400767 --- /dev/null +++ b/sharedviews/systemmanagedialog.cpp @@ -0,0 +1,737 @@ +#include "systemmanagedialog.h" +#include "ui_systemmanagedialog.h" + +SystemManageDialog::SystemManageDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::SystemManageDialog), + m_itemPerPage(8) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + + this->move(0+g_mainWidgetPos.x(),0+g_mainWidgetPos.y()); + initDialog(); + initControl(); + + m_logType = 0; + + m_curConnectWifi.clear();//当前连接的wifi + m_curConnectWifiPass.clear();//当前连接的wifi密码 + m_curConnectMode = false;//当前连接的方式 + ui->labelCurIP->clear(); + + ui->buttonSetAutoIP->setEnabled(false); + ui->buttonSetStaticIP->setEnabled(false); +} + +SystemManageDialog::~SystemManageDialog() +{ + delete ui; +} + +//初始化窗体控件,包括位置、尺寸、样式 +void SystemManageDialog::initControl() +{ + m_itemBtnList.clear(); + m_itemBtnList.append(ui->button1); + m_itemBtnList.append(ui->button2); + m_itemBtnList.append(ui->button3); + m_itemBtnList.append(ui->button4); + m_itemBtnList.append(ui->button5); + ui->button6->setVisible(true);//显示 + ui->button7->setVisible(true); + ui->button8->setVisible(true); + m_itemBtnList.append(ui->button6); + m_itemBtnList.append(ui->button7); + m_itemBtnList.append(ui->button8); + + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void SystemManageDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->frameBack->setGeometry(0*factoryX,0*factoryY,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->buttonTypeLogo->setGeometry(GLB_EDGE_WIGHT*factoryX,GLB_EDGE_HEIGHT*factoryY,GLB_LICON_SIZE*factoryX,GLB_LICON_SIZE*factoryY); + ui->labelMainTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT)*factoryX,GLB_EDGE_HEIGHT*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT*2))*factoryX,GLB_TEXT_L_HEIGHT*factoryY); + ui->labelSubTitle->setGeometry((GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT)*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_TEXT_HEIGHT)*factoryY, + (GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_LICON_SIZE+GLB_EDGE_WIGHT+GLB_TAB_WIGHT*2))*factoryX,GLB_TEXT_HEIGHT*factoryY); + + + ui->frameRightUp->setGeometry(0*factoryX,(GLB_EDGE_HEIGHT+GLB_LICON_SIZE-GLB_MICON_SIZE)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_MICON_SIZE*factoryY); + ui->buttonDelete->setGeometry(150*factoryX,0*factoryY,50*factoryX,50*factoryY); + ui->buttonSelectAll->setGeometry(150*factoryX,0*factoryY,50*factoryX,50*factoryY); + ui->buttonExport->setGeometry(90*factoryX,0*factoryY,50*factoryX,50*factoryY); + + ui->frameRightUpWIFI->setGeometry(600*factoryX,40*factoryY,400*factoryX,61*factoryY); + ui->buttonRefresh->setGeometry(300*factoryX,0*factoryY,50*factoryX,50*factoryY); + ui->labelCurIP->setGeometry(0*factoryX,0*factoryY,300*factoryX,50*factoryY); + + ui->buttonChangeLog->setGeometry(20*factoryX,0*factoryY,50*factoryX,50*factoryY); + + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList[i]->setGeometry(GLB_PARA_LEFT*factoryX,(GLB_PARA_TOP + i * GLB_PARA_HEIGHT +3)*factoryY,GLB_PARA_WIGHT*factoryX,(GLB_PARA_HEIGHT-3)*factoryY); + } + + ui->framePageBtn->setGeometry(0*factoryX,(GLB_SCR_HEIGHT-GLB_LBUT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,GLB_SCR_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->labelPage->setGeometry(GLB_EDGE_WIGHT*factoryX,(GLB_SCR_HEIGHT-GLB_TEXT_HEIGHT-GLB_EDGE_WIGHT)*factoryY,(GLB_SCR_WIGHT/3)*factoryX,GLB_TEXT_HEIGHT*factoryY); + ui->labelExplain->setGeometry(130*factoryX,538*factoryY,350*factoryX,50*factoryY); + ui->buttonPgUp->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*3+GLB_LBUT_WIGHT*4))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonPgDn->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*2+GLB_LBUT_WIGHT*3))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonOk->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*1+GLB_LBUT_WIGHT*2))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + ui->buttonCancel->setGeometry((GLB_SCR_WIGHT-(GLB_EDGE_WIGHT+GLB_BAS_WIGHT*0+GLB_LBUT_WIGHT*1))*factoryX,0*factoryY,GLB_LBUT_WIGHT*factoryX,GLB_LBUT_HEIGHT*factoryY); + + ui->framePageBtnWIFI->setGeometry(489*factoryX,545*factoryY,600*factoryX,45*factoryY); + ui->buttonPgUpWIFI->setGeometry(0*factoryX,0*factoryY,96*factoryX,40*factoryY); + ui->buttonPgDnWIFI->setGeometry(106*factoryX,0*factoryY,96*factoryX,40*factoryY); + ui->buttonSetAutoIP->setGeometry(212*factoryX,0*factoryY,96*factoryX,40*factoryY); + ui->buttonSetStaticIP->setGeometry(318*factoryX,0*factoryY,96*factoryX,40*factoryY); + ui->buttonCancelWIFI->setGeometry(424*factoryX,0*factoryY,96*factoryX,40*factoryY); +} + +//初始化窗体控件样式 +void SystemManageDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + //背景图 + QString frameBackImgPath = setControlStyle.getSharedStyleSheet(); + ui->frameBack->setStyleSheet(frameBackImgPath); + ui->labelMainTitle->setFont(fontSize_L()); + ui->labelMainTitle->setStyleSheet(titleTextColour()); + ui->labelSubTitle->setFont(fontSize_M()); + ui->labelSubTitle->setStyleSheet(noteTextColour()); + ui->labelPage->setFont(fontSize_M()); + ui->labelPage->setStyleSheet(commonTextColour()); + ui->labelExplain->setFont(fontSize_M()); + ui->labelExplain->setStyleSheet(titleTextColour()); + + //右上方 + ui->frameRightUp->setStyleSheet(transparentStyle()); + ui->buttonDelete->setStyleSheet(backIconStyle()); + ui->buttonDelete->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonDelete->objectName())); + ui->buttonSelectAll->setStyleSheet(backIconStyle());; + ui->buttonSelectAll->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonSelectAll->objectName())); + ui->buttonExport->setStyleSheet(backIconStyle());; + ui->buttonExport->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonExport->objectName())); + ui->buttonChangeLog->setStyleSheet(backIconStyle());; + ui->buttonChangeLog->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonChangeLog->objectName())); + + //右上方 + ui->frameRightUpWIFI->setStyleSheet(transparentStyle()); + ui->buttonRefresh->setStyleSheet(backIconStyle());; + ui->buttonRefresh->setTopImage(setControlStyle.getTopStyleSheet(ui->buttonChangeLog->objectName())); + ui->labelCurIP->setFont(fontSize_M()); + ui->labelCurIP->setStyleSheet(titleTextColour()); + + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setFont(fontSize_M()); + m_itemBtnList[i]->setStyleSheet(optionsIconStyle()); + } + + //四个按钮样式表一样 + ui->buttonPgUp->setStyleSheet(confirmIconStyle()); + ui->buttonPgUp->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDn->setStyleSheet(confirmIconStyle()); + ui->buttonPgDn->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } + + //WIFI + ui->framePageBtnWIFI->setStyleSheet(transparentStyle()); + ui->buttonPgUpWIFI->setStyleSheet(confirmIconStyle()); + ui->buttonPgUpWIFI->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgUp->objectName())); + + ui->buttonPgDnWIFI->setStyleSheet(confirmIconStyle()); + ui->buttonPgDnWIFI->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonPgDn->objectName())); + + ui->buttonSetAutoIP->setStyleSheet(confirmIconStyle()); + ui->buttonSetAutoIP->setFont(fontSize_M()); + + ui->buttonSetStaticIP->setStyleSheet(confirmIconStyle()); + ui->buttonSetStaticIP->setFont(fontSize_M()); + + ui->buttonCancelWIFI->setStyleSheet(confirmIconStyle()); + ui->buttonCancelWIFI->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonCancel->objectName())); +} + +//初始化窗体分辨率 +void SystemManageDialog::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + + this->resize(1024*scaleX,600*scaleY); + ui->frameBack->setGeometry(0,0,1024*scaleX,600*scaleY); + + ui->buttonTypeLogo->setGeometry(14*scaleX,10*scaleY,42*scaleX,42*scaleY); + ui->labelMainTitle->setGeometry(64*scaleX,4*scaleY,213*scaleX,30*scaleY); + ui->labelSubTitle->setGeometry(64*scaleX,35*scaleY,533*scaleX,24*scaleY); + + ui->frameRightUp->setGeometry(800*scaleX,4*scaleY,300*scaleX,61*scaleY); + ui->buttonDelete->setGeometry(80*scaleX,0,50*scaleX,50*scaleY); + ui->buttonSelectAll->setGeometry(0,0,50*scaleX,50*scaleY); + ui->buttonExport->setGeometry(150*scaleX,0,50*scaleX,50*scaleY);//辅助功能-日志信息的导出 + + ui->frameRightUpWIFI->setGeometry(640*scaleX,4*scaleY,320*scaleX,50*scaleY); + ui->buttonRefresh->setGeometry(220*scaleX,0,50*scaleX,50*scaleY); + ui->labelCurIP->setGeometry(0,0,267*scaleX,50*scaleY); + + ui->buttonChangeLog->setGeometry(80*scaleX,0,50*scaleX,50*scaleY);//辅助功能-日志信息的切换 + + for(int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList[i]->setGeometry(148*scaleX,114*scaleY + i * 48*scaleY,718*scaleX,34*scaleY); + } + + ui->framePageBtn->setGeometry(584*scaleX,530*scaleY,427*scaleX,40*scaleY); + ui->labelPage->setGeometry(26*scaleX,540*scaleY,213*scaleX,40*scaleY); + ui->buttonPgUp->setGeometry(0,0,90*scaleX,40*scaleY); + ui->buttonPgDn->setGeometry(107*scaleX,0,90*scaleX,40*scaleY); + ui->buttonOk->setGeometry(213*scaleX,0,90*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(320*scaleX,0,90*scaleX,40*scaleY); + + ui->framePageBtnWIFI->setGeometry(484*scaleX,530*scaleY,450*scaleX,40*scaleY); + ui->buttonPgUpWIFI->setGeometry(0,0,80*scaleX,40*scaleY); + ui->buttonPgDnWIFI->setGeometry(90*scaleX,0,80*scaleX,40*scaleY); + ui->buttonSetAutoIP->setGeometry(180*scaleX,0,80*scaleX,40*scaleY); + ui->buttonSetStaticIP->setGeometry(270*scaleX,0,80*scaleX,40*scaleY); + ui->buttonCancelWIFI->setGeometry(360*scaleX,0,80*scaleX,40*scaleY); + ui->labelExplain->setGeometry(118*scaleX,512*scaleY,352*scaleX,59*scaleY); +} + +void SystemManageDialog::refreshUi() +{ + int itemNum; + if (m_itemList.size() <= 0) + { + itemNum = 0; + + for (int i = 0; i < m_itemPerPage; i++) + { + m_itemBtnList.at(i)->hide(); + } + ui->labelPage->setText(tr("pageNum: 0/0"));//页数: 0/0 + ui->buttonPgUp->setEnabled(false); + ui->buttonPgDn->setEnabled(false); + ui->buttonOk->setEnabled(false); + + return; + } + else + { + itemNum = m_itemList.size(); + } + + m_pageNums = (itemNum + m_itemPerPage - 1)/m_itemPerPage;// 计算页数 + if (m_curPages > m_pageNums)// 当前页 + { + m_curPages = m_pageNums; + } + if (m_curPages <= 1 && itemNum != 0) + { + m_curPages = 1; + } + + int itemidx = (m_curPages - 1) * m_itemPerPage; + + for (int i = 0; i < m_itemPerPage; i++) + { + if (itemidx < itemNum) + { + //设置图标和文件夹名称 + m_itemBtnList[i]->setText(m_itemList.at(itemidx)); + m_itemBtnList.at(i)->show(); + + itemidx++; + } + else + { + m_itemBtnList.at(i)->hide(); + } + } + + // 翻页按钮 + if (m_curPages <= 1) + { + ui->buttonPgUp->setEnabled(false); + } + else + { + ui->buttonPgUp->setEnabled(true); + } + if (m_curPages >= m_pageNums) + { + ui->buttonPgDn->setEnabled(false); + } + else + { + ui->buttonPgDn->setEnabled(true); + } + + // 页信息 + if(m_pageNums == 0) + { + m_curPages = 0; + } + + QString str = tr("pageNum: ") + QString("%1/%2").arg(m_curPages).arg(m_pageNums);//页数: + ui->labelPage->setText(str); + + refreshCheckedPage(); +} + +void SystemManageDialog::refreshCheckedPage() +{ + if(m_selectedIdx == SELECT_NONE) + { + ui->buttonOk->setEnabled(false); + } + else + { + ui->buttonOk->setEnabled(true); + } + + if(m_selectedIdx == SELECT_ALL) + { + // 刷新页面中被选择的条目 + for(int var = 0; var < m_itemPerPage; var++) + { + // 条目被选中 + m_itemBtnList.at(var)->setCheckable(true); + m_itemBtnList.at(var)->setChecked(true); + } + return; + } + + // 刷新页面中被选择的条目 + for(int var = 0; var < m_itemPerPage; var++) + { + int idx = (m_curPages - 1) * m_itemPerPage + var; + if(m_selectedIdx == idx) + { + // 条目被选中 + m_itemBtnList.at(var)->setCheckable(true); + m_itemBtnList.at(var)->setChecked(true); + } + else + { + // 不被选中 + m_itemBtnList.at(var)->setChecked(false); + m_itemBtnList.at(var)->setCheckable(false); + } + } +} + +void SystemManageDialog::clickItem(int idx) +{ + m_selectedIdx = (m_curPages - 1) * m_itemPerPage + idx - 1; + refreshCheckedPage(); + QString wifiName = m_itemList[m_selectedIdx]; + if(m_curConnectWifi != wifiName) + { + ui->buttonSetAutoIP->setEnabled(true); + ui->buttonSetStaticIP->setEnabled(false); + } + else + { + ui->buttonSetAutoIP->setEnabled(false); + ui->buttonSetStaticIP->setEnabled(true); + } +} + +void SystemManageDialog::initDialog(s16 type) +{ + m_setType = type; + m_curPages = 1;//当前页数 + m_pageNums = 1;//总页数 + m_selectedIdx = SELECT_NONE;//被选中的条目 + m_itemList.clear(); + + if(type != 0) + { + ui->frameRightUpWIFI->show(); + ui->framePageBtnWIFI->show(); + ui->frameRightUp->hide(); + ui->framePageBtn->hide(); + ui->labelExplain->show(); + } + else + { + ui->frameRightUpWIFI->hide(); + ui->framePageBtnWIFI->hide(); + ui->frameRightUp->show(); + ui->framePageBtn->show(); + ui->labelExplain->hide(); + } +} + +//设置类型图标 +void SystemManageDialog::setTypeLogo(QString tStyle) +{ + ui->buttonTypeLogo->setUnPreBtnLogo(tStyle); +} + +//设置主title +void SystemManageDialog::setMainTitle(QString str) +{ + ui->labelMainTitle->setText(str); +} + +//设置副title +void SystemManageDialog::setSubTitle(QString str) +{ + ui->labelSubTitle->setText(str); +} + +void SystemManageDialog::addItem(QString str) +{ + m_itemList.append(str); +} + +void SystemManageDialog::addListError() +{ + m_itemList = g_pSettings->readToCsv(TYPE_ERROR);//读取 QStringList +} + +void SystemManageDialog::addListBreakage() +{ + m_itemList = g_pSettings->readToCsv(TYPE_BREAK);//读取 QStringList +} + +void SystemManageDialog::addListDebug() +{ + m_itemList = g_pSettings->readToCsv(TYPE_DEBUGINFO);//读取 QStringList +} + +int SystemManageDialog::exec(int type)//升级类型 +{ + ui->buttonDelete->setVisible(false); + ui->buttonSelectAll->setVisible(false); + ui->buttonExport->setVisible(false); + + ui->buttonChangeLog->setVisible(false); + + m_updateType = type; + + //当为外围板版本查询时,列表按钮和确定按钮不可按 + if(m_updateType < 0) + { + ui->buttonOk->setEnabled(false); + + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setEnabled(false); + } + } + else + { + if(m_updateType == PRODUCTSTATIS) + { + ui->buttonDelete->setVisible(true); + ui->buttonOk->setEnabled(false); + + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setEnabled(false); + } + } + else if(m_updateType == JOURNAL) + { + ui->buttonDelete->setVisible(false);//不可见 + ui->buttonOk->setEnabled(false); + ui->buttonExport->setVisible(true); + + ui->buttonChangeLog->setVisible(true); + + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setEnabled(false); + } + } + else + { + ui->buttonOk->setEnabled(true); + + for(int i = 0; i < m_itemBtnList.size(); i++) + { + m_itemBtnList[i]->setEnabled(true); + } + } + } + + refreshUi(); + return QDialog::exec(); +} + +QString SystemManageDialog::getCurFile() +{ + QString fileName = m_itemList.at(m_selectedIdx); + return fileName; +} + +void SystemManageDialog::setWifiInfo(QString ip,QString ssid,QString psd,bool mode) +{ + ui->labelCurIP->setText(ip); + m_curConnectWifi = ssid; + m_curConnectWifiPass = psd; + m_curConnectMode = mode; +} + +void SystemManageDialog::setItemList(QStringList list) +{ + m_itemList.clear(); + m_itemList = list; +} + +void SystemManageDialog::on_buttonCancel_clicked() +{ + //超级用户密码权限,单次有效 + g_emUser = operate; + done(0); +} + +void SystemManageDialog::on_buttonOk_clicked() +{ + if(m_updateType == HMI_UPDATA)//界面升级 + { + //升级需要重新启动程序,是否重启进行升级? + qDebug()<<"HMI_UPDATA"; + + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("The upgrade needs to restart the program. Do you need to restart to upgrade?");//升级需要重新启动程序,是否重启进行升级? + promptDlg.setContentStr(str); + if(promptDlg.exec() != 1) + { + //done(0); + return; + } + } + done(1); +} + +void SystemManageDialog::on_buttonPgUp_clicked() +{ + m_curPages--; + refreshUi(); +} + +void SystemManageDialog::on_buttonPgDn_clicked() +{ + m_curPages++; + refreshUi(); +} + +void SystemManageDialog::on_button1_clicked() +{ + clickItem(1); +} + +void SystemManageDialog::on_button2_clicked() +{ + clickItem(2); +} + +void SystemManageDialog::on_button3_clicked() +{ + clickItem(3); +} + +void SystemManageDialog::on_button4_clicked() +{ + clickItem(4); +} + +void SystemManageDialog::on_button5_clicked() +{ + clickItem(5); +} + +void SystemManageDialog::on_button6_clicked() +{ + clickItem(6); +} + +void SystemManageDialog::on_button7_clicked() +{ + clickItem(7); +} + +void SystemManageDialog::on_button8_clicked() +{ + clickItem(8); +} + +void SystemManageDialog::on_buttonDelete_clicked() +{ + if(m_updateType == PRODUCTSTATIS)//等于生产统计 + { + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("Do you want to clear the production statistics?");//是否清空生产统计? + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + emit siClearProductStatis(); + } + } + else if(m_updateType == JOURNAL) + { + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("Do you want to clear the journal?");//是否清空日志文件? + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + emit siClearJournal(); + } + } +} + +void SystemManageDialog::on_buttonSelectAll_clicked() +{ + if(m_selectedIdx == SELECT_ALL) + { + m_selectedIdx = SELECT_NONE; + } + else + { + m_selectedIdx = SELECT_ALL; + } + refreshCheckedPage(); +} + +//导出csv文件 +void SystemManageDialog::on_buttonExport_clicked() +{ + if(m_updateType == JOURNAL)//等于日志文件 + { + PromptDialog promptDlg(this); + promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL); + promptDlg.setTitleStr(tr("Prompt")); + + QString str; + str = tr("Do you want to export journal?");//是否导出日志文件? + promptDlg.setContentStr(str); + if(promptDlg.exec() == 1) + { + emit siCsvExport(m_logType); + } + } +} + +void SystemManageDialog::on_buttonChangeLog_clicked() +{ + //done(0); + //qDebug()<<"buttonChange_clicked" < TYPE_DEBUGINFO) + { + m_logType = 0; + } + + if(m_logType == TYPE_ERROR) + { + emit siCsvChangeErro(); + } + else if(m_logType == TYPE_BREAK) + { + emit siCsvChangeBrea(); + } + else if(m_logType == TYPE_DEBUGINFO) + { + emit siCsvChangeDebug(); + } + + refreshUi(); +} + +//刷新wifi +void SystemManageDialog::on_buttonRefresh_clicked() +{ + m_curPages = 1;//当前页数 + m_pageNums = 1;//总页数 + m_selectedIdx = SELECT_NONE;//被选中的条目 + emit siRefreshWifiList(); + refreshUi(); +} + +void SystemManageDialog::on_buttonPgUpWIFI_clicked() +{ + m_curPages--; + refreshUi(); +} + +void SystemManageDialog::on_buttonPgDnWIFI_clicked() +{ + m_curPages++; + refreshUi(); +} + +void SystemManageDialog::on_buttonSetAutoIP_clicked() +{ + if(m_selectedIdx < m_itemList.size() && m_selectedIdx >= 0) + { + QString ssid = m_itemList.at(m_selectedIdx); + emit siSetDynamicIP(ssid); + } +} + +void SystemManageDialog::on_buttonSetStaticIP_clicked() +{ + QString ssid = m_curConnectWifi; + QString psd = m_curConnectWifiPass; + QStringList ipList = ui->labelCurIP->text().split(".", QString::SkipEmptyParts); + QString ip; + ip.clear(); + if(ipList.size() >= 3) + { + ip = ipList[0]+"."+ipList[1]+"."+ipList[2]+"."; + } + + emit siSetStaticIP(ssid,psd,ip); +} + +void SystemManageDialog::on_buttonCancelWIFI_clicked() +{ + done(0); +} diff --git a/sharedviews/systemmanagedialog.h b/sharedviews/systemmanagedialog.h new file mode 100644 index 0000000..bc9b49a --- /dev/null +++ b/sharedviews/systemmanagedialog.h @@ -0,0 +1,109 @@ +#ifndef SYSTEMMANAGEDIALOG_H +#define SYSTEMMANAGEDIALOG_H + +#include +#include +#include "promptdialog.h" + + +#include "setcontrolstyle.h" + +#define SELECT_NONE -2 //全不选 +#define SELECT_ALL -1 //全选 + +namespace Ui { +class SystemManageDialog; +} + +class SystemManageDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SystemManageDialog(QWidget *parent = 0); + ~SystemManageDialog(); + +private: + Ui::SystemManageDialog *ui; + int m_itemPerPage;//界面每页条目数 + QList m_itemBtnList; + + int m_curPages;//当前页数 + int m_pageNums;//总页数 + int m_selectedIdx;//被选中的条目 + QStringList m_itemList; + + int m_updateType;//升级类型 + int m_logType;//日志类型 0:报错 1:断线 + s16 m_setType; + + QString m_curConnectWifi;//当前连接的wifi + QString m_curConnectWifiPass;//当前连接的wifi密码 + bool m_curConnectMode;//当前连接的方式 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initResolution_BlueVer(); + void initControlStyle();//初始化窗体控件样式 + + void refreshCheckedPage();//刷新条目选中状态 + void clickItem(int idx);//点击某一条目 + +public: + void initDialog(s16 type = 0); + void refreshUi(); + void setTypeLogo(QString tStyle);//设置类型图标 + void setMainTitle(QString str);//设置主title + void setSubTitle(QString str);//设置副title + + void addItem(QString str); + + void addListError();//读取错误日志CSV + void addListBreakage();//读取断线日志CSV + void addListDebug();//读取调试信息CSV + + int exec(int type = 0);//升级类型 + + QString getCurFile();//获取当前选中的文件 + inline int getCurIdx(){return m_selectedIdx;} + void setWifiInfo(QString ip,QString ssid,QString psd,bool mode); + void setItemList(QStringList list); + +signals: + void siClearProductStatis();//清空产量统计 + void siCsvExport(int logType);//导出csv文件 + void siClearJournal();//清空文件日志 + void siCsvChangeErro();//切换报错 + void siCsvChangeBrea();//切换断线 + void siCsvChangeDebug();//切换调试信息 + void siRefreshWifiList();//刷新wifi列表 + void siSetDynamicIP(QString);//设置动态IP + void siSetStaticIP(QString,QString,QString);//设置静态IP + +private slots: + void on_buttonCancel_clicked(); + void on_buttonOk_clicked(); + void on_buttonPgUp_clicked(); + void on_buttonPgDn_clicked(); + void on_button1_clicked(); + void on_button2_clicked(); + void on_button3_clicked(); + void on_button4_clicked(); + void on_button5_clicked(); + void on_button6_clicked(); + void on_button7_clicked(); + void on_button8_clicked(); + void on_buttonDelete_clicked(); + void on_buttonSelectAll_clicked(); + void on_buttonExport_clicked(); + void on_buttonChangeLog_clicked(); + void on_buttonRefresh_clicked(); + void on_buttonPgUpWIFI_clicked(); + void on_buttonPgDnWIFI_clicked(); + void on_buttonSetAutoIP_clicked(); + void on_buttonSetStaticIP_clicked(); + void on_buttonCancelWIFI_clicked(); +}; + +#endif // SYSTEMMANAGEDIALOG_H diff --git a/sharedviews/systemmanagedialog.ui b/sharedviews/systemmanagedialog.ui new file mode 100644 index 0000000..8cbea0b --- /dev/null +++ b/sharedviews/systemmanagedialog.ui @@ -0,0 +1,649 @@ + + + SystemManageDialog + + + + 0 + 0 + 1024 + 600 + + + + Dialog + + + background-color: rgb(120, 120, 120); + + + + + 0 + 0 + 1024 + 600 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 20 + 570 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + PageNums: 1/1 + + + + + + 140 + 280 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 360 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 320 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 80 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 680 + 560 + 321 + 31 + + + + background-color: rgba(255, 255, 255, 0); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 240 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + + 140 + 160 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 240 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 200 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 30 + 10 + 60 + 60 + + + + Qt::NoFocus + + + + + + + + + + + + 110 + 10 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Update + + + + + + 140 + 120 + 760 + 32 + + + + Qt::NoFocus + + + + + + + + + + + + 140 + 40 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + Update + + + + + + 680 + 10 + 321 + 61 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 250 + 20 + 41 + 40 + + + + Qt::NoFocus + + + + + + + + + 200 + 20 + 40 + 40 + + + + Qt::NoFocus + + + background-color: rgb(255, 255, 255); + + + + + + + + + 150 + 20 + 41 + 40 + + + + Qt::NoFocus + + + + + + + + + 100 + 20 + 41 + 40 + + + + Qt::NoFocus + + + + + + + + + + 680 + 10 + 321 + 61 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 250 + 20 + 41 + 40 + + + + Qt::NoFocus + + + + + + + + + 30 + 20 + 181 + 21 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + 192.168.2.196 + + + + + + + 600 + 560 + 401 + 31 + + + + background-color: rgb(118, 118, 118); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 80 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 240 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + StaticIP + + + + + + 160 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + DynamicIP + + + + + + 0 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + 320 + 0 + 75 + 23 + + + + Qt::NoFocus + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + + + + + + + + 160 + 560 + 421 + 31 + + + + + Arial + 8 + + + + background-color: rgba(255, 255, 255, 0); +color: rgb(255, 255, 255); + + + *Before setting the static IP, you need to first set the dynamic IP. After the dynamic IP is set, you need to return to this interface to continue setting the static IP + + + true + + + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +
diff --git a/sharedviews/view/mygraphicsgriditem.cpp b/sharedviews/view/mygraphicsgriditem.cpp new file mode 100644 index 0000000..00b2d5c --- /dev/null +++ b/sharedviews/view/mygraphicsgriditem.cpp @@ -0,0 +1,158 @@ +#include "mygraphicsgriditem.h" +#include + +MyGraphicsGridItem::MyGraphicsGridItem(double gridSpacing,QRectF rect) + : m_gridSpacing(gridSpacing), m_rect(rect) +{ + m_gridSpacing = m_gridSpacing / 8.0; + m_boundingRect = m_rect; + double left = m_rect.left(); + double right = m_rect.right(); + double top = m_rect.top(); + double bottom = m_rect.bottom(); + // 水平网格线 Y + for (double y = top; y <= bottom; y += m_gridSpacing) + { + m_listY.append(y); + } + + // 垂直网格线 + for (double x = left; x <= right; x += m_gridSpacing) + { + m_listX.append(x); + } + +} + +MyGraphicsGridItem::~MyGraphicsGridItem() +{ +} + +void MyGraphicsGridItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + return QGraphicsItem::mousePressEvent(event); +} + +void MyGraphicsGridItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + return QGraphicsItem::mouseMoveEvent(event); +} + +void MyGraphicsGridItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + return QGraphicsItem::mouseReleaseEvent(event); +} + +QRectF MyGraphicsGridItem::boundingRect() const +{ + return m_boundingRect; +} + +void MyGraphicsGridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + + // 获取当前的变换矩阵 + QTransform transform = painter->worldTransform(); + double scaleFactor = sqrt(transform.m11() * transform.m11() + + transform.m22() * transform.m22()); + + QPen pen; + pen.setWidth(1); + double width = pen.width()/scaleFactor; + pen.setWidthF(width); // 线段保持原来的线宽 + painter->setPen(pen); + + // 计算网格线的数量 + double left = m_rect.left(); + double right = m_rect.right(); + double top = m_rect.top(); + double bottom = m_rect.bottom(); + int num = ((right - left) / m_gridSpacing) / 2 ; + double middle = num * m_gridSpacing; + const double epsilon = 1e-9; + + // 水平网格线 + for (int i = 0; i < m_listY.size(); i++) + { + double y = m_listY.at(i); + int indexInt = qRound((y - top) / m_gridSpacing); + + if(fabs(y - middle) < epsilon) + { + pen.setColor(Qt::red); + pen.setStyle(Qt::SolidLine); + } + else if(indexInt % 8 == 6) + { + pen.setColor(Qt::black); + pen.setStyle(Qt::SolidLine); + } + else + { + pen.setColor(Qt::transparent);//透明色 + } + painter->setPen(pen); + painter->drawLine(QPointF(left, y), QPointF(right, y));//加1为笔宽 + } + + // 垂直网格线 + for (int i = 0; i < m_listX.size(); i++) + { + double x = m_listX.at(i); + int indexInt = qRound((x - top) / m_gridSpacing); + if(fabs(x - middle) < epsilon) + { + pen.setColor(Qt::red); + pen.setStyle(Qt::SolidLine); + } + else if(indexInt % 8 == 6) + { + pen.setColor(Qt::black); + pen.setStyle(Qt::SolidLine); + } + else + { + pen.setColor(Qt::transparent);//透明色 + } + painter->setPen(pen); + painter->drawLine(QPointF(x, top), QPointF(x, bottom)); + // 添加数字标注 +// QGraphicsTextItem *textItem = m_scene->addText(QString::number(x), font); +// textItem->setPos(x, top-gridSpacing); +// textItem->setDefaultTextColor(Qt::black); + } +} + +QPointF MyGraphicsGridItem::getClosestFocus(QPointF point) +{ + if (m_listX.isEmpty() || m_listY.isEmpty()) { + return QPointF(0,0); + } + + double minDiffX = std::numeric_limits::max(); + double minDiffY = std::numeric_limits::max(); + double closestX = 0.0; + double closestY = 0.0; + + // 找离 point.x() 最近的 X 值 + for (double x : m_listX) { + double diff = std::fabs(point.x() - x); + if (diff < minDiffX) { + minDiffX = diff; + closestX = x; + } + } + + // 找离 point.y() 最近的 Y 值 + for (double y : m_listY) { + double diff = std::fabs(point.y() - y); + if (diff < minDiffY) { + minDiffY = diff; + closestY = y; + } + } + + return QPointF(closestX, closestY); +} diff --git a/sharedviews/view/mygraphicsgriditem.h b/sharedviews/view/mygraphicsgriditem.h new file mode 100644 index 0000000..936ac21 --- /dev/null +++ b/sharedviews/view/mygraphicsgriditem.h @@ -0,0 +1,47 @@ +#ifndef MYGRAPHICSGRIDITEM_H +#define MYGRAPHICSGRIDITEM_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class MyGraphicsGridItem : public QObject, public QGraphicsItem +{ + Q_OBJECT + Q_INTERFACES(QGraphicsItem) //通知要实现的类构成何种界面的宏 + +public: + MyGraphicsGridItem(double gridSpacing,QRectF rect); + ~MyGraphicsGridItem(); + + //绘图区域 + QRectF boundingRect() const; + //绘制按钮图像的函数 + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget = 0); + QPointF getClosestFocus(QPointF point); + +protected: //事件 + void mousePressEvent(QGraphicsSceneMouseEvent* event); + void mouseMoveEvent(QGraphicsSceneMouseEvent* event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); + +private: + QList m_listX;//X轴坐标点 + QList m_listY;//Y轴坐标点 + QRectF m_boundingRect;//返回形状 + double m_gridSpacing; + QRectF m_rect; + +public slots: +}; + +#endif // MYGRAPHICSGRIDITEM_H diff --git a/sharedviews/view/mygraphicsscene.cpp b/sharedviews/view/mygraphicsscene.cpp new file mode 100644 index 0000000..1c62d7a --- /dev/null +++ b/sharedviews/view/mygraphicsscene.cpp @@ -0,0 +1,1356 @@ +#include "mygraphicsscene.h" +#include + +MyGraphicsScene::MyGraphicsScene() +{ + m_selectedBrush.setColor(Qt::red); + m_defaultBrush.setColor(Qt::blue); + + m_ellipseItemList.clear(); + m_lineItemList.clear(); + + m_draggingPoint = NULL; + m_shapeType = -1; + m_addOrder = 0; + m_isAdsorption = false; + m_ArcCount = 0; +} + +MyGraphicsScene::~MyGraphicsScene() +{ + for(int i = 0; i < m_ellipseItemList.size(); i++) + { + if(m_ellipseItemList[i] != NULL) + { + delete m_ellipseItemList[i]; + } + } + + for(int i = 0; i < m_lineItemList.size(); i++) + { + if(m_lineItemList[i].item != NULL) + { + delete m_lineItemList[i].item; + } + } +} + +void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if(m_draggingPoint) + { + m_draggingPoint->setPen(Qt::NoPen); + m_draggingPoint->setBrush(Qt::blue); + m_draggingPoint = NULL; + emit siCurrentIndex(0); + } + + bool selectFlag = false; + + if (event->button() != Qt::LeftButton) + { + return QGraphicsScene::mousePressEvent(event); + } + + // 找到被点击的点 + for (QGraphicsEllipseItem *point : m_ellipseItemList) + { + //rect是setpos之前的边框,所以要加上pos坐标值 + QRectF rect = point->boundingRect(); + rect.setLeft(rect.left() + point->x()); + rect.setRight(rect.right() + point->x()); + rect.setTop(rect.top() + point->y()); + rect.setBottom(rect.bottom() + point->y()); + + if (rect.contains(event->scenePos())) + { + if(m_draggingPoint) + { + m_draggingPoint->setPen(Qt::NoPen); + m_draggingPoint->setBrush(Qt::blue); + m_draggingPoint = NULL; + } + + // 选中点 + point->setPen(Qt::NoPen); + point->setBrush(Qt::red); + m_draggingPoint = point; + + int index = m_ellipseItemList.indexOf(m_draggingPoint); + //qDebug()<<"index"<pos()"<pos(); + m_dragOffset = event->scenePos() - point->pos(); + selectFlag = true; + break; + } + } + + //选中点 + if(selectFlag == true) + { + return QGraphicsScene::mousePressEvent(event); + } + else + { + QPointF pressPos = event->scenePos(); + //添加吸附判断 + if(m_isAdsorption) + pressPos = m_grid->getClosestFocus(event->scenePos()); + + //画点 //重复点不要添加 + if((m_shapeType == TYPE_DRAG) + || (m_ellipseItemList.size() != 0 + && pressPos == m_ellipseItemList.last()->pos())) + return QGraphicsScene::mousePressEvent(event); + + if(m_shapeType == TYPE_LINE) + { + if(m_ellipseItemList.size() <= 1) + { + //默认位置中心都是0 + QGraphicsEllipseItem *ellipse = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + ellipse->setPos(pressPos); + ellipse->setPen(Qt::NoPen); + ellipse->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + ellipse->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(ellipse); + } + else + { + //先添加起点 + QGraphicsEllipseItem *pointPre = m_ellipseItemList[m_ellipseItemList.size()-1]; + QGraphicsEllipseItem *point = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + point->setPos(pointPre->pos()); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + + //默认位置中心都是0 + QGraphicsEllipseItem *ellipse = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + ellipse->setPos(pressPos); + ellipse->setPen(Qt::NoPen); + ellipse->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + ellipse->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(ellipse); + } + + if(m_ellipseItemList.size() <= 1) + return; + + m_addOrder++; + QPointF start = m_ellipseItemList.at(m_ellipseItemList.size() - 2)->pos(); + QPointF end = pressPos; + + QVector points; + points.append(start); + points.append(end); + QGraphicsPolygonItem *line = this->addPolygon(QPolygonF(points)); + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + line->setPen(pen); + GLineItem item; + item.order = m_addOrder; + item.type = QUI_TYPE_LINE; + item.item = line; + item.points.append(start); + item.points.append(end); + m_lineItemList.append(item); + } + else if(m_shapeType == TYPE_ARC) + { + if(m_ellipseItemList.size() <= 2) + { + //默认位置中心都是0 + QGraphicsEllipseItem *ellipse = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + ellipse->setPos(pressPos); + ellipse->setPen(Qt::NoPen); + ellipse->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + ellipse->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(ellipse); + } + else + { + if(m_ArcCount == 1) + { + //先添加起点 + QGraphicsEllipseItem *pointPre = m_ellipseItemList[m_ellipseItemList.size()-1]; + QGraphicsEllipseItem *point = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + point->setPos(pointPre->pos()); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + } + + //默认位置中心都是0 + QGraphicsEllipseItem *ellipse = this->addEllipse(0 - m_radius, + 0 - m_radius, + 2*m_radius, + 2*m_radius); + ellipse->setPos(pressPos); + ellipse->setPen(Qt::NoPen); + ellipse->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + ellipse->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(ellipse); + } + + m_ArcCount++; + + if(m_ArcCount < 3)//三点确定一条圆弧 + return QGraphicsScene::mousePressEvent(event); + + QList points; + points.clear(); + //第一个点默认为上一个点 + QPointF point1 = m_ellipseItemList.at(m_ellipseItemList.size() - 3)->pos(); + points.append(point1); + QPointF point2 = m_ellipseItemList.at(m_ellipseItemList.size() - 2)->pos(); + points.append(point2); + QPointF point3 = m_ellipseItemList.at(m_ellipseItemList.size() - 1)->pos(); + points.append(point3); + + if(points.size() == 3) + { + m_addOrder++; + double threex[3], threey[3]; + threex[0] = points[0].x(); + threex[1] = points[1].x(); + threex[2] = points[2].x(); + threey[0] = points[0].y(); + threey[1] = points[1].y(); + threey[2] = points[2].y(); + QGraphicsPathItem *arcItem = new QGraphicsPathItem(); + getArcItem(points,arcItem,threex,threey); + + if(arcItem != NULL) + { + this->addItem(arcItem); // 添加到场景中以显示 + GPathItem item; + item.order = m_addOrder; + item.type = QUI_TYPE_ARC; + item.item = arcItem; + item.points = points; + m_pathItemList.append(item); + } + } + +#if(0) + QList arcPoints; + QPointF center; + double radius; + + // 计算圆心 + bool bl = findCircleCenter(point1, point2, point3,center,radius); + if(bl == false) + { + qDebug()<<"findCircleCenter false"; + } + else + { + double startAngle = atan2(point1.y() - center.y(), point1.x() - center.x()); + double endAngle = atan2(point3.y() - center.y(), point3.x() - center.x()); + // 生成圆弧上的点 + double angleSpan = fabs(endAngle - startAngle); + double arcLength = radius * angleSpan; + // 圆弧上的点数 + int segments = qMax(1, static_cast(arcLength / (static_cast(m_maxSegmentLength) / 10))); + + QPointF v1 = point1 - center; + QPointF v2 = point2 - center; + QPointF v3 = point3 - center; + // 叉积判断方向 + double cross = (v2.x() - v1.x()) * (v3.y() - v1.y()) - (v2.y() - v1.y()) * (v3.x() - v1.x()); + bool clockwise = (cross < 0); // true 为顺时针,false 为逆时针 + + if (!clockwise) { + if (endAngle < startAngle) endAngle += 2 * M_PI; + } else { + if (endAngle > startAngle) endAngle -= 2 * M_PI; + } + + for (int i = 0; i <= segments; ++i) + { + double angle = startAngle + i * (endAngle - startAngle) / segments; + QPointF point(center.x() + radius * cos(angle), center.y() + radius * sin(angle)); + arcPoints.append(point); + } + } + + this->removeItem(m_ellipseItemList.last()); + m_ellipseItemList.removeLast(); + this->removeItem(m_ellipseItemList.last()); + m_ellipseItemList.removeLast(); + for(int i = 0; i < arcPoints.size()-1; i++) + { + QPointF start = arcPoints[i]; + QPointF end = arcPoints[i+1]; + + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + //调整椭圆的位置,使其中心位于 points[i] + point->setPos(end.x(), end.y()); + +// QGraphicsLineItem *line = this->addLine(start.x(), start.y(), end.x(), end.y()); +// QPen pen; +// pen.setWidthF(1); +// pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 +// pen.setColor(Qt::blue); +// line->setPen(pen); +// GLineItem item; +// item.type = QUI_TYPE_ARC; +// item.item = line; +// item.points.append(start); +// item.points.append(end); +// m_lineItemList.append(item); + } +#endif + //移除前两个点 + m_ArcCount = 1; + } + } + + //未选中 默认最后一个点是选中点 + if(selectFlag == false && m_ellipseItemList.size() != 0) + { + setLastPointSelected(); + } + + return QGraphicsScene::mousePressEvent(event); +} + +void MyGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + //qDebug()<<"mouseMoveEvent"; + + if (event->buttons() & Qt::LeftButton && m_draggingPoint) + { + QPointF newPos = event->scenePos(); + // 更新相关的线段 + int relLine = getGLineItem(m_draggingPoint,newPos); + //如果直线和圆弧共点(relLine和relArc都会 >0),则先处理直线的点,所以这个if的最后会return + if(relLine > 0) + { + update(); + m_draggingPoint->setPos(newPos); + return QGraphicsScene::mouseMoveEvent(event); + } + + int relArc = getGPathItem(m_draggingPoint,newPos); + if(relArc > 0) + { + update(); + m_draggingPoint->setPos(newPos); + return QGraphicsScene::mouseMoveEvent(event); + } + } + return QGraphicsScene::mouseMoveEvent(event); +} + +void MyGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + return QGraphicsScene::mouseReleaseEvent(event); +} + +QPointF MyGraphicsScene::midpoint(const QPointF &p1, const QPointF &p2) +{ + return QPointF((p1.x() + p2.x()) / 2.0, (p1.y() + p2.y()) / 2.0); +} + +double MyGraphicsScene::slope(const QPointF &p1, const QPointF &p2) +{ + if (p2.x() == p1.x()) return 1; // 避免除以零 + return (p2.y() - p1.y()) / (p2.x() - p1.x()); +} + +bool MyGraphicsScene::findCircleCenter(const QPointF &p1, const QPointF &p2, const QPointF &p3, QPointF ¢er, double &radius) +{ + //判断三点是否共线 + double x1 = p1.x(); + double y1 = p1.y(); + double x2 = p2.x(); + double y2 = p2.y(); + double x3 = p3.x(); + double y3 = p3.y(); + double val = (int)(y3 - y1) * (int)(x2 - x1) - (int)(y2 - y1) * (int)(x3 - x1); + if(val == 0)//三点共线 + { + return false;//三点共线 + } + else//求圆心和半径 + { + double a, b, c, d, e, f; + double xc, yc; + a = 2 * (x2-x1); + b = 2 * (y2-y1); + c = x2*x2 + y2*y2 - x1*x1 - y1*y1; + d = 2 * (x3-x2); + e = 2 * (y3-y2); + f = x3*x3+ y3*y3 - x2*x2 - y2*y2; + + //圆心 + xc = (b*f-e*c)/(b*d-e*a); + yc = (d*c-a*f)/(b*d-e*a); + center.setX(xc); + center.setY(yc); + + //半径 + radius = sqrt((xc-x1)*(xc-x1)+(yc-y1)*(yc-y1)); + } + + return true; +} + +double MyGraphicsScene::findRadius(const QPointF ¢er, const QPointF &point) +{ + return QLineF(center, point).length(); +} + +double MyGraphicsScene::distanceSquared(QPointF p1, QPointF p2) +{ + return (p1.x() - p2.x()) * (p1.x() - p2.x()) + (p1.y() - p2.y()) * (p1.y() - p2.y()); +} + +void MyGraphicsScene::addItemToScene(QByteArray ary) +{ + m_draggingPoint = NULL; + ViewItem * pDispBuff = (ViewItem *)ary.data(); + + int size = ary.size(); + int stitchCount = size/sizeof(ViewItem); + + if (stitchCount <= 0) + { + return; + } + + double bx, by, ex, ey; + bx = by = ex = ey = 0; + + QList points; + points.clear(); + + // 假设第一条线段的第一个点是起始点 + bx = pDispBuff[0].bx; + by = pDispBuff[0].by; + points.append(QPointF(bx, by)); + + for (int i = 0; i < stitchCount; i++) + { + ex = pDispBuff[i].ex; + ey = pDispBuff[i].ey; + points.append(QPointF(ex,ey)); + } + + //创建点和线段 + for(int i = 0; i < points.size(); i++) + { + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + + // 调整椭圆的位置,使其中心位于 points[i] + point->setPos(points[i].x(), points[i].y()); + + if(i == points.size()-1) + { + break; + } + QPointF start = points[i]; + QPointF end = points[i+1]; + QVector vec; + vec.append(start); + vec.append(end); + QGraphicsPolygonItem *line = this->addPolygon(QPolygonF(vec)); + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + line->setPen(pen); + GLineItem item; + item.order = i; + item.type = QUI_TYPE_LINE; + item.item = line; + item.points.append(start); + item.points.append(end); + m_lineItemList.append(item); + } + +#if(0) + // m_linesSeg = new MultiLineSegments(points,nullptr); + // this->addItem(m_linesSeg); + + // m_points.clear(); + // // 创建点 + // for (const auto &pointPos : points) + // { + // Endpoint *point = new Endpoint(pointPos.x(), pointPos.y(), 0.2, nullptr); + // m_points.append(point); + // this->addItem(point); + // } + + // // 创建线段 + // for (int i = 0; i < m_points.size() - 1; ++i) + // { + // Endpoint *start = m_points[i]; + // Endpoint *end = m_points[i + 1]; + // if(i == 0) + // { + // //end->setPos(QPointF(509.317,506.388)); + // } + // LineSegment *line = new LineSegment(start, end, nullptr); + // start->addLineItem(line); + // end->addLineItem(line); + // m_lines.append(line); + // this->addItem(line); + // } +#endif +} + +void MyGraphicsScene::addItemListToScene(QList list) +{ + m_draggingPoint = NULL; + + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + + for(int i = 0; i < list.size(); i++) + { + int num = list[i].points.size(); + + QList points; + points.clear(); + + for(int j = 0; j < num; j++) + { + double x = list[i].points[j].x(); + double y = list[i].points[j].y(); + points.append(QPointF(x,y)); + } + + if(list[i].type == QUI_TYPE_ARC)//三点圆弧 + { + //创建点和线段 + for(int i = 0; i < points.size(); i++) + { + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + + //调整椭圆的位置,使其中心位于 points[i] + point->setPos(points[i].x(), points[i].y()); + } + + if(points.size() == 3) + { + double threex[3], threey[3]; + threex[0] = points[0].x(); + threex[1] = points[1].x(); + threex[2] = points[2].x(); + threey[0] = points[0].y(); + threey[1] = points[1].y(); + threey[2] = points[2].y(); + QGraphicsPathItem *arcItem = new QGraphicsPathItem(); + getArcItem(points,arcItem,threex,threey); + + if(arcItem != NULL) + { + this->addItem(arcItem); // 添加到场景中以显示 + GPathItem item; + item.order = i; + item.type = QUI_TYPE_ARC; + item.item = arcItem; + item.points = points; + m_pathItemList.append(item); + } + } + } + else if(list[i].type == QUI_TYPE_BES)//贝塞尔 + { + //创建点和线段 + for(int i = 0; i < points.size(); i++) + { + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + + //调整椭圆的位置,使其中心位于 points[i] + point->setPos(points[i].x(), points[i].y()); + } + + if(points.size() == 4) + { + // 创建 QPainterPath 并添加贝塞尔曲线 + QPainterPath path; + path.moveTo(points[0]); // 移动到起始点 + path.cubicTo(points[1], points[2], points[3]); // 添加贝塞尔曲线 + // 创建 QGraphicsPathItem 并设置路径 + QGraphicsPathItem *cubItem = new QGraphicsPathItem(path); + cubItem->setPen(pen); // 设置线条颜色和宽度 + this->addItem(cubItem); // 添加到场景中以显示 + GPathItem item; + item.order = i; + item.type = QUI_TYPE_BES; + item.item = cubItem; + item.points = points; + m_pathItemList.append(item); + } + } + else//直线 + { + //创建点和线段 + QVector pointsVec; + pointsVec.clear(); + for(int m = 0; m < points.size(); m++) + { + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + m_ellipseItemList.append(point); + + // 调整椭圆的位置,使其中心位于 points[i] + point->setPos(points[m].x(), points[m].y()); + pointsVec.append(points[m]); + } + QGraphicsPolygonItem *poly = this->addPolygon(QPolygonF(pointsVec)); + if(list[i].type != QUI_TYPE_LINE) + { + pen.setColor(Qt::green); + } + else + { + pen.setColor(Qt::blue); + } + poly->setPen(pen); + GLineItem item; + item.order = i; + item.type = list[i].type; + item.item = poly; + item.points = list[i].points; + m_lineItemList.append(item); + } + } +} + +void MyGraphicsScene::addGrid(double gridSpacing, QRectF rect) +{ + // m_gridSpacing = gridSpacing; + // m_gridRect = rect; + + m_grid = new MyGraphicsGridItem(gridSpacing, rect); + this->addItem(m_grid); +} + +void MyGraphicsScene::cleanScene() +{ + m_shapeType = -1; + m_draggingPoint = NULL; + for(int i = 0 ; i < m_ellipseItemList.size(); i++) + { + this->removeItem(m_ellipseItemList[i]); + } + m_ellipseItemList.clear(); + + for(int i = 0 ; i < m_lineItemList.size(); i++) + { + this->removeItem(m_lineItemList[i].item); + m_lineItemList[i].points.clear(); + } + m_lineItemList.clear(); + + for(int i = 0 ; i < m_pathItemList.size(); i++) + { + this->removeItem(m_pathItemList[i].item); + m_pathItemList[i].points.clear(); + } + m_pathItemList.clear(); +} + +bool MyGraphicsScene::getCurSelectState() +{ + bool bl = false; + + if(m_draggingPoint) + { + bl = true; + } + + if(m_ellipseItemList.size() <= 0) + { + bl = false; + } + + return bl; +} + +bool MyGraphicsScene::initAPoint() +{ + bool bl = false; + + if(m_draggingPoint) + { + bl = true; + } + + if(m_draggingPoint == NULL) + { + if(m_ellipseItemList.size() > 0) + { + m_ellipseItemList[0]->setPen(Qt::NoPen); + m_ellipseItemList[0]->setBrush(Qt::red); + m_draggingPoint = m_ellipseItemList[0]; + emit siCurrentIndex(1); + } + } + + if(m_ellipseItemList.size() <= 0) + { + bl = false; + } + + return bl; +} + +void MyGraphicsScene::forwardAndBackward(int idx) +{ + int index = m_ellipseItemList.indexOf(m_draggingPoint); + index += idx; + if(index < 0 || index >= m_ellipseItemList.size()) + { + if(index < 0) + { + index = 0; + } + if(index >= m_ellipseItemList.size()) + { + index = m_ellipseItemList.size()-1; + } + } + m_draggingPoint->setPen(Qt::NoPen); + m_draggingPoint->setBrush(Qt::blue); + m_draggingPoint = NULL; + + // 选中点 + m_ellipseItemList[index]->setPen(Qt::NoPen); + m_ellipseItemList[index]->setBrush(Qt::red); + m_draggingPoint = m_ellipseItemList[index]; + emit siCurrentIndex(index+1); +} + +void MyGraphicsScene::insertPoint(int dir) +{ + int index = m_ellipseItemList.indexOf(m_draggingPoint); + index += dir; + if(index < 0 || index >= m_ellipseItemList.size()) + { + return; + } + + //默认位置中心都是0 + QGraphicsEllipseItem *point = this->addEllipse(0-m_radius, + 0-m_radius, + 2*m_radius, + 2*m_radius); + point->setPen(Qt::NoPen); + point->setBrush(Qt::blue); + //point->setFlag(QGraphicsItem::ItemIsSelectable, true); + point->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + + QPointF a = m_draggingPoint->pos(); + QPointF b = m_ellipseItemList[index]->pos(); + + // 调整椭圆的位置 + QPointF m = QPointF((a.x()+b.x())/2.0,(a.y()+b.y())/2.0); + point->setPos(m.x(), m.y()); + + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + + //向前插入点和线 + if(dir < 0) + { + m_ellipseItemList.insert(index-dir,point); + //插入线,先把原来的线段删除,再插入两端线段 + this->removeItem(m_lineItemList[index].item); + m_lineItemList.removeAt(index); + + //先插入后半段 + QPointF start = m; + QPointF end = a; + QVector vec; + vec.append(start); + vec.append(end); + QGraphicsPolygonItem *line = this->addPolygon(QPolygonF(vec)); + line->setPen(pen); + GLineItem item; + item.item = line; + item.points.append(start); + item.points.append(end); + m_lineItemList.insert(index,item); + + //再插入前半段 + start = b; + end = m; + QVector vec1; + vec1.append(start); + vec1.append(end); + QGraphicsPolygonItem *line1 = this->addPolygon(QPolygonF(vec1)); + line1->setPen(pen); + GLineItem item1; + item1.item = line1; + item1.points.append(start); + item1.points.append(end); + m_lineItemList.insert(index,item1); + emit siCurrentIndex(index-dir+2); + } + else + { + m_ellipseItemList.insert(index,point); + //插入线,先把原来的线段删除,再插入两端线段 + this->removeItem(m_lineItemList[index-dir].item); + m_lineItemList.removeAt(index-dir); + + //先插入后半段 + QPointF start = m; + QPointF end = b; + QVector vec; + vec.append(start); + vec.append(end); + QGraphicsPolygonItem *line = this->addPolygon(QPolygonF(vec)); + line->setPen(pen); + GLineItem item; + item.item = line; + item.points.append(start); + item.points.append(end); + m_lineItemList.insert(index-dir,item); + + //再插入前半段 + start = a; + end = m; + QVector vec1; + vec1.append(start); + vec1.append(end); + QGraphicsPolygonItem *line1 = this->addPolygon(QPolygonF(vec1)); + line1->setPen(pen); + GLineItem item1; + item1.item = line1; + item1.points.append(start); + item1.points.append(end); + m_lineItemList.insert(index-dir,item1); + emit siCurrentIndex(index); + } +} + +void MyGraphicsScene::removeSelectPoint() +{ + int index = m_ellipseItemList.indexOf(m_draggingPoint); + + qDebug() << " m_ellipseItemList.indexOf " << index; + if(m_ellipseItemList.size() > 1) + { + //将点相关的两条线段改为一条 + if(index == 0) + { + this->removeItem(m_lineItemList[0].item); + m_lineItemList.removeFirst(); + } + else if(index == m_ellipseItemList.size()-1) + { + this->removeItem(m_lineItemList[m_lineItemList.size()-1].item); + m_lineItemList.removeLast(); + } + else + { + this->removeItem(m_lineItemList[index-1].item); + this->removeItem(m_lineItemList[index].item); + m_lineItemList.removeAt(index-1); + m_lineItemList.removeAt(index-1); + + QPointF start = m_ellipseItemList[index-1]->pos(); + QPointF end = m_ellipseItemList[index+1]->pos(); + + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + QVector vec; + vec.append(start); + vec.append(end); + QGraphicsPolygonItem *line = this->addPolygon(QPolygonF(vec)); + line->setPen(pen); + GLineItem item; + item.item = line; + item.points.append(start); + item.points.append(end); + m_lineItemList.insert(index-1,item); + } + } + + + this->removeItem(m_draggingPoint); + m_ellipseItemList.removeAt(index); + setLastPointSelected(); +} + +void MyGraphicsScene::setShapeType(int type) +{ + if(type == TYPE_LINE && m_shapeType == TYPE_ARC) + { + //上一次画直线或圆时,只画了一个点,要删除该点 + if(m_ArcCount == 2) + { + QGraphicsEllipseItem *item = m_ellipseItemList.last(); + this->removeItem(item); + m_ellipseItemList.removeOne(item); + m_ArcCount = 0; + } + } + //切换到了圆 + else if(type == TYPE_ARC && m_shapeType == TYPE_LINE) + { + m_ArcCount = 1; + } + + if(type == TYPE_ARC && m_ellipseItemList.size() <= 0) + { + m_ArcCount = 0; + } + m_shapeType = type; + setLastPointSelected(); +} + +void MyGraphicsScene::setAdsorption(bool adsorption) +{ + m_isAdsorption = adsorption; +} + +void MyGraphicsScene::setLastPointSelected() +{ + if(m_ellipseItemList.size() == 0) + { + m_draggingPoint = NULL; + } + else + { + if(m_draggingPoint != NULL) + { + m_draggingPoint->setPen(Qt::NoPen); + m_draggingPoint->setBrush(Qt::blue); + } + + QGraphicsEllipseItem *point = m_ellipseItemList.last(); + // 选中点 + point->setPen(Qt::NoPen); + point->setBrush(Qt::red); + m_draggingPoint = point; + emit siCurrentIndex(m_ellipseItemList.size()); + } +} + +void MyGraphicsScene::setMaxSegmentLength(int value) +{ + m_maxSegmentLength = value; +} + +int MyGraphicsScene::getMaxSegmentLength() +{ + return m_maxSegmentLength; +} + +int MyGraphicsScene::getArcItem(QList points, QGraphicsPathItem *item, double threex[], double threey[]) +{ + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + + int val = isThreePointOnALine(threex, threey); + if(val == 1 || val == 2)//三个点或两个点重合 + { + QPainterPath path; + path.moveTo(points[0]); + + //线段 + for(int i = 1; i < points.size(); i++) + { + path.lineTo(points[i].x(),points[i].y()); + item->setPath(path); + item->setPen(pen); // 设置线条颜色和宽度 + } + } + else + { + double xc = 0; + double yc = 0; + double r = 0; + getArcCenter(threex, threey, &xc, &yc, &r); //计算圆心和半径 + + QPointF center(xc,yc); + // 创建一个 QPainterPath 并添加弧线 + // 2. 计算三个点的角度 + qreal startAngle = QLineF(center, points[0]).angle(); + qreal endAngle = QLineF(center, points[2]).angle(); + + // 3. 计算中间点角度,用于判断走哪一边 + qreal midAngle = QLineF(center, points[1]).angle(); + + // 辅助函数:将角度差归一化到 [-180, 180] + auto normalizeDiff = [](qreal diff) + { + while (diff < -180) diff += 360; + while (diff > 180) diff -= 360; + return diff; + }; + + // 计算从 start 到 end 的两种可能跨度 + qreal diff = normalizeDiff(endAngle - startAngle); // 最短角度差 [-180, 180] + + qreal spanCCW, spanCW; + if (diff >= 0) + { + spanCCW = diff; // 逆时针短弧 + spanCW = diff - 360; // 顺时针长弧 + } + else + { + spanCCW = diff + 360; // 逆时针长弧 + spanCW = diff; // 顺时针短弧 + } + + // 判断中间点在哪段弧上 + auto isAngleInArc = [&](qreal angle, qreal span) -> bool + { + qreal rel = normalizeDiff(angle - startAngle); // 相对于起点的角度差 + if (span >= 0) + { + return (rel >= -1e-3 && rel <= span + 1e-3); + } + else + { + return (rel <= 1e-3 && rel >= span - 1e-3); + } + }; + + qreal finalSpan; + if (isAngleInArc(midAngle, spanCCW)) + { + finalSpan = spanCCW; + } + else if (isAngleInArc(midAngle, spanCW)) + { + finalSpan = spanCW; + } + else + { + // fallback: 选绝对值较小的(劣弧) + finalSpan = (std::abs(spanCCW) <= std::abs(spanCW)) ? spanCCW : spanCW; + } + + // 创建路径 + QPainterPath path; + path.moveTo(points[0]); + path.arcTo(xc - r, yc - r, 2 * r, 2 * r, startAngle, finalSpan); + + item->setPath(path); + item->setPen(pen); + } + return 1; +} + +int MyGraphicsScene::getGLineItem(QGraphicsEllipseItem* p,QPointF p1) +{ + int rel = 0; + if(p) + { + QPointF position = p->pos(); + + for(int i = 0; i < m_lineItemList.size(); i++) + { + for(int j = 0; j < m_lineItemList[i].points.size(); j++) + { + if(position == m_lineItemList[i].points[j]) + { + m_lineItemList[i].points[j] = p1; + rel = 1; + + QVector pointsVec; + pointsVec.reserve(m_lineItemList[i].points.size()); + for (const QPointF &p : m_lineItemList[i].points) + { + pointsVec.append(p); + } + + QGraphicsPolygonItem *pLine = m_lineItemList[i].item; + pLine->setPolygon(QPolygonF(pointsVec)); + return rel; + } + } + } + } + return rel; +} + +int MyGraphicsScene::getGPathItem(QGraphicsEllipseItem* p,QPointF p1) +{ + int rel = 0; + if(p) + { + QPointF position = p->pos(); + + for(int i = 0; i < m_pathItemList.size(); i++) + { + for(int j = 0; j < m_pathItemList[i].points.size(); j++) + { + if(position == m_pathItemList[i].points[j]) + { + if(m_pathItemList[i].points.size() == 3)//圆弧 + { + rel = 1; + m_pathItemList[i].points[j] = p1; + QGraphicsPathItem *pPath = m_pathItemList[i].item; + QList points = m_pathItemList[i].points; + double threex[3], threey[3]; + threex[0] = points[0].x(); + threex[1] = points[1].x(); + threex[2] = points[2].x(); + threey[0] = points[0].y(); + threey[1] = points[1].y(); + threey[2] = points[2].y(); + getArcItem(points,pPath,threex,threey); + return rel; + } + else if(m_pathItemList[i].points.size() == 4)//贝塞尔4个点 + { + rel = 2; + m_pathItemList[i].points[j] = p1; + QGraphicsPathItem *pPath = m_pathItemList[i].item; + + // 创建 QPainterPath 并添加贝塞尔曲线 + QPainterPath path; + path.moveTo(m_pathItemList[i].points[0]); // 移动到起始点 + path.cubicTo(m_pathItemList[i].points[1], m_pathItemList[i].points[2], m_pathItemList[i].points[3]); // 添加贝塞尔曲线 + // 创建 QGraphicsPathItem 并设置路径 + pPath->setPath(path); + QPen pen; + pen.setWidthF(1); + pen.setCosmetic(true); // 设置为眉笔模式,线段在缩放时保证粗细不变 + pen.setColor(Qt::blue); + pPath->setPen(pen); // 设置线条颜色和宽度 + return rel; + } + } + } + } + } + return rel; +} + +void MyGraphicsScene::setXYMove(double valX,double valY) +{ + if(m_draggingPoint == NULL) + { + return; + } + + QPointF newPos(m_draggingPoint->x()+valX,m_draggingPoint->y()+valY); + int relLine = getGLineItem(m_draggingPoint,newPos); + //如果直线和圆弧共点(relLine和relArc都会 > 0),则先处理直线的点,所以这个if的最后会return + if(relLine > 0) + { + update(); + m_draggingPoint->setPos(newPos); + return; + } + + int relArc = getGPathItem(m_draggingPoint,newPos); + if(relArc > 0) + { + update(); + m_draggingPoint->setPos(newPos); + return; + } +} + +//撤销最后一个图元 +void MyGraphicsScene::revokeLastItem() +{ + if(m_ellipseItemList.size() <= 0) + { + return; + } + + int num = 0;//已删除的数量 + int pointsNum = 0;//总共的点的个数 + + int order = m_lineItemList.size() + m_pathItemList.size(); + for(int i = 0; i < m_lineItemList.size(); i++) + { + if(m_lineItemList[i].order == order) + { + //去掉两个点 + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + + if(m_lineItemList.size() > i) + { + this->removeItem(m_lineItemList[i].item); + m_lineItemList.removeAt(i); + num++; + } + + break; + } + } + for(int i = 0; i < m_pathItemList.size(); i++) + { + if(m_pathItemList[i].order == order) + { + //去掉三个点 + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + + if(m_pathItemList.size() > i) + { + this->removeItem(m_pathItemList[i].item); + m_pathItemList.removeAt(i); + num++; + } + + break; + } + } + + for(int i = 0; i < m_lineItemList.size(); i++) + { + pointsNum += m_lineItemList[i].points.size(); + } + for(int i = 0; i < m_pathItemList.size(); i++) + { + pointsNum += m_pathItemList[i].points.size(); + } + + //如果图元点总和与m_ellipseItemList的数量不一致,要删除m_ellipseItemList多余点,因为很可能画圆弧画了一半 + if(pointsNum != m_ellipseItemList.size()) + { + while(1) + { + if(m_ellipseItemList.size() > 0) + { + this->removeItem(m_ellipseItemList[m_ellipseItemList.size()-1]); + m_ellipseItemList.removeLast(); + } + if(pointsNum == m_ellipseItemList.size()) + { + break; + } + } + } + + m_addOrder -= num; + m_shapeType = TYPE_DRAG; + + setLastPointSelected(); +} + +QList MyGraphicsScene::getPointList() +{ + return m_ellipseItemList; +} + +QList MyGraphicsScene::getLineItemList() +{ + return m_lineItemList; +} + +QList MyGraphicsScene::getPathItemList() +{ + return m_pathItemList; +} diff --git a/sharedviews/view/mygraphicsscene.h b/sharedviews/view/mygraphicsscene.h new file mode 100644 index 0000000..7c8b083 --- /dev/null +++ b/sharedviews/view/mygraphicsscene.h @@ -0,0 +1,126 @@ +#ifndef MYGRAPHICSSCENE_H +#define MYGRAPHICSSCENE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mygraphicsgriditem.h" +#include "machine/comm/datadef.h" +#include "datafile/dataoperat.h" +#include "main.h" + +#define DRAWMARGINS 200.0 //item在场景中绘制时的边距(留边) + +#define TYPE_DRAG -1 //拖拽 +#define TYPE_LINE 0 //直线 +#define TYPE_ARC 1 //三点圆 + +struct GLineItem +{ + u16 order;//顺序 + WORD type; + QGraphicsPolygonItem* item; + QList points; +}; + +struct GPathItem +{ + u16 order;//顺序 + WORD type; + QGraphicsPathItem* item; + QList points; +}; + +struct SelectPoint +{ + int type;//选中点类型 0:起点 1:终点 2:中间点 + int idx;//图元索引 +}; + +/// +/// \brief The MyGraphicsScene class +///场景层 记录实际数据 +/// +class MyGraphicsScene: public QGraphicsScene +{ + Q_OBJECT +public: + MyGraphicsScene(); + ~MyGraphicsScene(); + +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); +// void drawBackground(QPainter *painter, const QRectF &rect); + +private: + QByteArray m_dispDat; + MyGraphicsGridItem *m_grid; + qreal m_radius = 0.5; + QBrush m_selectedBrush; + QBrush m_defaultBrush; + QList m_ellipseItemList; //顶点圆圈的元素 + QList m_lineItemList; //直线元素 + QList m_pathItemList; //路径元素 + QPointF m_dragOffset; //拖拽点的坐标 + QGraphicsEllipseItem *m_draggingPoint; //拖拽点的元素 + int m_ArcCount = 0; //圆弧记录坐标个数 个数在0-2之间 + int m_shapeType = TYPE_DRAG; + bool m_isAdsorption = true; + int m_maxSegmentLength = 20; + int m_addOrder;//绘制图元时的绘制顺序 + +private: + // 计算两点之间的中点 + QPointF midpoint(const QPointF &p1, const QPointF &p2); + // 计算两点之间连线的斜率 + double slope(const QPointF &p1, const QPointF &p2); + // 计算圆心 + bool findCircleCenter(const QPointF &p1, const QPointF &p2, const QPointF &p3, QPointF ¢er, double &radius); + // 计算半径 + double findRadius(const QPointF ¢er, const QPointF &point); + // 计算两点之间的距离平方 + double distanceSquared(QPointF p1, QPointF p2); + +public: + QList getPointList(); + QList getLineItemList(); + QList getPathItemList(); + void addItemToScene(QByteArray ary); + void addItemListToScene(QList list); + void addGrid(double gridSpacing,QRectF rect); + void cleanScene(); + bool getCurSelectState(); + bool initAPoint(); + void forwardAndBackward(int idx); + void insertPoint(int dir); + void removeSelectPoint(); + void setShapeType(int type); + void setAdsorption(bool adsorption); + void setLastPointSelected(); + void setMaxSegmentLength(int value); + int getMaxSegmentLength(); + int getArcItem(QList points, QGraphicsPathItem* item, double threex[], double threey[]); + int getGLineItem(QGraphicsEllipseItem* p,QPointF p1); + int getGPathItem(QGraphicsEllipseItem*p,QPointF p1); + void setXYMove(double valX,double valY); + void revokeLastItem();//撤销最后一个图元 + +signals: + void siCurrentIndex(int idx); + +public slots: +}; + +#endif // MYGRAPHICSSCENE_H diff --git a/sharedviews/view/mygraphicsview.cpp b/sharedviews/view/mygraphicsview.cpp new file mode 100644 index 0000000..4d11da2 --- /dev/null +++ b/sharedviews/view/mygraphicsview.cpp @@ -0,0 +1,395 @@ +#include "mygraphicsview.h" + +MyGraphicsView::MyGraphicsView(QWidget *parent, double gridUnit) : QGraphicsView(parent) +{ + m_scene = new MyGraphicsScene(); + m_scene->setSceneRect(0,0,SCENESIZE,SCENESIZE);//1016像素,1像素代表1毫米 + this->setScene(m_scene); + setMouseTracking(true); // 跟踪鼠标位置 + m_scene->addGrid(gridUnit,m_scene->sceneRect()); + + connect(m_scene, SIGNAL(siCurrentIndex(int)), this, SIGNAL(siCurrentIndex(int))); +} + +MyGraphicsView::~MyGraphicsView() +{ + if(m_scene != NULL) + { + delete m_scene; + m_scene = NULL; + } +} + +void MyGraphicsView::restoreView() +{ + //还原缩放,恢复默认大小 + this->resetTransform(); + + // 计算场景的中心点 + // 获取场景中的矩形范围 + QRectF sceneRect = m_scene->sceneRect(); + // 计算场景的中心点 + QPointF centerPoint = sceneRect.center(); + // 获取当前视图的大小 + int viewWidth = this->width(); + int viewHeight = this->height(); + + // 计算滚动条应该移动的距离 + // 目标是让场景的中心点与视图的中心点对齐 + int hValue = centerPoint.x() - viewWidth / 2; + int vValue = centerPoint.y() - viewHeight / 2; + + // 设置滚动条的位置 + this->horizontalScrollBar()->setValue(hValue); + this->verticalScrollBar()->setValue(vValue); + m_scene->cleanScene(); +} + +void MyGraphicsView::resizeEvent(QResizeEvent *event) +{ + if(event == NULL){}//为了去掉警告 +} + +void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) +{ + qreal scaleFactor = this->matrix().m11(); + if(scaleFactor >= 200){return;} + + if(event->buttons() & Qt::LeftButton && + event->type() == QEvent::MouseButtonDblClick) + { + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + scale(2.0, 2.0); + } +} + +void MyGraphicsView::mousePressEvent(QMouseEvent *event) +{ + if(event->buttons() & Qt::LeftButton) + { + m_leftPressPoint = event->pos(); + } + + QGraphicsView::mousePressEvent(event); +} + +//恢复原状 +void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event) +{ + QGraphicsView::mouseReleaseEvent(event); +} + +void MyGraphicsView::mouseMoveEvent(QMouseEvent *event) +{ + if(event->buttons() & Qt::LeftButton) + { + bool bl = m_scene->getCurSelectState(); + //当scene选中某点时,不拖拽scene位置 + if(bl == true) + { + return QGraphicsView::mouseMoveEvent(event); + } + m_leftReleasePoint = event->pos(); + + // 计算鼠标移动的距离 + int deltaX = m_leftReleasePoint.x() - m_leftPressPoint.x(); + int deltaY = m_leftReleasePoint.y() - m_leftPressPoint.y(); + + // 更新滚动条的位置 + horizontalScrollBar()->setValue(horizontalScrollBar()->value() - deltaX); + verticalScrollBar()->setValue(verticalScrollBar()->value() - deltaY); + + // 更新起始点,以便下次移动时使用 + m_leftPressPoint = m_leftReleasePoint; + } + return QGraphicsView::mouseMoveEvent(event); +} + +void MyGraphicsView::wheelEvent(QWheelEvent *event) +{ + // 获取当前鼠标相对于view的位置; + QPointF cursorPoint = event->pos(); + // 获取当前鼠标相对于scene的位置; + QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); + + // 获取view的宽高; + qreal viewWidth = this->viewport()->width(); + qreal viewHeight = this->viewport()->height(); + + // 获取当前鼠标位置相当于view大小的横纵比例; + qreal hScale = cursorPoint.x() / viewWidth; + qreal vScale = cursorPoint.y() / viewHeight; + + int wheelDeltaValue = event->delta(); + // 向上滚动,放大; + if (wheelDeltaValue > 0) + { + this->scale(1.2, 1.2); + } + // 向下滚动,缩小; + else + { + this->scale(1.0 / 1.2, 1.0 / 1.2); + } + + // 将scene坐标转换为放大缩小后的坐标; + QPointF viewPoint = this->matrix().map(scenePos); + // 通过滚动条控制view放大缩小后的展示scene的位置; + horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); + verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); +} + +void MyGraphicsView::showEvent(QShowEvent *event) +{ + horizontalScrollBar()->setValue(0); + verticalScrollBar()->setValue(0); + QGraphicsView::showEvent(event); +} + +void MyGraphicsView::creatViewByData(QByteArray ary) +{ + //还原缩放,恢复默认大小 + this->resetTransform(); + + // 计算场景的中心点 + // 获取场景中的矩形范围 + QRectF sceneRect = m_scene->sceneRect(); + // 计算场景的中心点 + QPointF centerPoint = sceneRect.center(); + // 获取当前视图的大小 + int viewWidth = this->width(); + int viewHeight = this->height(); + + // 计算滚动条应该移动的距离 + // 目标是让场景的中心点与视图的中心点对齐 + int hValue = centerPoint.x() - viewWidth / 2; + int vValue = centerPoint.y() - viewHeight / 2; + + // 设置滚动条的位置 + this->horizontalScrollBar()->setValue(hValue); + this->verticalScrollBar()->setValue(vValue); + + m_scene->cleanScene(); + m_scene->addItemToScene(ary); +} + +void MyGraphicsView::creatViewByList(QList list) +{ + restoreView(); + m_scene->addItemListToScene(list); +} + +void MyGraphicsView::enlargeView() +{ + if(m_scene == NULL) + { + return; + } + + QPointF cursorPoint; + QPointF scenePos; + bool bl = m_scene->getCurSelectState(); + if(bl == false) + { + // 缩放视图 + scale(1.2, 1.2); + return; + } + else + { + cursorPoint = m_leftPressPoint; + scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); + + // 获取view的宽高; + qreal viewWidth = this->viewport()->width(); + qreal viewHeight = this->viewport()->height(); + + // 获取当前鼠标位置相当于view大小的横纵比例; + qreal hScale = cursorPoint.x() / viewWidth; + qreal vScale = cursorPoint.y() / viewHeight; + + this->scale(1.2, 1.2); + + // 将scene坐标转换为放大缩小后的坐标; + QPointF viewPoint = this->matrix().map(scenePos); + // 通过滚动条控制view放大缩小后的展示scene的位置; + horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); + verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); + } +} + +void MyGraphicsView::narrowView() +{ + if(m_scene == NULL) + { + return; + } + + QPointF cursorPoint; + QPointF scenePos; + bool bl = m_scene->getCurSelectState(); + if(bl == false) + { + // 缩放视图 + this->scale(1.0 / 1.2, 1.0 / 1.2); + return; + } + else + { + cursorPoint = m_leftPressPoint; + scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); + + // 获取view的宽高; + qreal viewWidth = this->viewport()->width(); + qreal viewHeight = this->viewport()->height(); + + // 获取当前鼠标位置相当于view大小的横纵比例; + qreal hScale = cursorPoint.x() / viewWidth; + qreal vScale = cursorPoint.y() / viewHeight; + + this->scale(1.0 / 1.2, 1.0 / 1.2); + + // 将scene坐标转换为放大缩小后的坐标; + QPointF viewPoint = this->matrix().map(scenePos); + // 通过滚动条控制view放大缩小后的展示scene的位置; + horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); + verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); + } +} + +void MyGraphicsView::forwardAndBackward(int idx) +{ + if(m_scene == NULL) + { + return; + } + + bool bl = m_scene->initAPoint(); + if(bl == false) + { + return; + } + + m_scene->forwardAndBackward(idx); +} + +int MyGraphicsView::getItemNums() +{ + return m_scene->items().size(); +} + +void MyGraphicsView::moveScene(int x,int y) +{ + // 更新滚动条的位置 + horizontalScrollBar()->setValue(horizontalScrollBar()->value() - x); + verticalScrollBar()->setValue(verticalScrollBar()->value() - y); +} + +void MyGraphicsView::autoView() +{ + //还原缩放,恢复默认大小 + this->resetTransform(); + + // 计算场景的中心点 + // 获取场景中的矩形范围 + QRectF sceneRect = m_scene->sceneRect(); + // 计算场景的中心点 + QPointF centerPoint = sceneRect.center(); + // 获取当前视图的大小 + int viewWidth = this->width(); + int viewHeight = this->height(); + + // 计算滚动条应该移动的距离 + // 目标是让场景的中心点与视图的中心点对齐 + int hValue = centerPoint.x() - viewWidth / 2; + int vValue = centerPoint.y() - viewHeight / 2; + + // 设置滚动条的位置 + this->horizontalScrollBar()->setValue(hValue); + this->verticalScrollBar()->setValue(vValue); +} + +void MyGraphicsView::insertPoint(int dir) +{ + if(m_scene == NULL) + { + return; + } + + bool bl = m_scene->getCurSelectState(); + if(bl == false) + { + return; + } + + m_scene->insertPoint(dir); +} + +void MyGraphicsView::removeSelectPoint() +{ + if(m_scene == NULL) + { + return; + } + + bool bl = m_scene->getCurSelectState(); + if(bl == false) + { + return; + } + else + { + m_scene->removeSelectPoint(); + } +} + +void MyGraphicsView::setShapeType(int type) +{ + m_scene->setShapeType(type); +} + +QList MyGraphicsView::getPointList() +{ + return m_scene->getPointList(); +} + +void MyGraphicsView::cleanView() +{ + m_scene->cleanScene(); +} + +void MyGraphicsView::setAdsorption(bool adsorption) +{ + m_scene->setAdsorption(adsorption); +} + +void MyGraphicsView::setMaxSegmentLength(int value) +{ + m_scene->setMaxSegmentLength(value); +} + +int MyGraphicsView::getMaxSegmentLength() +{ + return m_scene->getMaxSegmentLength(); +} + +void MyGraphicsView::setXYMove(double valX,double valY) +{ + m_scene->setXYMove(valX,valY); +} + +//撤销最后一个图元 +void MyGraphicsView::revokeLastItem() +{ + m_scene->revokeLastItem(); +} + +QList MyGraphicsView::getLineItemList() +{ + return m_scene->getLineItemList(); +} + +QList MyGraphicsView::getPathItemList() +{ + return m_scene->getPathItemList(); +} diff --git a/sharedviews/view/mygraphicsview.h b/sharedviews/view/mygraphicsview.h new file mode 100644 index 0000000..e7c852e --- /dev/null +++ b/sharedviews/view/mygraphicsview.h @@ -0,0 +1,74 @@ +#ifndef MYGRAPHICSVIEW_H +#define MYGRAPHICSVIEW_H + +#include +#include +#include +#include +#include +#include +#include +#include "mygraphicsscene.h" + +#define GRIDSIZE1 1 //一个格子代表1毫米 +#define GRIDSIZE254 25.4 //一个格子代表25.4毫米 +#define SCENESIZE 800.0 + +/// +/// \brief The MyGraphicsView class 视图层 +/// +class MyGraphicsView : public QGraphicsView +{ + Q_OBJECT +public: + explicit MyGraphicsView(QWidget *parent = NULL,double gridUnit = 0.0); + ~MyGraphicsView(); + +private: + MyGraphicsScene *m_scene; + //鼠标左键按下点 + QPoint m_leftPressPoint; + //鼠标左键抬起点 + QPoint m_leftReleasePoint; + +protected: + void resizeEvent(QResizeEvent *event);//窗口大小发生变化的时候,该函数触发 + void mouseDoubleClickEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent *event); + void showEvent(QShowEvent *event) override; + +public: + void swithViewByPic(QPicture pic); + void creatViewByData(QByteArray ary); + void creatViewByList(QList list); + void setRangeXY(s32 maxX,s32 minX,s32 maxY,s32 minY); + void enlargeView(); + void narrowView(); + void forwardAndBackward(int idx); + int getItemNums(); + void moveScene(int x,int y);//移动场景 + void autoView();//自动调整大小 + void insertPoint(int dir); + void removeSelectPoint();//删除选中点 默认删除最后一个点 + void setShapeType(int type); + QList getPointList(); + void cleanView(); + void setAdsorption(bool adsorption); + void setMaxSegmentLength(int value); + int getMaxSegmentLength(); + void setXYMove(double valX,double valY); + void revokeLastItem();//撤销最后一个图元 + QList getLineItemList(); + QList getPathItemList(); + void restoreView(); + +signals: + void siCurrentIndex(int idx); + +public slots: +}; + +#endif // MYGRAPHICSVIEW_H diff --git a/sharedviews/wordsinputdialog.cpp b/sharedviews/wordsinputdialog.cpp new file mode 100644 index 0000000..3192bd9 --- /dev/null +++ b/sharedviews/wordsinputdialog.cpp @@ -0,0 +1,371 @@ +#include "wordsinputdialog.h" +#include "ui_wordsinputdialog.h" + +WordsInputDialog::WordsInputDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::WordsInputDialog) +{ + ui->setupUi(this); + setWindowFlags (Qt::Window | Qt::FramelessWindowHint); + setWindowModality(Qt::ApplicationModal); + setAttribute(Qt::WA_TranslucentBackground, true);//设置窗体背景透明 + + m_buttonWordList.clear(); + m_buttonWordList.append(ui->buttonLatterQ); + m_buttonWordList.append(ui->buttonLatterW); + m_buttonWordList.append(ui->buttonLatterE); + m_buttonWordList.append(ui->buttonLatterR); + m_buttonWordList.append(ui->buttonLatterT); + m_buttonWordList.append(ui->buttonLatterY); + m_buttonWordList.append(ui->buttonLatterU); + m_buttonWordList.append(ui->buttonLatterI); + m_buttonWordList.append(ui->buttonLatterO); + m_buttonWordList.append(ui->buttonLatterP); + m_buttonWordList.append(ui->buttonLatterA); + m_buttonWordList.append(ui->buttonLatterS); + m_buttonWordList.append(ui->buttonLatterD); + m_buttonWordList.append(ui->buttonLatterF); + m_buttonWordList.append(ui->buttonLatterG); + m_buttonWordList.append(ui->buttonLatterH); + m_buttonWordList.append(ui->buttonLatterJ); + m_buttonWordList.append(ui->buttonLatterK); + m_buttonWordList.append(ui->buttonLatterL); + m_buttonWordList.append(ui->buttonLatterZ); + m_buttonWordList.append(ui->buttonLatterX); + m_buttonWordList.append(ui->buttonLatterC); + m_buttonWordList.append(ui->buttonLatterV); + m_buttonWordList.append(ui->buttonLatterB); + m_buttonWordList.append(ui->buttonLatterN); + m_buttonWordList.append(ui->buttonLatterM); + + for(int var = 0; var < m_buttonWordList.size(); var++) + { + connect(m_buttonWordList.at(var), + SIGNAL(clicked()), + this, + SLOT(inputBtnClick()) + ); + } + + m_buttonNumberList.clear(); + m_buttonNumberList.append(ui->buttonNum1); + m_buttonNumberList.append(ui->buttonNum2); + m_buttonNumberList.append(ui->buttonNum3); + m_buttonNumberList.append(ui->buttonNum4); + m_buttonNumberList.append(ui->buttonNum5); + m_buttonNumberList.append(ui->buttonNum6); + m_buttonNumberList.append(ui->buttonNum7); + m_buttonNumberList.append(ui->buttonNum8); + m_buttonNumberList.append(ui->buttonNum9); + m_buttonNumberList.append(ui->buttonNum0); + for(int var = 0; var < m_buttonNumberList.size(); var++) + { + connect(m_buttonNumberList.at(var), + SIGNAL(clicked()), + this, + SLOT(inputBtnClick()) + ); + } + + m_shift = 1; + m_inputStr.clear(); + ui->labelNameNewWords->clear(); + ui->labelNameOldWords->clear(); + ui->buttonOk->setEnabled(false); + + initControl(); +} + +WordsInputDialog::~WordsInputDialog() +{ + delete ui; +} + +void WordsInputDialog::setInputStr(QString str) +{ + m_inputStr = m_inputStr + str; + ui->labelNameNewWords->setText(m_inputStr); + if(m_inputStr.length() > 0) + { + ui->buttonOk->setEnabled(true); + } +} + +//初始化窗体控件,包括位置、尺寸、样式 +void WordsInputDialog::initControl() +{ + //根据不同分辨率设置控件的位置和尺寸 + if(g_emTheme == theme2) + { + initResolution_BlueVer(); + }else + { + initResolution(); + } + initControlStyle();//初始化窗体控件样式 +} + +//初始化窗体控件为任意分辨率 +void WordsInputDialog::initResolution() +{ + double factoryX = getFactoryX(); + double factoryY = getFactoryY(); + + this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + this->move((GLB_SCR_WIGHT*factoryX-this->width())/2+g_mainWidgetPos.x(),(GLB_SCR_HEIGHT*factoryY-this->height())/2+g_mainWidgetPos.y()); + ui->frameBack->setGeometry(0*factoryX,0,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY); + ui->labelTitle->setGeometry(50*factoryX,55*factoryY,GLB_SCR_WIGHT*factoryX,48*factoryY); + + ui->labelName->setGeometry(65*factoryX,148*factoryY,95*factoryX,33*factoryY); + ui->labelNameNewWords->setGeometry(194*factoryX,143*factoryY,554*factoryX,44*factoryY); + ui->labelNameOldWords->setGeometry(575*factoryX,147*factoryY,200*factoryX,44*factoryY); + + for(int i = 0; i < m_buttonNumberList.size(); i++) + { + m_buttonNumberList[i]->setGeometry((60+i*91)*factoryX,233*factoryY,67*factoryX,40*factoryY); + } + + int x = 0; + int y = 0; + int idx = 0; + for(int i = 0; i < m_buttonWordList.size(); i++) + { + if(m_buttonWordList[i]->text().toUpper() == "Q") + { + x = 60; + y = 295; + idx = i; + } + if(m_buttonWordList[i]->text().toUpper() == "A") + { + x =97; + y = 353; + idx = 0; + } + if(m_buttonWordList[i]->text().toUpper() == "Z") + { + x = 189; + y = 414; + idx = 0; + } + m_buttonWordList[i]->setGeometry((x+idx*91)*factoryX,y*factoryY,67*factoryX,40*factoryY); + idx++; + } + + ui->buttonShift->setGeometry(60*factoryX,414*factoryY,107*factoryX,40*factoryY); + ui->buttonBack->setGeometry(827*factoryX,414*factoryY,107*factoryX,40*factoryY); + ui->frameTwo->setGeometry(725*factoryX,472*factoryY,321*factoryX,51*factoryY); + ui->buttonOk->setGeometry(0*factoryX,0*factoryY,107*factoryX,40*factoryY); + ui->buttonCancel->setGeometry(135*factoryX,0*factoryY,107*factoryX,40*factoryY); +} + +//初始化窗体分辨率 +void WordsInputDialog::initResolution_BlueVer() +{ + double scaleX,scaleY; + scaleX = getFactoryX(); + scaleY = getFactoryY(); + + this->resize(755*scaleX,448*scaleY); + this->move((1024*scaleX-this->width())/2,(600*scaleY-this->height())/2); + + ui->frameBack->setGeometry(0,0,755*scaleX,448*scaleY); + ui->labelTitle->setGeometry(0*scaleX,0*scaleY,755*scaleX,40*scaleY); + + ui->labelName->setGeometry(34*scaleX,60*scaleY,181*scaleX,40*scaleY); + ui->labelNameNewWords->setGeometry(231*scaleX,60*scaleY,295*scaleX,40*scaleY); + ui->labelNameOldWords->setGeometry(545*scaleX,60*scaleY,181*scaleX,40*scaleY); + + for(int i = 0; i < m_buttonNumberList.size(); i++) + { + m_buttonNumberList[i]->setGeometry(36*scaleX+i*69*scaleX,176*scaleY,65*scaleX,40*scaleY); + } + + int x = 0; + int y = 0; + int idx = 0; + for(int i = 0; i < m_buttonWordList.size(); i++) + { + if(m_buttonWordList[i]->text().toUpper() == "Q") + { + x = 36*scaleX; + y = 222*scaleY; + idx = i; + } + if(m_buttonWordList[i]->text().toUpper() == "A") + { + x = 70*scaleX; + y = 268*scaleY; + idx = 0; + } + if(m_buttonWordList[i]->text().toUpper() == "Z") + { + x = 139*scaleX; + y = 314*scaleY; + idx = 0; + } + m_buttonWordList[i]->setGeometry((x+idx*69)*scaleX,y,65*scaleX,40*scaleY); + idx++; + } + + ui->buttonShift->setGeometry(36*scaleX,314*scaleY,68*scaleX,40*scaleY); + ui->buttonBack->setGeometry(622*scaleX,314*scaleY,102*scaleX,40*scaleY); + ui->frameTwo->setGeometry(0,386*scaleY,780*scaleX,477*scaleY); + ui->buttonOk->setGeometry(541*scaleX,0,93*scaleX,40*scaleY); + ui->buttonCancel->setGeometry(642*scaleX,0,93*scaleX,40*scaleY); +} + +//初始化窗体控件样式 +void WordsInputDialog::initControlStyle() +{ + SetStyle setControlStyle; + setControlStyle.setUiName(this->objectName()); + + for(int i = 0; i < m_buttonWordList.size(); i++) + { + m_buttonWordList[i]->setStyleSheet(numButtonStyle()); + m_buttonWordList[i]->setFont(fontSize_M()); + } + + for(int i = 0; i < m_buttonNumberList.size(); i++) + { + m_buttonNumberList[i]->setStyleSheet(numButtonStyle()); + m_buttonNumberList[i]->setFont(fontSize_M()); + } + + if(g_emTheme == theme2) + { + ui->frameBack->setStyleSheet(frameBackStyle()); + ui->labelTitle->setStyleSheet(titleTextColour2()); + }else + { + ui->frameBack->setStyleSheet(setControlStyle.getStyleSheet(this->objectName())); + ui->labelTitle->setStyleSheet(transparentStyle()); + } + ui->labelName->setStyleSheet(titleTextColour()); + ui->labelName->setFont(fontSize_M()); + ui->labelName->setVisible(false); + // ui->labelName->setAlignment(Qt::AlignRight); + // ui->labelName->setAlignment(Qt::AlignVCenter); + + ui->labelTitle->setFont(fontSize_L()); + ui->labelTitle->setAlignment(Qt::AlignLeft); + ui->labelTitle->setAlignment(Qt::AlignVCenter); + + ui->labelNameNewWords->setStyleSheet(numValue()); + ui->labelNameNewWords->setFont(fontSize_M()); + ui->labelNameNewWords->setAlignment(Qt::AlignLeft); + ui->labelNameNewWords->setAlignment(Qt::AlignVCenter); + + ui->labelNameOldWords->setStyleSheet(noteTextColour()); + ui->labelNameOldWords->setFont(fontSize_M()); + ui->labelNameOldWords->setAlignment(Qt::AlignLeft); + ui->labelNameOldWords->setAlignment(Qt::AlignVCenter); + + ui->buttonShift->setStyleSheet(numButtonStyle()); + ui->buttonShift->setFont(fontSize_M()); + + ui->buttonBack->setStyleSheet(numButtonStyle()); + ui->buttonBack->setFont(fontSize_M()); + + ui->frameTwo->setStyleSheet(transparentStyle()); + + ui->buttonOk->setStyleSheet(confirmIconStyle()); + ui->buttonCancel->setStyleSheet(confirmIconStyle()); + if(g_emTheme == theme2) + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk_1")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel_1")); + }else + { + ui->buttonOk->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonOk")); + ui->buttonCancel->setTopImage(setControlStyle.getSharedTopStyleSheet("buttonCancel")); + } +} + +void WordsInputDialog::setTitleStr(QString str) +{ + ui->labelTitle->setText(str); +} + +void WordsInputDialog::setOldWordsStr(QString str) +{ + ui->labelNameOldWords->setText(str); +} + +void WordsInputDialog::clean() +{ + m_inputStr.clear(); + ui->labelNameNewWords->clear(); + ui->buttonOk->setEnabled(false); +} + +void WordsInputDialog::wifiClean() +{ + m_inputStr.clear(); + ui->labelNameNewWords->clear(); + ui->buttonOk->setEnabled(true); +} + +QString WordsInputDialog::getInputStr() +{ + return m_inputStr; +} + +void WordsInputDialog::inputBtnClick() +{ + QPushButton *button = (QPushButton*) this->sender() ; + + if(button == NULL) + { + return; + } + QString str = button->text(); + setInputStr(str); +} + +void WordsInputDialog::on_buttonShift_clicked() +{ + m_shift = -1 * m_shift; + + for(int i = 0; i < m_buttonWordList.size(); i++) + { + if(m_shift == -1) + { + QString lostr=m_buttonWordList[i]->text().toLower(); + m_buttonWordList[i]->setText(lostr); + } + else if(m_shift == 1) + { + QString upstr=m_buttonWordList[i]->text().toUpper(); + m_buttonWordList[i]->setText(upstr); + } + } +} + +void WordsInputDialog::on_buttonBack_clicked() +{ + if(m_inputStr.length() <= 0) + { + return; + } + + m_inputStr = m_inputStr.remove(m_inputStr.length()-1,m_inputStr.length()); // 删除最后一位字符 + ui->labelNameNewWords->setText(m_inputStr); + + if(m_inputStr.length() <= 0) + { + ui->buttonOk->setEnabled(false); + } +} + +void WordsInputDialog::on_buttonOk_clicked() +{ + done(1); +} + +void WordsInputDialog::on_buttonCancel_clicked() +{ + clean(); + done(0); +} diff --git a/sharedviews/wordsinputdialog.h b/sharedviews/wordsinputdialog.h new file mode 100644 index 0000000..8ac8713 --- /dev/null +++ b/sharedviews/wordsinputdialog.h @@ -0,0 +1,54 @@ +#ifndef WORDSINPUTDIALOG_H +#define WORDSINPUTDIALOG_H + +#include +#include "mybutton.h" +#include "setcontrolstyle.h" + + +namespace Ui { +class WordsInputDialog; +} + +class WordsInputDialog : public QDialog +{ + Q_OBJECT + +public: + explicit WordsInputDialog(QWidget *parent = 0); + ~WordsInputDialog(); + +private: + Ui::WordsInputDialog *ui; + +private: + void setInputStr(QString str);//设置字符 + +private: + void initControl();//初始化窗体控件,包括位置、尺寸、样式 + void initResolution(); + void initResolution_BlueVer(); + void initControlStyle();//初始化窗体控件样式 + +private: + QList m_buttonWordList; + QList m_buttonNumberList; + int m_shift; //-1:字母小写 1:字母大写 + QString m_inputStr;//输入的字符 + +public: + void setTitleStr(QString str);//设置标题 + void setOldWordsStr(QString str);//设置标题 + void clean(); + void wifiClean(); + QString getInputStr();//获取输入的字符 + +private slots: + void inputBtnClick(); + void on_buttonShift_clicked(); + void on_buttonBack_clicked(); + void on_buttonOk_clicked(); + void on_buttonCancel_clicked(); +}; + +#endif // WORDSINPUTDIALOG_H diff --git a/sharedviews/wordsinputdialog.ui b/sharedviews/wordsinputdialog.ui new file mode 100644 index 0000000..c322b16 --- /dev/null +++ b/sharedviews/wordsinputdialog.ui @@ -0,0 +1,1810 @@ + + + WordsInputDialog + + + + 0 + 0 + 1010 + 440 + + + + + 5 + 5 + + + + Dialog + + + + + 0 + 0 + 1024 + 48 + + + + background-color: rgb(0, 170, 255); + + + Words input + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 760 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + M + + + false + + + false + + + false + + + + + + 510 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 6 + + + false + + + false + + + false + + + + + + 208 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + E + + + false + + + false + + + false + + + + + + 610 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + U + + + false + + + false + + + false + + + + + + 760 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + K + + + false + + + false + + + false + + + + + + 107 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 2 + + + false + + + false + + + false + + + + + + 560 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + H + + + false + + + false + + + false + + + + + + 660 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + J + + + false + + + false + + + false + + + + + + 410 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + T + + + false + + + false + + + false + + + + + + 910 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + P + + + false + + + false + + + false + + + + + + 360 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + F + + + false + + + false + + + false + + + + + + 560 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + B + + + false + + + false + + + false + + + + + + 208 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 3 + + + false + + + false + + + false + + + + + + 7 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + Q + + + false + + + false + + + false + + + + + + 107 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + W + + + false + + + false + + + false + + + + + + 610 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 7 + + + false + + + false + + + false + + + + + + 160 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + S + + + false + + + false + + + false + + + + + + 58 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + A + + + false + + + false + + + false + + + + + + 360 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + C + + + false + + + false + + + false + + + + + + 910 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 0 + + + false + + + false + + + false + + + + + + 7 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 1 + + + false + + + false + + + false + + + + + + 10 + 70 + 181 + 44 + + + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 710 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + I + + + false + + + false + + + false + + + + + + 200 + 70 + 581 + 44 + + + + font: 16pt "wqy-microhei"; +background-color: rgb(255, 255, 255); +border: 0px solid rgb(11 , 137 , 234); + + + + + + Qt::AlignCenter + + + + + + 510 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + Y + + + false + + + false + + + false + + + + + + 460 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + V + + + false + + + false + + + false + + + + + + 159 + 310 + 91 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + Z + + + false + + + false + + + false + + + + + + 309 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + R + + + false + + + false + + + false + + + + + + 860 + 310 + 130 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + + wqy-microhei + 16 + 50 + false + false + + + + Qt::NoFocus + + + + + + + + + false + + + false + + + false + + + + + + 810 + 190 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + O + + + false + + + false + + + false + + + + + + 410 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 5 + + + false + + + false + + + false + + + + + + 660 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + N + + + false + + + false + + + false + + + + + + 309 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 4 + + + false + + + false + + + false + + + + + + 710 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 8 + + + false + + + false + + + false + + + + + + 260 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + D + + + false + + + false + + + false + + + + + + 860 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + L + + + false + + + false + + + false + + + + + + 460 + 250 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + G + + + false + + + false + + + false + + + + + + 0 + 0 + 1010 + 440 + + + + + 30 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 800 + 70 + 161 + 44 + + + + border:0px; + + + old + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 310 + 141 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + + wqy-microhei + 16 + 50 + false + false + + + + Qt::NoFocus + + + + + + + + + false + + + false + + + false + + + + + + 670 + 380 + 321 + 51 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 88 + 0 + 92 + 48 + + + + + 10 + 10 + + + + + 500 + 100 + + + + Qt::NoFocus + + + + + + + + + false + + + false + + + false + + + + + + 190 + 0 + 92 + 48 + + + + + 10 + 10 + + + + + 500 + 100 + + + + Qt::NoFocus + + + + + + + + + false + + + false + + + false + + + + + + + 260 + 310 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + X + + + false + + + false + + + false + + + + + + 810 + 130 + 92 + 50 + + + + + 30 + 10 + + + + + 500 + 200 + + + + Qt::NoFocus + + + + + + 9 + + + false + + + false + + + false + + + frameBack + labelTitle + buttonLatterM + buttonNum6 + buttonLatterE + buttonLatterU + buttonLatterK + buttonNum2 + buttonLatterH + buttonLatterJ + buttonLatterT + buttonLatterP + buttonLatterF + buttonLatterB + buttonNum3 + buttonLatterQ + buttonLatterW + buttonNum7 + buttonLatterS + buttonLatterA + buttonLatterC + buttonNum0 + buttonNum1 + labelName + buttonLatterI + labelNameNewWords + buttonLatterY + buttonLatterV + buttonLatterZ + buttonLatterR + buttonBack + buttonLatterO + buttonNum5 + buttonLatterN + buttonNum4 + buttonNum8 + buttonLatterD + buttonLatterL + buttonLatterG + labelNameOldWords + buttonShift + frameTwo + buttonLatterX + buttonNum9 + + + + MyButton + QPushButton +
sharedviews/mybutton.h
+
+
+ + +