第一次提交

This commit is contained in:
华海艳 2024-02-06 15:10:48 +08:00
commit 22d25edf54
183 changed files with 130061 additions and 0 deletions

23
Lot/csvcode.h Normal file
View File

@ -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

222
XPlatForm.pro Normal file
View File

@ -0,0 +1,222 @@
#-------------------------------------------------
#
# Project created by Qt5.9.1 2021-03-08T08:42:36
# created by HUAHAIYAN
#-------------------------------------------------
TEMPLATE = app
TARGET = XPlatForm
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/brokenlinedialog.ui \
sharedviews/setworkarea.ui \
sharedviews/mcheaddialog.ui \
sharedviews/headspacingsheetdialog.ui \
sharedviews/fileselectdialog.ui \
sharedviews/debuginfodialog.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 \
sharedviews/brokenlinedialog.h \
sharedviews/setworkarea.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
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 \
sharedviews/brokenlinedialog.cpp \
sharedviews/setworkarea.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
#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
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_

297
XPlatForm.pro.user.37f85c8 Normal file
View File

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2024-01-09T13:49:20. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{37f85c89-6fa5-437b-ab42-a8f793baa331}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Arm</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Arm</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{5193437b-bed9-404f-9b07-632a0d6f24f0}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/hgfs/sharefile/Quilting/quilting/Arm</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/hgfs/sharefile/Quilting/quilting/build-XPlatForm-Arm-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Check for free disk space</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CheckForFreeDiskSpaceStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedFiles"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedHosts"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedSysroots"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes"/>
<value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</value>
<value type="qulonglong" key="RemoteLinux.CheckForFreeDiskSpaceStep.RequiredSpace">5242880</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Upload files via SFTP</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.DirectUploadStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedFiles"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedHosts"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedSysroots"/>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes"/>
<value type="bool" key="RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles">false</value>
<value type="bool" key="RemoteLinux.GenericDirectUploadStep.Incremental">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy to Remote Linux Host</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">1</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">XPlatForm (on Remote Device)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:XPlatForm</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.Arguments"/>
<value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.TargetName">XPlatForm</value>
<value type="QString" key="RemoteLinux.RunConfig.AlternateRemoteExecutable"></value>
<value type="bool" key="RemoteLinux.RunConfig.UseAlternateRemoteExecutable">false</value>
<value type="QString" key="RemoteLinux.RunConfig.WorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>

318
XPlatForm.pro.user.d0fd913 Normal file
View File

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.3.1, 2023-07-31T18:05:51. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{d0fd913b-0ad1-48d3-b46a-051bc8e184a0}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.9.1 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.9.1 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.591.win32_mingw53_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/sharefile/Quilting/Windows</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/sharefile/Quilting/build-XPlatForm-Desktop_Qt_5_9_1_MinGW_32bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/sharefile/Quilting/build-XPlatForm-Desktop_Qt_5_9_1_MinGW_32bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">XPlatForm</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/sharefile/Quilting/XPlatform/XPlatForm.pro</value>
<value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">XPlatForm.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">D:/sharefile/Quilting/Windows</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>

1
bengal.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

7072
bengal.ts Normal file

File diff suppressed because it is too large Load Diff

BIN
chinese.qm Normal file

Binary file not shown.

7084
chinese.ts Normal file

File diff suppressed because it is too large Load Diff

1021
datafile/datafiledsr.cpp Normal file

File diff suppressed because it is too large Load Diff

205
datafile/datafiledsr.h Normal file
View File

@ -0,0 +1,205 @@
#ifndef DATAFILEDSR_H
#define DATAFILEDSR_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#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_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
u8 reserved3[0x54-0x50]; // 保留字节
// 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
BYTE reserved4[0x100-0x77]; // 保留字节
// 0x100
u8 reserved5[0x200-0x100]; //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 // 结束码
//-----------------------------------------------
#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向显示坐标和数据坐标的差异
class DataFileDsr
{
public:
DataFileDsr();
~DataFileDsr();
public:
void initFile(const QString & fullPathName);
int checkDsrVersion();//检查dsr文件版本非5.2和6.3版本和错误格式返回-1
void convertDataToEmbAbs(); // 转换为绝对数据
//是否保存 //笔宽
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 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);
int getStepNums(); //获取换色数
void set62ExHead(DsrHeadEx62 data);
DsrHeadEx62 & get62ExHead();
protected:
QString m_fileFullPathName; // 文件路径
QByteArray m_embAbsData; // 转换后的绝对坐标数据
private:
QByteArray m_fileData;// 文件数据内容(原始数据)
QString m_fileName; // 文件路径
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文件是否加密
void getDsrMinMax();
};
#endif // DATAFILEDSR_H

934
datafile/datafiledst.cpp Normal file
View File

@ -0,0 +1,934 @@
#include "datafiledst.h"
DataFileDst::DataFileDst()
{
}
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"<<m_fileFullPathName;
}
else
{
qDebug() << "Init file failed path =" << m_fileFullPathName;
}
}
void DataFileDst::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();
return;
}
void DataFileDst::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();
}
return;
}
// 文件所在目录
QString DataFileDst::getFileFullPath()
{
QFileInfo file(m_fileFullPathName);
return file.absoluteFilePath();
}
// 文件名称(包括扩展名)
QString DataFileDst::getFileFullName()
{
QFileInfo file(m_fileFullPathName);
return file.fileName();
}
// 文件名称(不包括扩展名)
QString DataFileDst::getFileName()
{
QFileInfo file(m_fileFullPathName);
return file.completeBaseName();
}
// 文件扩展名
QString DataFileDst::getFileSuffix()
{
QFileInfo file(m_fileFullPathName);
return file.suffix();
}
int DataFileDst::getStitchNums()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDstHead->itemNums;
}
int DataFileDst::getDatWidth()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return (pDstHead->maxX - pDstHead->minX);
}
int DataFileDst::getDatHeight()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return (pDstHead->maxY - pDstHead->minY);
}
int DataFileDst::getMaxX()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDstHead->maxX;
}
int DataFileDst::getMinX()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDstHead->minX;
}
int DataFileDst::getMaxY()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDstHead->maxY;
}
int DataFileDst::getMinY()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDstHead->minY;
}
int DataFileDst::getBeginXYAndAnchorXY(int &beginX, int &beginY, int &anchorX, int &anchorY)
{
int size = m_fileData.size();
if (size <= (int)(sizeof(DstHead)))
{
return -1;
}
DstHead * pDstHead = (DstHead *)((m_fileData.data()));
beginX = pDstHead->startX;
beginY = pDstHead->startY;
anchorX = pDstHead->anchorX;
anchorY = pDstHead->anchorY;
return 0;
}
// 转换为绝对坐标数据,同时得到最大最小值
void DataFileDst::convertDataToAbs()
{
QByteArray ds4Data;//相对坐标
m_embAbsData.clear();
loadFile(); // 如果数据未读取,重新读取
int size = m_fileData.size();
if (size <= (int)(sizeof(DstHead)))
{
qDebug("dst size less then headsize");
return;
}
// int dstHeadSize = sizeof(DstHead);
// qDebug()<<"dstHeadSize"<<dstHeadSize;
size -= sizeof(DstHead);
int stepsize = size/sizeof(DstStep);
if (stepsize <= 0)
{
qDebug("dst data size err");
return;
}
DstHead * dstHead = (DstHead *)(m_fileData.data());
DstStep * dstDataBeg = (DstStep *)((m_fileData.data() + sizeof(DstHead)));
DstStep * dstDataPtr = dstDataBeg;
//qDebug()<<"Ds4Item begin";
// 绝对坐标数据
DataDs16FileHead dhead;
memset(&dhead, 0, sizeof(DataDs16FileHead));
Ds4Item * pData = new Ds4Item[stepsize];
if (pData == NULL)
{
qDebug("new DsAbsItem failed, size=%d", stepsize);
return;
}
Ds4Item ds4Item;
u8 ctrl, attr;
int dx, dy;
int rslt;
u32 jumpNeedleNum = 0;
//int predr,curdr;
//predr = curdr = 0.0;
// 得到最大最小值, 同时转换为相对坐标数据
int i = 0;
int stepidx = 0;
do
{
if (i < stepsize)
{
rslt = changeDstStep(dstDataPtr, ds4Item);//三字节针步转换
if (rslt >= 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;
int ddx, ddy;
m_maxX = S32_MIN;
m_maxY = S32_MIN;
m_minY = S32_MAX;
m_minX = S32_MAX;
Ds4Item * pDs4Data = (Ds4Item *)(ds4Data.data());
Ds4Item * ds4DataPtr = pDs4Data;
int begX = dstHead->startX;//起始点
int begY = dstHead->startY;
int begR = 0;
int anchorX = dstHead->anchorX;//定位点
int anchorY = dstHead->anchorY;
s32 ax = 0;//第一个点
s32 ay = 0;
s32 ar = 0;
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;
ddx = ds4DataPtr->dx * DATAFACTOR;
ddy = ds4DataPtr->dy * DATAFACTOR;
if ((attrByte & 0x80) != 0)
{
ddx *= -1;
}
if ((attrByte & 0x40) != 0)
{
ddy *= -1;
}
ddx *= DST_EMB_DATADIRX;
ddy *= DST_EMB_DATADIRY;
ax += ddx;
ay += ddy;
//ar = atan2(ddy,ddx) * 10000;
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 && ddx == 0 && ddy == 0) // 第一针,入针,向后扫描,如果有连续的三个跳针,则将第一针入针转换为跳针 ljs
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++;
}
//int newstepnum = ds4StepSize; // 转换后的数据长度
int newstepnum = ds4StepSize-delStepNum; // 转换后的数据长度 ljs
//qDebug()<<"DsAbsItem end";
//再将相对坐标转换为绝对坐标---结束
//qDebug()<<"dhead begin";
// 文件头转换
QString name = getFileFullName();
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(dhead.fileName, array, asize); // 文件名称
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;
//qDebug()<<"dhead 1";
dhead.anchorX = anchorX; // 定位点坐标X
dhead.anchorY = anchorY; // 定位点坐标Y
dhead.beginX = begX; // 数据起点坐标X
dhead.beginY = begY; // 数据起点坐标Y
dhead.beginR = begR; // 数据起点坐标R
dhead.minX = m_minX-m_minX;
dhead.maxX = m_maxX-m_minX;
dhead.minY = m_minY-m_minY;
dhead.maxY = m_maxY-m_minY; // 轮廓范围,使用重新计算之后的值
//qDebug()<<"m_maxX"<<m_maxX<<"m_minX"<<m_minX;
//qDebug()<<"m_maxY"<<m_maxY<<"m_minY"<<m_minY;
//qDebug()<<"dhead 3";
// 保存文件头到数组中
m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead));
//qDebug()<<"dhead 4";
// 保存数据到数组中
//qDebug()<<"newstepnum"<<newstepnum;
//qDebug()<<"ds4StepSize"<<ds4StepSize;
m_embAbsData.append(absItemAry);
delete []pData;
//qDebug()<<"dhead end";
return;
}
void DataFileDst::writePointToFile(int x, int y, int flag)
{
if(m_fileData.size() <= 0)
{
return;
}
DstHead * pDstHead = (DstHead *)((m_fileData.data()));
if(flag == 0)
{
pDstHead->startX = x;
pDstHead->startY = y;
}
else
{
pDstHead->anchorX = x;
pDstHead->anchorY = 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::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)))
{
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 0;
}
}
#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;
}

157
datafile/datafiledst.h Normal file
View File

@ -0,0 +1,157 @@
#ifndef DATAFILEDST_H
#define DATAFILEDST_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include "datafile/dataoperat.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 reserved2[256-163]; //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();
public:
void initFile(const QString & fullPathName);
int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0); // 生成预览文件
void convertDataToAbs(); // 转换为绝对坐标数据
void writePointToFile(int x, int y, int flag = 0);//写入起始点到文件中
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);
protected:
QString m_fileFullPathName; // 文件路径
QByteArray m_embAbsData; // 转换后的绝对坐标数据
private:
QByteArray m_fileData;// 文件数据内容(原始数据)
QString m_fileName; // 文件路径
private:
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
private:
int changeDstStep(DstStep * pDststep, Ds4Item & ds4step);
};
#endif // DATAFILEDST_H

1014
datafile/datafilequi.cpp Normal file

File diff suppressed because it is too large Load Diff

130
datafile/datafilequi.h Normal file
View File

@ -0,0 +1,130 @@
#ifndef DATAFILEQUI_H
#define DATAFILEQUI_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#include "stdint.h"
//#include "vectorsqrt.h"
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include "datafile/dataoperat.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) // 默认预览图区域高度
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 reserve3[4]; // 0xBA—0xBD; 保留
unsigned short angleCorrOffset; // 0xBE ; 角度修正量 (中间数据后,可以修改,拐角补偿,单针机和多针机,新加-hhy
unsigned char angleCorrPosX; // 0xC0 ; 角度修正x正中间数据后可以修改拐角补偿单针机和多针机
unsigned char angleCorrPosY; // 0xC1 ; 角度修正y正中间数据后可以修改拐角补偿单针机和多针机
unsigned char angleCorrNegX; // 0xC2 ; 角度修正x负中间数据后可以修改拐角补偿单针机和多针机
unsigned char angleCorrNegY; // 0xC3 ; 角度修正y负中间数据后可以修改拐角补偿单针机和多针机
unsigned char stepQui[2]; // 0xC4—0xC5; 跨步绗缝
unsigned char reinNeedles; // 0xC6; 加固绗缝针数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机)
unsigned char 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上下(多针机专业)(中间数据后,可以修改,多针机)
unsigned char reserve6[27]; // 0xE5—0xFF; 保留
} __attribute__ ((packed)) QuiFileHead;
class DataFileQui
{
public:
DataFileQui();
protected:
QString m_fileFullPathName; // 文件路径
QByteArray m_absData; // 转换后的绝对坐标数据
QByteArray m_quiFileData;// 文件数据内容(原始数据)
private:
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
QuiPoint m_firstPoint;
private:
void creatAbsHeadAndAr();//生成绝对坐标数据文件头及ar
void getQuiMinMax();
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);//移动数据起始点
public:
int getStitchNums();//得到数据的针数
int getDatWidth();//得到数据的图形宽度
int getDatHeight();//得到数据的图形高度
int getMaxX();//得到数据最大X+
int getMinX();//得到数据最小X-
int getMaxY();//得到数据最大Y+
int getMinY();//得到数据最小Y-
};
#endif // DATAFILEQUI_H

1297
datafile/datafilequix.cpp Normal file

File diff suppressed because it is too large Load Diff

118
datafile/datafilequix.h Normal file
View File

@ -0,0 +1,118 @@
#ifndef DATAFILEQUIX_H
#define DATAFILEQUIX_H
#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#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) // 默认预览图区域高度
typedef struct tagQuixFileHead
{
char id[7]; // 0x00000x0006; 标志:=="RICH"
char name[1]; // 0x0007; 文件名
unsigned char reserve1[6]; // 0x00080x000D; 保留
unsigned char rotateStyle; // 0x000E; 旋转式样
unsigned char rotateAngle; // 0x000F; 旋转角度
unsigned int left; // 0x00100x0013; 左边 (中间数据后,可以修改,改变起始点,单针机)
unsigned int front; // 0x00140x0017; 前边 (中间数据后,可以修改,改变起始点,单针机)
unsigned int scanX; // 0x00180x001B; 缩放X (中间数据前,可以修改,单针机和多针机)
unsigned int scanY; // 0x001C0x001F; 缩放Y (中间数据前,可以修改,单针机和多针机)
unsigned int normalStep; // 0x00200x0023; 针步大小(中间数据前,可以修改,单针机和多针机)
unsigned int reinMode; // 0x00240x0027; 加固模式(中间数据后,可以修改,终点有跨步的才加,单针机和多针机)
unsigned int reinNeedles; // 0x00280x002B; 加固针数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机)
unsigned int reinNum; // 0x002C0x002F; 加固次数(中间数据后,可以修改,终点有跨步的才加,单针机和多针机)
unsigned int angleCorrPosX; // 0x00300x0033; 角度修正x正中间数据后可以修改拐角补偿单针机和多针机
unsigned int angleCorrPosY; // 0x00340x0037; 角度修正y正中间数据后可以修改拐角补偿单针机和多针机
unsigned int angleCorrNegX; // 0x00380x003B; 角度修正x负中间数据后可以修改拐角补偿单针机和多针机
unsigned int angleCorrNegY; // 0x003C0x003F; 角度修正y负中间数据后可以修改拐角补偿单针机和多针机
unsigned int stepQuiCorrection; // 0x00400x0043; 跨步绗缝修正(中间数据后,可以修改,拐角补偿,单针机和多针机)
unsigned int rollaComp; // 0x00440x0047; 罗拉补偿(中间数据后,让图形闭合,可以修改,多针机)
unsigned short angleCorrOffset; // 0x00480x0049; 角度修正量 (中间数据后,可以修改,拐角补偿,单针机和多针机,新加-hhy
unsigned char reserve2[6]; // 0x004A0x004F; 保留
unsigned int HStep; // 0x00500x0053; 水平方向针距 单位:0.1mm(绘制用,多针机)
unsigned int leftRightLen; // 0x00540x0057; 左针右针距离 单位:0.1mm(绘制用,多针机)
unsigned int VStep12; // 0x00580x005B; 第1 2排针距 单位:0.1mm(绘制用,多针机)
unsigned int VStep23; // 0x005C0x005F; 第2 3排针距 单位:0.1mm(绘制用,多针机)
// 排针每个字节:XXXX XXXX
// 针位n (0x00:无针,0x01:右针, 0x10:左针,0x11:左右针)
unsigned char arrayNeedle1[48]; // 0x00600x008F; 第1排排针绘制用多针机
unsigned char arrayNeedle2[48]; // 0x00900x00BF; 第2排排针绘制用多针机
unsigned char arrayNeedle3[48]; // 0x00C00x00EF; 第3排排针绘制用多针机
unsigned int firstPullLen; // 0x00F00x00F3; 一次拉料长度
unsigned int secondPullLen; // 0x00F40x00F7; 二次拉料长度
unsigned int triplePullLen; // 0x00F80x00FB; 三次拉料长度
unsigned char reserve3[4]; // 0x00FC0x00FF; 保留
unsigned char reserve4[768]; // 0x01000x0400; 保留
unsigned char reserve5[3072]; // 0x04010x1000; 保留
} __attribute__ ((packed)) QuixFileHead;
class DataFileQuix
{
public:
DataFileQuix();
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;
private:
void creatAbsHeadAndAr();//生成绝对坐标数据文件头及ar
void getQuixMinMax();
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);//移动数据起始点
public:
int getStitchNums();//得到数据的针数
int getDatWidth();//得到数据的图形宽度
int getDatHeight();//得到数据的图形高度
int getMaxX();//得到数据最大X+
int getMinX();//得到数据最小X-
int getMaxY();//得到数据最大Y+
int getMinY();//得到数据最小Y-
};
#endif // DATAFILEQUI_H

2304
datafile/dataoperat.cpp Normal file

File diff suppressed because it is too large Load Diff

83
datafile/dataoperat.h Normal file
View File

@ -0,0 +1,83 @@
#ifndef DATAOPERAT_H
#define DATAOPERAT_H
#include "machine/comm/datadef.h"
#include <iostream>
#include<iomanip>
#include<cmath>
#include <QList>
#include <QListIterator>
#include <QDebug>
#define QUI_TYPE_LINE 1 //直线
#define QUI_TYPE_STEP 4 //跨步
#define QUI_TYPE_HSTEP 5 //翻头跨步
#define QUI_TYPE_ARC 2 //三点圆弧
#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<QPointF> &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);
int calcCurve(double threex[], double threey[], s16 step, QByteArray &absAry);
int calcBezier(double threex[], double threey[], s16 step, QByteArray &absAry);
void getBezierPointList(double threex[], double threey[], s16 step, QList<QPointF> &outList);
//样条拟合
void getSplineNew(QList<QPointF> &ptList, QList<QPointF> &splineList);
void getShap(int nCtrlPntNum, QPointF *pPoint, QList<QPointF> &splineList, double dfMinX, double dfMinY);
//线段拟合
void getCurvePointFillLine(QList<QPointF> &inList, double indRunLen,
QList<QPointF> &outList, int iSumParm, BYTE biLenLimit);
int getTotalDistanceFillLine(QList<QPointF> *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

319
datafile/dsrcryption.cpp Normal file
View File

@ -0,0 +1,319 @@
#include "dsrcryption.h"
#include <QString>
#include <QTime>
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::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;
}

33
datafile/dsrcryption.h Normal file
View File

@ -0,0 +1,33 @@
#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); // 解密数据,使用当前的加密字和加密因子
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

520
datafile/dxf/dxfhelper.cpp Normal file
View File

@ -0,0 +1,520 @@
#include "dxfhelper.h"
#include "dxfreader.h"
#include <QImage>
#include <QPainter>
DxfHelper::DxfHelper()
{
}
double norm(double x, double y)
{
return sqrt(x * x + y * y);
}
QList<QVector3D> DxfHelper::expandPolygon(QList<QVector3D> polygon, float expand)
{
QList<QVector3D> 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<QPointF> 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<QVector3D> 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<QVector3D> 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<QPointF> 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<QPointF> 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<QPointF> 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<QVector3D> pointlist;
QVector<QPointF> 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<QPointF> 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<QVector2D> 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<QVector3D> templist;
foreach(auto point, pointList) templist.append(point);
templist = expandPolygon(templist, expandOffset);
QVector<QVector2D> inputList;
foreach(auto point, templist) inputList.append(point.toVector2D());
inputList.push_front(inputList.first());
inputList.push_back(inputList.back());
// std::vector<QVector2D> 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<QPointF> path, dxfPaths) {
for(int i = 0; i < path.length(); i++) {
QPointF point = path.at(i);
double x = point.x();
double y = point.y();
if(x<minx) minx = x;
if(x>maxx) maxx = x;
if(y<miny) miny = y;
if(y>maxy) 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<QPointF> 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:" <<dxfPaths.length();
p.drawPath(painterpath);
p.end();
return image;
}
QList<double> DxfHelper::getDxfBorderList() const
{
return dxfBorderList;
}
QSize DxfHelper::getImageSize() const
{
return imageSize;
}
QList<QPainterPath> DxfHelper::getDxfPathList() const
{
return dxfPathList;
}
QVector<QVector<QPointF> > DxfHelper::getDxfPaths() const
{
return dxfPaths;
}
QList<DXFLine> DxfHelper::getDxfLineList() const
{
return dxfLineList;
}
QList<DXFRect> DxfHelper::getDxfRectList() const
{
return dxfRectList;
}
QList<DXFArc> DxfHelper::getDxfArcList() const
{
return dxfArcList;
}
QList<DXFCircle> DxfHelper::getDxfCircleList() const
{
return dxfCircleList;
}
QList<DXFEllipse> DxfHelper::getDxfEllipseList() const
{
return dxfEllipseList;
}
QList<DXFPolyline> DxfHelper::getDxfPolylineList() const
{
return dxfPolylineList;
}
QList<DXFSpline> DxfHelper::getDxfSplineList() const
{
return dxfSplineList;
}
void DxfHelper::setExpandOffset(double value)
{
expandOffset = value;
}

110
datafile/dxf/dxfhelper.h Normal file
View File

@ -0,0 +1,110 @@
#ifndef DXFHELPER_H
#define DXFHELPER_H
#include <QPointF>
//#include <QRandomGenerator>
#include <QDebug>
#include <QPainterPath>
#include <QtMath>
#include <QVector2D>
#include <QVector3D>
//#include <spline_library/splinehelper.h>
struct DXFLine {
double x1;
double y1;
double z1;
double x2;
double y2;
double z2;
};
struct DXFRect {
QList<QVector3D> 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<QVector3D> list;
};
struct DXFSpline {
double nControl;
QList<QVector3D> controlPoints;
};
class DxfHelper
{
public:
DxfHelper();
QList<QVector3D> expandPolygon(QList<QVector3D> polygon, float expand);
bool generateDxf(const QString &fileName);
QVector<QVector<QPointF>> getDxfPaths() const;
QList<DXFLine> getDxfLineList() const;
QList<DXFRect> getDxfRectList() const;
QList<DXFArc> getDxfArcList() const;
QList<DXFCircle> getDxfCircleList() const;
QList<DXFEllipse> getDxfEllipseList() const;
QList<DXFPolyline> getDxfPolylineList() const;
QList<DXFSpline> getDxfSplineList() const;
void setExpandOffset(double value);
void matchDXFSize();
QImage generateDXFImage();
QList<QPainterPath> getDxfPathList() const;
QSize getImageSize() const;
QList<double> getDxfBorderList() const;
private:
QPointF currentPos;
unsigned int vertexIndex = 0;
unsigned int controlIndex = 0;
QVector<QVector<QPointF>> dxfPaths;
QList<QPainterPath> dxfPathList;
double expandOffset = 0;
QList<DXFLine> dxfLineList;
QList<DXFRect> dxfRectList;
QList<DXFArc> dxfArcList;
QList<DXFCircle> dxfCircleList;
QList<DXFEllipse> dxfEllipseList;
QList<DXFPolyline> dxfPolylineList;
QList<DXFSpline> dxfSplineList;
QList<double> dxfBorderList;
QSize imageSize;
};
#endif // DXFHELPER_H

View File

@ -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 <string>
#include <vector>
#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

View File

@ -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

View File

@ -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

View File

@ -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 <string.h>
#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 <b>before</b> 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

File diff suppressed because it is too large Load Diff

View File

@ -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 <limits>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <map>
#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<double>::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<std::vector<DL_HatchEdgeData> > 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<int, std::string> 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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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 <math.h>
/**
* 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

View File

@ -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

View File

@ -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 <strings.h>
#endif
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <iostream>
#include <algorithm>
#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'.
*
* <pre>
* 0
* SECTION
* 2
* name
* </pre>
*/
void section(const char* name) const {
dxfString(0, "SECTION");
dxfString(2, name);
}
/**
* Section HEADER
*
* <pre>
* 0
* SECTION
* 2
* HEADER
* </pre>
*/
void sectionHeader() const {
section("HEADER");
}
/**
* Section TABLES
*
* <pre>
* 0
* SECTION
* 2
* TABLES
* </pre>
*/
void sectionTables() const {
section("TABLES");
}
/**
* Section BLOCKS
*
* <pre>
* 0
* SECTION
* 2
* BLOCKS
* </pre>
*/
void sectionBlocks() const {
section("BLOCKS");
}
/**
* Section ENTITIES
*
* <pre>
* 0
* SECTION
* 2
* ENTITIES
* </pre>
*/
void sectionEntities() const {
section("ENTITIES");
}
/**
* Section CLASSES
*
* <pre>
* 0
* SECTION
* 2
* CLASSES
* </pre>
*/
void sectionClasses() const {
section("CLASSES");
}
/**
* Section OBJECTS
*
* <pre>
* 0
* SECTION
* 2
* OBJECTS
* </pre>
*/
void sectionObjects() const {
section("OBJECTS");
}
/**
* End of a section.
*
* <pre>
* 0
* ENDSEC
* </pre>
*/
void sectionEnd() const {
dxfString(0, "ENDSEC");
}
/**
* Generic table for table 'name' with 'num' entries:
*
* <pre>
* 0
* TABLE
* 2
* name
* 70
* num
* </pre>
*/
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.
*
* <pre>
* 0
* TABLE
* 2
* LAYER
* 70
* num
* </pre>
*/
void tableLayers(int num) const {
table("LAYER", num, 2);
}
/** Table for line types.
*
* @param num Number of line types in total.
*
* <pre>
* 0
* TABLE
* 2
* LTYPE
* 70
* num
* </pre>
*/
void tableLinetypes(int num) const {
//linetypeHandle = 5;
table("LTYPE", num, 5);
}
/** Table for application id.
*
* @param num Number of registered applications in total.
*
* <pre>
* 0
* TABLE
* 2
* APPID
* 70
* num
* </pre>
*/
void tableAppid(int num) const {
table("APPID", num, 9);
}
/** Table for text style.
*
* @param num Number of text styles.
*
* <pre>
* 0
* TABLE
* 2
* STYLE
* 70
* num
* </pre>
*/
void tableStyle(int num) const {
table("STYLE", num, 3);
}
/**
* End of a table.
*
* <pre>
* 0
* ENDTAB
* </pre>
*/
void tableEnd() const {
dxfString(0, "ENDTAB");
}
/**
* End of the DXF file.
*
* <pre>
* 0
* EOF
* </pre>
*/
void dxfEOF() const {
dxfString(0, "EOF");
}
/**
* Comment.
*
* <pre>
* 999
* text
* </pre>
*/
void comment(const char* text) const {
dxfString(999, text);
}
/**
* Entity.
*
* <pre>
* 0
* entTypeName
* </pre>
*
* @return Unique handle or 0.
*/
void entity(const char* entTypeName) const {
dxfString(0, entTypeName);
if (version>=DL_VERSION_2000) {
handle();
}
}
/**
* Attributes of an entity.
*
* <pre>
* 8
* layer
* 62
* color
* 39
* width
* 6
* linetype
* </pre>
*/
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).
*
* <pre>
* 0
* LAYER
* </pre>
*/
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).
*
* <pre>
* 0
* LTYPE
* </pre>
*/
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).
*
* <pre>
* 0
* APPID
* </pre>
*/
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).
*
* <pre>
* 0
* BLOCK
* </pre>
*/
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).
*
* <pre>
* 0
* ENDBLK
* </pre>
*/
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

View File

@ -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 <stdio.h>
#include <string.h>
#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; i<strlen(str); ++i) {
if (str[i]=='.') {
dot = true;
end = i+2;
continue;
} else if (dot && str[i]!='0') {
end = i+1;
}
}
if (end>0 && 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<strlen(str); i++) {
if (str[i]==src) {
str[i] = dest;
}
}
}

View File

@ -0,0 +1,74 @@
/****************************************************************************
** 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_ASCII_H
#define DL_WRITER_ASCII_H
#include "dl_global.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "dl_writer.h"
#include <fstream>
#include <string>
/**
* 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

379
datafile/dxf/dxfreader.cpp Normal file
View File

@ -0,0 +1,379 @@
#include "dxfreader.h"
#include <QDebug>
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;
}

109
datafile/dxf/dxfreader.h Normal file
View File

@ -0,0 +1,109 @@
#ifndef DXFREADER_H
#define DXFREADER_H
#include <QObject>
#include <QTextCodec>
#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<DL_LineData> dxfLines;
QList<DL_TextData> dxfText;
QList<DL_ArcData> dxfArcs;
QList<DL_CircleData> dxfCircles;
QList<DL_EllipseData> dxfEllipses;
QList<DL_PolylineData> dxfPolylines;
QList<DL_PointData> dxfPoints;
QList<DL_SplineData> dxfSplines;
QList<DL_BlockData> dxfBlocks;
QList<DL_VertexData> dxfVertexs;
QList<DL_LayerData> dxfLayers;
QList<DL_LinetypeData> dxfLinetypes;
QList<DL_XLineData> dxfXLines;
QList<DL_RayData> dxfRays;
QList<DL_ControlPointData> dxfControlPoints;
QList<DL_FitPointData> dxfFitPoints;
QList<DL_HatchData> dxfHatchs;
QList<DL_HatchLoopData> dxfHatchLoops;
QList<DL_HatchEdgeData> dxfHatchEdges;
private:
QString fileName;
};
#endif // DXFREADER_H

3800
datafile/embdata.cpp Normal file

File diff suppressed because it is too large Load Diff

202
datafile/embdata.h Normal file
View File

@ -0,0 +1,202 @@
#ifndef EMBDATA_H
#define EMBDATA_H
#include <QList>
#include <QByteArray>
#include <QApplication>
#include <QDir>
#include <QImage>
#include <qmath.h>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QPainter>
#include <QRgb>
#include <QObject>
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include <QVector>
#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
#define PI20000 62832
#define ANGLECORR 10466 //60度对应的弧度值
#define MODE_THICKEN 0 //密针方式
#define MODE_LOCK 1 //锁针方式
class EmbData: public QObject
{
Q_OBJECT
public:
EmbData();
~EmbData();
public:
void clear();
QByteArray & getDsDat();//得到转换后的ds16数据
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);
int angleCorrection(s16 oft);//角度修正
int angleCorrectionXY(s32 px, s32 nx, s32 py, s32 ny);//角度修正
void reFitByStep(s32 stepLen);//按固定针步重新拟合(用户可设置的参数,暂未用到)
void reFitLine(s32 stepLen);//按固定针步重新拟合直线(用户可设置的参数)
int moveStartPoint(short left, short front);//移动起始点,左边,前边
public:
inline QString getFileName(){return m_pEmbDs16Head->fileName;}//得到花版名称
inline int 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 int getMaxX(){return m_pEmbDs16Head->maxX;}//得到数据最大X+
inline int getMinX(){return m_pEmbDs16Head->minX;}//得到数据最小X-
inline int getMaxY(){return m_pEmbDs16Head->maxY;}//得到数据最大Y+
inline int getMinY(){return m_pEmbDs16Head->minY;}//得到数据最小Y-
inline int getBeginX(){return m_pEmbDs16Head->beginX;}
inline int getBeginY(){return m_pEmbDs16Head->beginY;}
inline int getAnchorX(){return m_pEmbDs16Head->anchorX;}//得到数据定位点
inline int getAnchorY(){return m_pEmbDs16Head->anchorY;}//得到数据定位点
public:
void moveDataBeginPonit(s32 left, s32 front);
void setAbsDat(QByteArray & dat);
QByteArray & getAbsDat(void);
int getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & colorIdx);
void setStartPosition(int x, int y);//设置起始点
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(int mirror);//设置镜像
int setFLip(int mirror);//设置镜像
int setRotate(int dr);//设置旋转
int setRotate90(bool flag);//旋转+-90度 flag :true代表顺时针方向
int getNextElementIndex(int curIndex);//获得下一个图元的第一缝纫针步
int getPreOrThisElementIndex(int curIndex);//上一个图元(当前为跨步时)或当前图元(当前为缝纫时)的第一缝纫针步
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 createEmbDs16FromAbs();//生成DS16数据
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, bool isDraw = 1);//绘制针数索引的十字
void eraseNeedleIdxPen(QPainter &painter);//擦除针数索引的跟踪笔
void eraseNeedleIdxPen(QPainter &painter,int index);//擦除针数索引的跟踪笔
private:
void getCurvePointFillLine(QList<DsAbsItem> &inList, double indRunLen,QList<DsAbsItem> &outList);
int getTotalDistanceFillLine(QList<DsAbsItem> *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);
public:
int m_editedflag;//数据被编辑的标志
int m_spaceX;//横向间隙
int m_spaceY;//纵向移动距离
//用于调节颜色
#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数据需要转换
int m_totalJumpNeedle;//总跳针数
DataDs16FileHead * m_pEmbDs16Head;//ds16 文件头 //数据转换用的都是DataDs16FileHead
double m_factor;//绘制数据与实际数据的缩放率
u32 m_fileid;
//图形预览、刷新
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 drawImageByDispFile();//用显示数据画图(是否渐变显示)
int drawImageByOneStepLotLine();
int findMaxSpHead(DsrHeadEx62 & head,int headCount);
void drawMultiTrack(QPainter &painter); //绘制多机头的跟踪图案
void drawMultiLine(QPainter &painter, QPen &pen, QRgb rgb, int index); //绘制多机头的线迹
private:
int m_type; //机型
int m_penX, m_penY;//执行过程中绘制跟踪笔的坐标索引
QPixmap m_canvas;//预览图片
QPixmap m_penPix;//跟踪笔绘制的临时区域
QVector<QPixmap> m_penHeadPix;
QVector<QPoint> m_penPoint;
int m_viewWidth;
int m_viewHight;
QString m_filePath;//文件路径
private:
QByteArray m_dispDat;//绘制图形的绝对数据(进行缩放的)
QVector<Disp_HeadItem> 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

2401
datafile/hpgl/importhpgl.cpp Normal file

File diff suppressed because it is too large Load Diff

294
datafile/hpgl/importhpgl.h Normal file
View File

@ -0,0 +1,294 @@
#ifndef IMPORTHPGL_H
#define IMPORTHPGL_H
#include <QObject>
#include <QPen>
#include <QPainter>
#include <QFont>
#include <QFile>
#include <QCoreApplication>
#include <QDir>
#include <QProcess>
#include <QStringList>
#include <QImage>
#include <QBitmap>
#include <qtextcodec.h>
#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;
};
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 <QPoint> 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;//字体名称
private:
QByteArray m_embAbsData; // 转换后的绝对坐标数据
int m_minX;
int m_maxX;
int m_minY;
int m_maxY;
u8 m_stepCtrl;
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); // 打开位图文件
private slots:
//输入参数:
// bUp 刀的状态true抬起状态 false落下状态
// ptPoint 矢量字体中点阵中的一个坐标
void AddTextPointToLine(bool bUp,QPoint ptPoint);
};
#endif // IMPORTHPGL_H

262
datafile/hpgl/marker.cpp Normal file
View File

@ -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<QPoint> &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()<<sval;
}
double tmp = sqrt(sval);
double x1 = (b1+tmp)/(2*a);
double y1 = k*x1+b;
double x2 = (b1-tmp)/(2*a);
double y2 = k*x2+b;
lpptIntersection1.setX(x1);
lpptIntersection1.setY(y1);
lpptIntersection2.setX(x2);
lpptIntersection2.setY(y2);
rel = 2;
}
return rel;
}

418
datafile/hpgl/marker.h Normal file
View File

@ -0,0 +1,418 @@
#ifndef MARKER_H
#define MARKER_H
#include <QObject>
#include <QPoint>
#include <QRect>
#include <QBitmap>
#include <QDebug>
#include <qmath.h>
#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;
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<QPoint> 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 <QPoint> &listPoint);
double m_iDPMM; //长度数据单位:m_iDPMM(每毫米点)
QList <CRPPolyline> 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

View File

@ -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<QRgb> 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;
}
}
}

View File

@ -0,0 +1,64 @@
#ifndef PLOTBITMAP_H
#define PLOTBITMAP_H
#include <QObject>
#include <QPainter>
#include <QBitmap>
#include <QFile>
//#include <gdiplus.h>
//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

107
datafile/hpgl/typedef.h Normal file
View File

@ -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

View File

@ -0,0 +1,918 @@
#include "vectorfont.h"
#include <QFile>
#include <qmath.h>
#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;
}

132
datafile/hpgl/vectorfont.h Normal file
View File

@ -0,0 +1,132 @@
#ifndef VECTORFONT_H
#define VECTORFONT_H
#include <QObject>
#include <QPoint>
#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 <CChinese_char> m_aChinese_char;
//QList <CEnglish_char> 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

1
denmark.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

7072
denmark.ts Normal file

File diff suppressed because it is too large Load Diff

1
english.qm Normal file
View File

@ -0,0 +1 @@
<クd<>箆!ソ`。スン

7080
english.ts Normal file

File diff suppressed because it is too large Load Diff

43
items/assistitem.cpp Normal file
View File

@ -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;
}
}

36
items/assistitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef ASSISTITEM_H
#define ASSISTITEM_H
#include <QObject>
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

218
items/cmdconfig.h Normal file
View File

@ -0,0 +1,218 @@
#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, //删除配置文件
PSE_SOFTWAREPARA_IMPORTPARA, // 参数导入
PSE_SOFTWAREPARA_EXPORTPARA, // 参数导出
PSE_SOFTWAREPARA_HMIUPDATE, // 界面升级
PSE_SOFTWAREPARA_MCUPDATE, // 主控升级
PSE_SOFTWAREPARA_EXIT // 退出程序
};
enum MC_TYPE { NUM1 = 1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9 };//板卡号
//此头文件定义了常用功能的枚举
enum SHORTCUT_FUNCTION {
FUN_ALLTOZERO = 1, // 全部归零
FUN_SPINDLEJOG, // 主轴点动
FUN_SPINDLEENABLE, // 主轴使能
FUN_SPINDLEDISABLE, // 主轴失能
FUN_SPINDLETEST, // 主轴研车
FUN_SPINDLEROTATE, // 主轴旋转
FUN_BACKWORKPOINT, // 回工作点
FUN_BACKTOORIGIN, // 回原点
FUN_SETOFFSETPOINT, // 定偏移点
FUN_BACKOFFSETPOINT, // 回偏移点
FUN_SETSTARTPOINT, // 定起始点
FUN_BACKSTARTPOINT, // 回起始点
FUN_CHECKFRAME, // 边框检查
FUN_FORWARDORBACK, // 前进回退
FUN_SIMULATEFRAME, //空走边框
FUN_PROCESSRESET, //流程复位
FUN_MANUALOIL, //手动加油
FUN_PATTERNSELECT, // 花样选择
FUN_SEWAUTOCHANGESHUTTLE, //自动换梭
FUN_SEWBUFF, //缝纫状态
FUN_SHUTTLEDISKBUFF, //换梭盘状态
FUN_BACKTHREADPOINT, //回穿线点
FUN_SETANCHORPOINT, // 定定位点(服装机)
FUN_BACKANCHORPOINT, // 回定位点(服装机)
FUN_BACKSHUTTLE, //回换梭位(服装机)
FUN_NEEDLESHUTTLERESET, //针梭校对(服装机)
FUN_BACKZEROPOINT, //回零点
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_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_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_NULL // 无功能
};
//花样设置功能的枚举
enum PATTERNSET_FUNCTION {
PATTERNSET_PATTERNSELECT = 1, // 花样选择
PATTERNSET_PATTERNPARA, // 花样参数
PATTERNSET_PATTERNCOLOR, // 花样色序
PATTERNSET_PATTERNIMPORT, // 花样导入
PATTERNSET_PATTERNEXPORT, // 花样导出
PATTERNSET_PATTERNDELETE, // 花样删除
PATTERNSET_NULL // 无功能
};
//参数设置参数类型的枚举
enum PARASET_FUNCTION {
PARASET_POSITION = 1, // 位置参数
PARASET_SPEED, // 速度参数
PARASET_ACTION, // 动作参数
PARASET_DETECT, // 检测参数
PARASET_SETTING , // 设置参数
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, // 停止
MOTORHEADO_UP, // 缝纫机头1升降
MOTORHEADO_DOWN, //缝纫机头1下降
MOTORHEADT_UP, // 缝纫机头2升降
MOTORHEADT_DOWN, // 缝纫机头2下降
ALLTO_ZERO, // 全部归零
};
//软件设置的顺序枚举
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_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 //等比缩放
};
//网络管理设置的顺序枚举
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

View File

@ -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 ; // 代码对应的名称
}
}

View File

@ -0,0 +1,33 @@
#ifndef ERRORCODESTATEITEM_H
#define ERRORCODESTATEITEM_H
#include <QObject>
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

63
items/fileitem.cpp Normal file
View File

@ -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; // 图片路径
}

48
items/fileitem.h Normal file
View File

@ -0,0 +1,48 @@
#ifndef FILEITEM_H
#define FILEITEM_H
#include <QObject>
#include <QImage>
#include <QString>
// 文件条目项
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

484
items/itemsmanage.cpp Normal file
View File

@ -0,0 +1,484 @@
#include "itemsmanage.h"
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 <ParaItem> & 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默认0
parasList.append(makeAParaItem(0,
PARA_TYPE_SOFTWARESET,
0 ,
SET_LANGUAGE, 0, 0, PARA_VALUE_TYPE_LIST,
QCoreApplication::translate("GLOBAL", "Language"),//语言
0, 0, 5, 0, 0, "", "",
QCoreApplication::translate("GLOBAL", "Chinese:0;English:1"),
0, 0, 0x0002, operate));
//软件设置参数-字体大小;单位:无 范围0-1默认0
/*
parasList.append(makeAParaItem(0,
PARA_TYPE_SOFTWARESET,
0 ,
SET_FONTSIZE, 0, 0, PARA_VALUE_TYPE_LIST,
QCoreApplication::translate("GLOBAL", "Fontsize"),//字体大小
0, 0, 1, 0, 0, "", "",
QCoreApplication::translate("GLOBAL", "Normal:0;Larger:1"),
0, 0, 0x0002, operate));
*/
//软件设置参数---------------------------
}
//各个机型通用参数-时间设置参数
void initTimeParasList(QList <ParaItem> & 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 <ParaItem> & 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<ParaItem> &parasList)
{
//超级用户界面配置参数-分辨率;单位:无
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;",
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));
///添加新机型注意及时翻译 否则无法启动
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_MULTINEEDLEROTARY, MACHINE_HIGHSPEEDSINGLEQUI, 0, "", "",
QString(QCoreApplication::translate("GLOBAL", "001 McHighSingleQui:0;002 FiveHeadPrecisionSewing:1;003 ClothingMac:2;004 multineedlerotary:3")),
//001 高速单针机:0;002 五头精密缝:1;003 服装机:2;004 多针旋梭:3
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));
//超级用户界面配置参数-是否有自动换梭功能;单位:无
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, "", "",
"No:0;Yes:1",
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 Richpeace logo"),//是否有富怡标志
1, 0, 1, 1, 0, "", "",
"No:0;Yes:1",
1, 1, 0x0017, factory));
//超级用户界面配置参数-参数是否分类显示;单位:无
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, "", "",
"No:0;Yes:1",
0, 0, 0x0018, factory));
//超级用户界面配置参数-界面解密;单位:无
parasList.append(makeAParaItem(0,
PARA_TYPE_HMICONFIGURATION,
0 ,
ROOT_HMIDECRYPT, 0, 0, PARA_VALUE_TYPE_CLICK,
QCoreApplication::translate("GLOBAL", "HMI decrypt"),//界面解密
0, 0, 0, 0, 0, "", "", "",
0, 0, 0x0019, factory));
}
//物联网配置参数
void initRootIOTConfigurationList(QList<ParaItem> &parasList)
{
//超级用户物联网配置-网关连接方式;单位:无
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, factory));
//超级用户物联网配置-机架号输入; 单位:无
parasList.append(makeAParaItem(0,
PARA_TYPE_IOTCONFIGURATION,
0 ,
ROOT_RACKNUMBERINPUT, 0, 0, PARA_VALUE_TYPE_INT,
QCoreApplication::translate("GLOBAL", "Input rack number"),//机架号输入
111189, 0, INT_MAX, 111189, 0, "", "",
"",
0, 0, 0x0012, factory));
//超级用户物联网配置-网络设置; 单位:无
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, factory));
//超级用户物联网配置-工厂预计交货时间; 单位:无
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, factory));
//超级用户物联网配置-调试进度; 单位:无
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, factory));
}
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;
}

96
items/itemsmanage.h Normal file
View File

@ -0,0 +1,96 @@
#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 <QCoreApplication>
#include <QTextCodec>
//添加快捷功能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 <ParaItem> & parasList);//软件参数
void initTimeParasList(QList <ParaItem> & parasList);//时间设置参数
void initNetworkParasList(QList <ParaItem> & parasList);//网络管理参数
void initRootHMIConfigurationList(QList <ParaItem> & parasList);//界面配置参数
void initRootIOTConfigurationList(QList <ParaItem> &parasList); //物联网配置参数
#endif // ITEMSMANAGE_H

44
items/nineitem.cpp Normal file
View File

@ -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;
}
}

30
items/nineitem.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef NINEITEM_H
#define NINEITEM_H
#include <QObject>
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

101
items/outctrlitem.cpp Normal file
View File

@ -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;
}
}

68
items/outctrlitem.h Normal file
View File

@ -0,0 +1,68 @@
#ifndef OUTCTRLITEM_H
#define OUTCTRLITEM_H
#include <QObject>
#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

77
items/paraitem.cpp Normal file
View File

@ -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;
}
}

90
items/paraitem.h Normal file
View File

@ -0,0 +1,90 @@
#ifndef PARAITEM_H
#define PARAITEM_H
#include <QObject>
#include <QString>
#include <QStringList>
#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文件花样参数
#endif // PARAITEM_H

44
items/parasetitem.cpp Normal file
View File

@ -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;
}
}

36
items/parasetitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef PARASETITEM_H
#define PARASETITEM_H
#include <QObject>
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

43
items/patternsetitem.cpp Normal file
View File

@ -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;
}
}

36
items/patternsetitem.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef PATTERNSETITEM_H
#define PATTERNSETITEM_H
#include <QObject>
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

46
items/sensoritem.cpp Normal file
View File

@ -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; // 传感器类型
}

35
items/sensoritem.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef __SENSORITEM_H__
#define __SENSORITEM_H__
#include <QObject>
#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__

43
items/shortcutitem.cpp Normal file
View File

@ -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;
}
}

35
items/shortcutitem.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef SHORTCUTITEM_H
#define SHORTCUTITEM_H
#include <QObject>
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

438
machine/comm/comm.cpp Normal file
View File

@ -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, Richpeace 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"<<len;
if (len != status) // 和上次长度比较
{
status = len;
i = 0;
}
else // 如果没有变化,则计数器增加
{
i++;
if (i > 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;
}
//--------------------------------------------------------------------------------------------------

205
machine/comm/comm.h Normal file
View File

@ -0,0 +1,205 @@
//-------------------------------------------------------------------------------
// File Name: comm.h
// Brief:
// Version: 1.0.0
// Create Date: 2017/05/08
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2017, Richpeace Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2017/05/08
//-------------------------------------------------------------------------------
#ifndef __COMM_H__
#define __COMM_H__
#include "typedef.h"
#include <string.h>
#include <QDebug>
#include <stdio.h>
//------------------------------------------------------------------------
// 通讯数据包定义
//------------------------------------
/*
1.
|-------------------------------------------------------------------|-----------|
| | | |
|-------------------------------------------------------------------|-----------|
| B0 B1 B2 B3 | B4 B5 | B6 B7 B8 B9 B10 B11 B12 B13 | B14 B15 |
|-------------------------------------------------------------------|-----------|
| | | | B4--B13的 |
| | ID | | |
| 'F','L','D','P' | | | 16CRC |
|-------------------------------------------------------------------|-----------|
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' | | | | | 16CRC | |
|---------------------------------------------------------------------------|-----------|---------------|
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',
};
#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

16
machine/comm/config.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include "typedef.h"
#include <QImage>
#define EMBROIDERY
#define MAX_EXDP_LEN 1024 // 最大附加数据长度
#define SEW 8 //缝纫
#define IMAGE_TYPE (QImage::Format_ARGB32)
#endif

159
machine/comm/crc16.cpp Normal file
View File

@ -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, Richpeace 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;
}

60
machine/comm/crc16.h Normal file
View File

@ -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, Richpeace 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

74
machine/comm/crc32.cpp Normal file
View File

@ -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, Richpeace 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;
}

33
machine/comm/crc32.h Normal file
View File

@ -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, Richpeace 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

395
machine/comm/datadef.h Normal file
View File

@ -0,0 +1,395 @@
#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<DsAbsItem> absItemList;
}LineItem;
// 画图格式数据
typedef struct
{
u8 ctrl;//控制字节
u8 attr;//属性字节
WORD action;// 附加动作
s16 bx, by;//绘制起点
s16 ex, ey;//绘制终点
s16 ar;//角度
u32 rgb;
}__attribute__ ((packed)) DispItem;
//机头间距表地址
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;
} 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.2mm0.1mm
0 1 -128 -- +126, 0.2mm0.1mm
1 0 -128 -- +126, 2mm1mm
1 1 cdx , cdx
*/
}__attribute__ ((packed)) ToBItem, Ds2Item;
// ctrl 定义
// 控制字节, 作为功能码,定义如下
#define DATA_NULL 0x00 // 文件结束
#define DATA_SEWING 0x01 // 缝纫数据, 该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
#define DATA_OFFSET 0x02 // 偏移数据, 该数据只移动 X, YR 偏移 dx,dy,dr连续运动
#define DATA_CUTTING 0x03 // 切刀数据, 该数据需要切刀先运转,同时 X, YR 偏移 dx,dy,dr根据切刀类型选择动框方式
#define DATA_LASER 0x04 // 激光数据, 该数据需要激光出光, 同时X, YR偏移 dx,dy,dr框连续运动激光强度和运动线速度有关系
#define DATA_DRAWING 0x05 // 记号数据, 该数据需要记号笔先放下来, 同时X, YR偏移dx,dy,dr框连续运动
#define DATA_SEWING_R 0x06 // 右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
#define DATA_SECF_SEW 0x11 // 第二框缝纫
#define DATA_SECF_OFST 0x12 // 第二框偏移
#define DATA_SECF_SEW_R 0x16 // 第二框右机头缝纫,该数据需要缝纫机针扎一次(主轴可以转动多圈(如果有跳针功能的话)), 同时 X, YR 偏移运动dx,dy,dr 框步进式运动或连续运动
// 兼容DSR控制码
#define DATA_SYNCSEW 0x07 // 同步缝纫数据, 该数据需要缝纫机针扎一次, 同时 X, YR 偏移运动 dx,dy,drX2, 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_JUMP 0x0B // 跳针数据,该数据要求缝纫机主轴不动, 但 X, YR 偏移运动 dx,dy,dr 框步进式运动或连续运动
#define DATA_PUNCH 0x0C // 冲孔数据, 该数据需要冲孔主轴运转一圈,同时 X, YR 偏移 dx,dy,dr
#define DATA_EMB 0x0D // 绣花数据,该数据需要平绣针扎一次, 同时 X, Y偏移运动dx,dy 框步进式运动
#define DATA_CHGND_OLD 0x0E // 换色功能码 lxs 20220628添加
#define DATA_SYNCOFST 0x0F // 同步偏移数据
#define DATA_MILLING 0x21 // 铣刀数据
#define DATA_DRILL 0x22 // 钻孔数据
#define DATA_RKNIFE 0x23 // 圆刀数据, 该数据需要震刀先运转,同时 X, YR 偏移 dx,dy,dr
#define DATA_SKNIFE 0x24 // 震刀数据, 该数据需要震刀先运转,同时 X, YR 偏移 dx,dy,dr
#define DATA_END 0x80 // 结束码
#define DATA_PAUSE 0x81 // 暂停功能码
#define DATA_CHGND 0x82 // 换色
#define DATA_CUTTRD 0x83 // 剪线功能码
#define DATA_ANGLE 0x89 // 拐点
// atrr, 属性字节,作为运动属性字节
// 缝纫针步的属性定义:
// 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
#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
u8 reserved3[0x100-0x84];
// 100
s32 pullMateOffset[6];
u8 reserved4[0x200-0x118];
// 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 rev2[256-26];
} __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

1752
machine/comm/protocol.h Normal file

File diff suppressed because it is too large Load Diff

107
machine/comm/typedef.h Normal file
View File

@ -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

157
machine/comport.cpp Normal file
View File

@ -0,0 +1,157 @@
#include "comport.h"
#include <QDebug>
#include <QThread>
//-----------------------------------------------------------------------------------------------------
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<const wchar_t *>(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()="<<dat.size();
qDebug()<< "m_pSerialport->readAll() :"<<dat.data();
emit (siReceiveData(dat));
}
}
}
void ComPort::slotSendData(QByteArray dat)
{
// qDebug() << "ComPort SlotSendData" << QThread::currentThread();
if (m_running != 0 && m_pSerialport != NULL && dat.size() != 0)
{
qDebug()<<"ComPort::slotSendData send data" << QString(dat);
m_pSerialport->write(dat.data(), dat.size());
}
}

43
machine/comport.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef COMPORT_H
#define COMPORT_H
#include <QObject>
#include <QTimer>
#include <QSettings>
#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

105
machine/error.cpp Normal file
View File

@ -0,0 +1,105 @@

#include "error.h"
#include "comm/protocol.h"
#include <QObject>
#define CASE_OP(cd, str) \
{\
case cd:\
errinfo = str;\
break;\
}
QString getErrStr(u32 code)
{
QString errinfo;
errinfo.clear();
QString errorCode;
errorCode.clear();
switch (code)
{
//通用的错误代码
CASE_OP(ERR_NONE, QObject::tr("")); // 没有错误
CASE_OP(ERR_NO_AIR, QObject::tr("(0x0002)Insufficient air pressure")); // 气压不足
CASE_OP(ERR_NOT_SAFE, QObject::tr("(0x0003)safe area error")); // 安全区域介入
CASE_OP(ERR_EXPIRATION, QObject::tr("(0x0004)Expiration of use")); // 使用时限已到
CASE_OP(ERR_DRIVER, QObject::tr("(0x0005)Driver alarm")); // 驱动器报警
CASE_OP(ERR_FILL_DATA, QObject::tr("(0x0006)Fill data error")); // 填充数据错误
CASE_OP(ERR_NOT_ALLOWED, QObject::tr("(0x0007)Not allowed to work")); // 不允许工作状态
CASE_OP(ERR_CTRL_ERR, QObject::tr("(0x0008)Control error")); // 控制错误
CASE_OP(ERR_FPGA_ERR, QObject::tr("(0x0009)Motion control chip version error")); // 运动控制芯片版本错误
CASE_OP(ERR_BUTTON_NOUP, QObject::tr("(0x000A)Waiting for button to lift timeout")); // 等待按钮抬起超时
CASE_OP(ERR_FPGA_RESET, QObject::tr("(0x000B)FPGA Reset")); // FPGA复位
CASE_OP(ERR_NO_READY, QObject::tr("(0x000C)Peripheral Device not ready")); // 外设未就绪
CASE_OP(ERR_NO_SEND_ERR, QObject::tr("(0x000D)Transmission data error")); // 传输数据错误
CASE_OP(ERR_EDTION_ERR, QObject::tr("(0x000E)Program version error")); // 程序版本错误
CASE_OP(ERR_WORK_DONE, QObject::tr("(0x000F)Complete output")); // 完成产量
CASE_OP(ERR_LMT_POSITIVE, QObject::tr("(0x0010)Positive limit")); // 正向限位
CASE_OP(ERR_LMT_NEGATIVE, QObject::tr("(0x0011)Negative limit")); // 反向限位
CASE_OP(ERR_RUN_ALM, QObject::tr("(0x0012)Motion alarm")); // 运动报警
CASE_OP(ERR_RUN_LIMIT, QObject::tr("(0x0013)Motion limit")); // 运动限位
CASE_OP(ERR_RUN_EMS, QObject::tr("(0x0014)Emergency stop")); // 运动急停
CASE_OP(ERR_MV_PARA, QObject::tr("(0x0015)Motion parameters error")); // 运动参数错误
CASE_OP(ERR_MC_PARA, QObject::tr("(0x0016)Machine parameters error")); // 机器参数错误
CASE_OP(ERR_IN_PARA, QObject::tr("(0x0017)Input parameters error")); // 输入参数错误
CASE_OP(ERR_NOT_WORKSTA, QObject::tr("(0x001A)Not in work status error")); // 不能工作状态
CASE_OP(ERR_NOT_MOVESTA, QObject::tr("(0x001B)Prohibited frame moving state")); // 禁止移框状态
CASE_OP(ERR_MTZ_RIGHT, QObject::tr("(0x001F)Zero success")); // 归零成功
CASE_OP(ERR_MTZ_ERROR, QObject::tr("(0x0020)Return to zero error")); // 归零错误
CASE_OP(ERR_COOR_SYSTM, QObject::tr("(0x0021)Coordinate system error")); // 坐标系统错误
CASE_OP(ERR_OUT_RANGE, QObject::tr("(0x0022)Target position out of bounds")); // 目标位置越界
CASE_OP(ERR_X_LIT_POSI, QObject::tr("(0x0023)X Positive limit")); // X正向限位
CASE_OP(ERR_X_LIT_NEGA, QObject::tr("(0x0024)X Negative limit")); // X反向限位
CASE_OP(ERR_Y_LIT_POSI, QObject::tr("(0x0025)Y Positive limit")); // Y正向限位
CASE_OP(ERR_Y_LIT_NEGA, QObject::tr("(0x0026)Y Negative limit")); // Y反向限位
CASE_OP(ERR_ALM_COVEROPEN, QObject::tr("(0x002B)Safety door error")); // 开盖报警,安全门错误
CASE_OP(ERR_LIGHTCURTAINS1, QObject::tr("(0x002C)Entering the light curtain 1")); // 光幕1介入
CASE_OP(ERR_LIGHTCURTAINS2, QObject::tr("(0x002D)Entering the light curtain 2")); // 光幕2介入
CASE_OP(ERR_NO_DATA, QObject::tr("(0x0040)None data")); // 无数据
CASE_OP(ERR_DATA_ERROR, QObject::tr("(0x0041)Data error")); // 数据错误
CASE_OP(ERR_GRAPH_OUT_RANGE, QObject::tr("(0x0042)Graphics out of range")); // 图形超出范围
CASE_OP(ERR_MS_NOT_ZERO, QObject::tr("(0x0050)Spindle is not in zero position")); // 主轴不在零位
CASE_OP(ERR_HK_NOT_ZERO, QObject::tr("(0x0051)Rotary hook is not in zero position")); // 旋梭不在零位
CASE_OP(ERR_CUTTER_NOT_POS, QObject::tr("(0x0054)Scissors are not in position")); // 剪刀不在回位
CASE_OP(ERR_HEAD_NOT_LOW, QObject::tr("(0x0056)Nose not in low position")); // 机头不在低位
CASE_OP(ERR_UPER_TBREAK, QObject::tr("(0x0058)Thread is broken"));// 断线
CASE_OP(ERR_BOBBIN_TBREAK, QObject::tr("(0x0059)Bottom thread disconnected")); // 底线断线
CASE_OP(ERR_TRANS_TIMEOUT, QObject::tr("(0x005D)Execution command timed out")); // 执行命令超时
CASE_OP(ERR_LIFT_TIMEOUT, QObject::tr("(0x005F)Head lifting timeout")); // 机头升降超时
CASE_OP(ERR_CHANGE_BOBBIN, QObject::tr("(0x00F0)Change the bobbin")); // 更换梭芯
CASE_OP(ERR_CHANGE_BOBBIN_A, QObject::tr("(0x00F1)Replace bobbin A")); // 更换梭芯A
CASE_OP(ERR_CHANGE_BOBBIN_B, QObject::tr("(0x00F2)Replace bobbin B")); // 更换梭芯B
CASE_OP(ERR_CHANGE_BOBBIN_STA, QObject::tr("(0x00F3)The machine is in the state of replacing the bobbin")); // 机器处于更换梭芯状态
CASE_OP(ERR_AIR_POWER, QObject::tr("(0x002E)Insufficient air pressure")); // 气压不足
//通用的状态信息
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("(0x0106)Execute success")); // 执行成功
CASE_OP(STA_EXEC_FAILED, QObject::tr("(0x0107)Execute false")); // 执行失败
CASE_OP(STA_WAIT_FILE, QObject::tr("(0x0108)wait file")); // 等待文件
CASE_OP(STA_CHANGE_BOBBIN, QObject::tr("(0x0109)change the bobbin")); // 更换梭芯
CASE_OP(STA_PROCESS_FINISH, QObject::tr("(0x010A)Execute finish")); // 执行完成
CASE_OP(STA_PROCESS_RUNNING, QObject::tr("(0x010B)Execute runnibng")); // 执行过程中
default:
//errorCode.sprintf("CODE 0x%x", code);
//errinfo.append(QObject::tr("Undefined error,") + errorCode);
break;
}
return errinfo;
}
QString getPromptStr(u32 code)
{
QString errinfo;
switch (code)
{
}
return errinfo;
}

12
machine/error.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef ERROR_H
#define ERROR_H
#include <QString>
#include "comm/typedef.h"
QString getErrStr(u32 code);
QString getPromptStr(u32 code);
#endif // ERROR_H

View File

@ -0,0 +1,334 @@
#include "gatewaytcpclient.h"
#include <QSettings>
#include <QApplication>
#include <QAbstractSocket>
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() << "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())
{
// 机器的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 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");
}

View File

@ -0,0 +1,72 @@
#ifndef GATEWAYTCPCLIENT_H
#define GATEWAYTCPCLIENT_H
#include <QObject>
#include <QTimer>
#include <QHostAddress>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QTcpServer>
#include <QThread>
#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

289
machine/lotmachine.cpp Normal file
View File

@ -0,0 +1,289 @@
#include "lotmachine.h"
#include <QTime>
#include <QApplication>
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)
{
qDebug() << "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));
}

73
machine/lotmachine.h Normal file
View File

@ -0,0 +1,73 @@
#ifndef LOTMACHINE_H
#define LOTMACHINE_H
#include "gatewaytcpclient.h"
#include "comport.h"
#include "comm/typedef.h"
#include <QThread>
#include <QTimer>
#include <QDebug>
#include <QStringList>
#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

1962
machine/machine.cpp Normal file

File diff suppressed because it is too large Load Diff

299
machine/machine.h Normal file
View File

@ -0,0 +1,299 @@
#ifndef MACHINE_H
#define MACHINE_H
#include "tcpclient.h"
#include "comport.h"
#include "datafile/datafiledsr.h"
#include <QThread>
#include <QTimer>
#include <QDebug>
#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 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; // 工作预留参数
int m_mcParaEn;
int m_wkParaEn;
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 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);
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 outputCtrl(int obj, int act, int para); // 输出控制(辅助调试的功能,无安全保护和逻辑关系)
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 step); // 针梭校对
void rotaAdjust(int step); // 旋转校对
void sewHeadLiftUpDown(); // 机头升降
void sewHeadLiftUp(); // 机头上升
void sewHeadLiftDown(); // 机头下降
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(); // 缝纫点动
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 gotoOffsetPos(); // 回偏移点
void checkFrame(); // 边框检查
void simulateFrame(); // 空走边框
void fastJump(int idx); // 前进回退
void gotoWorkPos(); // 回工作点
void gotoFixPos(); // 回穿线点
void gotoShuttlePos(); // 回换梭位
void gotoZeroPos(); // 回零点
void msRpmChange(int chgram,int flag); // 速度改变
void mainShaftJog();// 主轴点动
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

186
machine/qbindtcpsocket.cpp Normal file
View File

@ -0,0 +1,186 @@
#include "qbindtcpsocket.h"
#include <QHostAddress>
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;
}

53
machine/qbindtcpsocket.h Normal file
View File

@ -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 <QTcpSocket>
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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,57 @@
#ifndef _POSIX_QEXTSERIALPORT_H_
#define _POSIX_QEXTSERIALPORT_H_
#include <stdio.h>
#include <termios.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#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

View File

@ -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;
}

Some files were not shown because too many files have changed in this diff Show More