Browse Source

同步最新代码

JonYang 1 week ago
parent
commit
a03393a109
57 changed files with 1200 additions and 381 deletions
  1. BIN
      Output/bin/x64/Control.dll
  2. BIN
      Output/bin/x64/Control.pdb
  3. BIN
      Output/bin/x64/JSMotion.dll
  4. BIN
      Output/bin/x64/Module.dll
  5. BIN
      Output/bin/x64/Module.pdb
  6. BIN
      Output/bin/x64/configurations.db
  7. BIN
      Output/bin/x64/photos/image.png
  8. BIN
      Output/bin/x64/photos/image_1.png
  9. BIN
      Output/bin/x64/photos/image_3.png
  10. BIN
      Output/bin/x64/photos/image_5.png
  11. BIN
      Output/config/db/MachineCalibration.db
  12. BIN
      Output/config/db/ModuleConfig.db
  13. BIN
      Output/dll/x64/Control.dll
  14. BIN
      Output/dll/x64/JSMotion.dll
  15. BIN
      Output/dll/x64/Module.dll
  16. 11 1
      Output/inc/Control/CViewInterface.h
  17. 7 2
      Output/inc/Module/CAxis.h
  18. 20 10
      Output/inc/Module/CBondHead.h
  19. 9 5
      Output/inc/Module/CBondMatrix.h
  20. 93 42
      Output/inc/Module/CCalibrationConfig.h
  21. 39 14
      Output/inc/Module/CConfigBase.h
  22. 2 2
      Output/inc/Module/CDataBaseOperate.h
  23. 2 4
      Output/inc/Module/CEutecticHead.h
  24. 11 9
      Output/inc/Module/CForceControl.h
  25. 41 4
      Output/inc/Module/CLookUpCalib.h
  26. 1 0
      Output/inc/Module/CMachineCalibration.h
  27. 33 9
      Output/inc/Module/CManageDB.h
  28. 26 1
      Output/inc/Module/CModuleConfig.h
  29. 2 0
      Output/inc/Module/CPrStrategy.h
  30. 34 7
      Output/inc/Module/CRCalib.h
  31. 5 2
      Output/inc/Module/CResources.h
  32. 4 3
      Output/inc/Module/CUltraHead.h
  33. 32 0
      Output/inc/Module/CUltraHeadDiagnosis.h
  34. 12 8
      Output/inc/Module/CXYCalib.h
  35. 12 4
      Output/inc/Module/JAxis.h
  36. 3 0
      Output/inc/Module/TipMatrix.h
  37. BIN
      Output/lib/x64/Common.lib
  38. BIN
      Output/lib/x64/Control.lib
  39. BIN
      Output/lib/x64/Module.lib
  40. 1 0
      View/die-bonder-ui/OriginalWnd/ChartsAndCamerasWnd.h
  41. 153 156
      View/die-bonder-ui/OriginalWnd/DbTreeViewManager.cpp
  42. 18 21
      View/die-bonder-ui/OriginalWnd/DbTreeViewManager.h
  43. 4 7
      View/die-bonder-ui/OriginalWnd/MainAndSecondaryCamerasWnd.cpp
  44. 41 19
      View/die-bonder-ui/OriginalWnd/OriginalWnd.cpp
  45. 8 0
      View/die-bonder-ui/OriginalWnd/OriginalWnd.h
  46. 14 1
      View/die-bonder-ui/OriginalWnd/OriginalWnd.ui
  47. 4 0
      View/die-bonder-ui/SBTdie-bonder-ui.vcxproj
  48. 15 3
      View/die-bonder-ui/SBTdie-bonder-ui.vcxproj.filters
  49. 18 12
      View/die-bonder-ui/Src/RewriteControl/ControlOperationPage.cpp
  50. 108 0
      View/die-bonder-ui/Src/RewriteControl/JoystickPage.cpp
  51. 49 0
      View/die-bonder-ui/Src/RewriteControl/JoystickPage.h
  52. 32 1
      View/die-bonder-ui/Src/RewriteControl/LightJoystickSwitchPage.ui
  53. 58 0
      View/die-bonder-ui/Src/RewriteControl/Sidebar/LogStatePage.cpp
  54. 90 0
      View/die-bonder-ui/Src/RewriteControl/Sidebar/LogStatePage.h
  55. 152 23
      View/die-bonder-ui/Src/Sql/SqlOperation.cpp
  56. 35 10
      View/die-bonder-ui/Src/Sql/SqlOperation.h
  57. 1 1
      View/die-bonder-ui/Src/common/JMessageTip.cpp

BIN
Output/bin/x64/Control.dll


BIN
Output/bin/x64/Control.pdb


BIN
Output/bin/x64/JSMotion.dll


BIN
Output/bin/x64/Module.dll


BIN
Output/bin/x64/Module.pdb


BIN
Output/bin/x64/configurations.db


BIN
Output/bin/x64/photos/image.png


BIN
Output/bin/x64/photos/image_1.png


BIN
Output/bin/x64/photos/image_3.png


BIN
Output/bin/x64/photos/image_5.png


BIN
Output/config/db/MachineCalibration.db


BIN
Output/config/db/ModuleConfig.db


BIN
Output/dll/x64/Control.dll


BIN
Output/dll/x64/JSMotion.dll


BIN
Output/dll/x64/Module.dll


+ 11 - 1
Output/inc/Control/CViewInterface.h

@@ -21,8 +21,15 @@ namespace ns_module
 
 	class __declspec(dllexport) CViewInterface
 	{
+	public:
+		struct THREAD_BUTTON_RUN
+		{
+			CViewInterface* pClass;
+			ST_BUTTON_FUN stButtonInfo;
+		};
 	private:
 		static CViewInterface* m_instance;
+		static HANDLE m_hEvent;
 
 		bool m_bIsInitSuccess = false;
 		CManageDB* m_pCManageDB = nullptr;
@@ -162,7 +169,10 @@ namespace ns_module
 		long RunAutoBond();
 		//Ö´Ðа´Å¥ÃüÁî
 		long RunButton(ST_BUTTON_FUN stInfo);
-		
+		static VOID CALLBACK threadRunButton(PTP_CALLBACK_INSTANCE Instance, PVOID Parameter, PTP_WORK Work);
+		long RunButtonByThread(ST_BUTTON_FUN stInfo);
+
+		long RunTest(ST_BUTTON_FUN stInfo);
 #pragma endregion
 	};
 

+ 7 - 2
Output/inc/Module/CAxis.h

@@ -88,12 +88,17 @@ public:
 	LONG GetBufferParamF(int nBufferNo, std::string sParamFName, double& dDoubleParam);
 	LONG SetBufferParam(int nBufferNo, std::string sParamFName, int dDoubleParam);
 	LONG GetBufferParam(int nBufferNo, std::string sParamFName, int& dDoubleParam);
-	LONG WriteSerialValue(std::string sSerial, std::any tValue);
-	LONG WirteSocketValue(std::string ascii, std::any tValue);
+	LONG WriteSerialValueF(std::string sSerial, double tValue);
+
+	LONG WriteSerialValueN(std::string sSerial, int tValue);
+	LONG WriteSocketValueF(std::string ascii, double tValue);
+	LONG WriteSocketValueN(std::string ascii, int tValue);
+	LONG WriteSocketCommand(std::string ascii);
 
 	//LONG RunForcerBuffer();  //运行力控buffer,不断判断弹簧压合到特定位置,到特定位置控制力控轴停下来
 	//LONG RunSpringForcerBuffer();  //运行弹簧力控buffer,循环判断多段弹簧压合位置,每次到压合位置Z轴停下来
 	LONG RunBuffer(int id);
+	LONG StopBuffer(int id);
 
 
 

+ 20 - 10
Output/inc/Module/CBondHead.h

@@ -18,6 +18,7 @@ public:
 	virtual LONG AllocateAxis(vector<CAxis*> vecAxis);
 	virtual LONG AllocateIo(vector<CIO*> vecIo);
 
+
 	void SetXAxis(CAxis* axis) { m_pXAxis = axis; }
 	CAxis* GetXAxis() { return m_pXAxis; }
 	void SetYAxis(CAxis* axis) { m_pYAxis = axis; }
@@ -54,16 +55,16 @@ public:
 
 	virtual LONG ToHome();
     virtual LONG ToSafePosition();
-	LONG Move(double x, double y, bool bSync = true);
-	LONG MoveTo(double x,double y, bool bSync = true);
-	LONG MoveTo(double x, double y,double z);
-	LONG MoveTo(double x, double y, double z,double r);
+	LONG XYMove(double x, double y, bool bSync = true);
+	LONG XYMoveTo(double x,double y, bool bSync = true);
+	LONG XYZMoveTo(double x, double y,double z);
+	LONG XYZRMoveTo(double x, double y, double z,double r);
 
 	virtual void SetPickHTestIndex(int index) = 0;
 	virtual void SetBondHTestIndex(int index) = 0;
-	virtual LONG PickHighTest() = 0;//调用之前先SetIndex
+	virtual LONG PickHightTest();//调用之前先SetIndex
 	virtual LONG AllBondHighTest() = 0;
-	virtual LONG BongHighTest() = 0;
+	virtual LONG BondHighTest();
 
 	virtual LONG VacuumOn(long lDelay);		//真空开,真空延时,ms
 	virtual LONG VacuumOff(long lDelay);		//真空关,吹汽延时,ms
@@ -82,7 +83,7 @@ public:
 	virtual LONG MoveNozzleToLowCamera();
 
 	//吸嘴取晶
-	virtual LONG MoveToGrabPos(bool waitDone = true);
+	virtual LONG MoveToPickGrabPos(bool waitDone = true);
 	virtual LONG PickGrab(int index, X_Y_ANGLE_STRUCT& result);//中转台拍照,返回拍照结果,拍照结果仅用于拾取偏移,不存储
 	//virtual LONG MoveToPickPos();//移动到拾取位,未拍照	
 
@@ -98,7 +99,7 @@ public:
 
 	//吸嘴固晶
 	virtual LONG PlaceDie(int index, X_Y_ANGLE_STRUCT lookUpOffsetPixel) = 0;
-	virtual LONG MoveToBondPos(int index) = 0;
+	virtual LONG MoveToBondGrabPos(int index) = 0;
 	virtual LONG BondGrab(int index, X_Y_ANGLE_STRUCT& result) = 0; //返回的拍照结果为物理单位
 	virtual LONG ToBondPos_AddOffset(int index, X_Y_ANGLE_STRUCT bondOffset, X_Y_ANGLE_STRUCT lookUpOffset, bool waitDone = true) = 0;//传入物理位置
 	virtual LONG BondDieDown(int index) = 0;//传入物理位置
@@ -109,6 +110,9 @@ public:
 	virtual LONG GetCurForce(double& force);
 	virtual LONG Sync();
 
+	//virtual LONG PickHightTest();
+	//virtual LONG BondHighTest();
+
 	//标定
 	virtual LONG HighCameraCTDCalib() { return OK; }
 	virtual LONG LowCameraPosCalib();
@@ -119,6 +123,11 @@ public:
 	virtual LONG LowCameraXYCalib();
 	virtual LONG LookUpCameraXYCalib();
 
+	//创建流程模板
+	virtual LONG CreatePickTemp(int dieIndex);
+	virtual LONG CreateLookUpTemp(int dieIndex);
+	virtual LONG CreateBondTemp(int dieIndex);
+
 
 	//力控标定
 	virtual LONG SpringForceCalib();
@@ -214,12 +223,13 @@ protected:
 	double m_dNozzleTableOriginPosX = 0;
 	double m_dNozzleTableOriginPosY = 0;
 
-	int m_nPickHTestDieIndex = 0;
-	int m_nBondHTestDieIndex = 0;
+	int m_nPickHTestDieIndex = 1;
+	int m_nBondHTestDieIndex = 1;
 
 	bool m_bIsLocationAll = false; //用于固晶时补偿可选全部拍照补偿或者每个PCB只拍一次
 
 	double m_dGivenForceZPos = 0;		//拾取放置芯片时力控轴的反馈位置
 
+	double m_dBondGrabPosZ = 0;			//bondGrabPosZ
 };
 

+ 9 - 5
Output/inc/Module/CBondMatrix.h

@@ -53,12 +53,13 @@ namespace ns_mat
 
 	//固晶顺序
 	enum BOND_DIR {
+		NO_SET = 0,
 		//order顺序,按照遍历大矩阵第一格所有小矩阵再遍历第二格
 		//Alternate顺序,按照遍历完相同的小矩阵再遍历第二种小矩阵
-		OrderAndS = 0,/*弓字型*/
-		AlternateAndZ = 1,
-		OrderAndZ = 2,/*之字型*/
-		AlternateAndS = 3,
+		OrderAndS = 1,/*弓字型*/
+		AlternateAndZ = 2,
+		OrderAndZ = 3,/*之字型*/
+		AlternateAndS = 4,
 	};
 
 	typedef struct _BOND_INDEX_STRUCT
@@ -146,7 +147,7 @@ namespace ns_mat
 		int m_iWaferDieNum = 0;
 		int m_iWaffleDieNum = 0;
 
-		BOND_DIR m_eBondDir = BOND_DIR::OrderAndS;
+		BOND_DIR m_eBondDir = BOND_DIR::NO_SET;
 
 		CProduct* m_pCProduct = nullptr;
 
@@ -164,6 +165,9 @@ namespace ns_mat
 
 		void ProcessPointMatrix(const PROGRAM_BOND_MATRIX_STRUCT& pcbMatrix, const PROGRAM_POINT_MATRIX_STRUCT& pointMatrix, int i, int j);
 		//void RecvTableChangNoticeFunction(string dbname, string tabname);
+
+		void DataChangNotice(string strDbName, string strTableName);
+
 	public:
 		CBondMatrix();
 		LONG LoadMatrix(BOND_DIR dir);

+ 93 - 42
Output/inc/Module/CCalibrationConfig.h

@@ -10,11 +10,21 @@
 #endif
 
 #define CALIBCONFIG_DATABASE_NAME					ROOT_PATH##"\\db\\MachineCalibration.db"
-#define BOND_LOW_CAMERA_CALIB_TABLE_NAME			"BondLowCamera"
-#define BOND_HIGH_CAMERA_CALIB_TABLE_NAME			"BondHighCamera"
-#define BOND_WAFFLE_CAMERA_CALIB_TABLE_NAME			"WaffleCamera"
-#define BOND_WAFER_CAMERA_CALIB_TABLE_NAME			"WaferCamera"
-#define BOND_LOOKUP_CAMERA_CALIB_TABLE_NAME			"BHLookUpCamera"
+#define CALIB_CTD_TABLE_NAME		                    "Calib_CameraTipDis"
+#define CALIB_XY_TABLE_NAME		                        "Calib_XY"
+#define CALIB_R_TABLE_NAME		                        "Calib_R"
+#define CALIB_STEP_R_RESULT_TABLE_NAME		            "Calib_R_Result"
+#define FORCE_CONTROL_TABLE_NAME                        "Force_Control"
+#define HORIZONTAL_MEASURE_TABLE_NAME                   "Horizontal_Measure"
+#define VERTICAL_MEASURE_TABLE_NAME                     "Vertical_Measure"
+#define CALIB_TIP_RESULT                                "Tip_R_CTD_CalibResult"
+
+
+//#define BOND_LOW_CAMERA_CALIB_TABLE_NAME			"BondLowCamera"
+//#define BOND_HIGH_CAMERA_CALIB_TABLE_NAME			"BondHighCamera"
+//#define BOND_WAFFLE_CAMERA_CALIB_TABLE_NAME			"WaffleCamera"
+//#define BOND_WAFER_CAMERA_CALIB_TABLE_NAME			"WaferCamera"
+//#define BOND_LOOKUP_CAMERA_CALIB_TABLE_NAME			"BHLookUpCamera"
 
 
 namespace ns_db
@@ -37,55 +47,96 @@ namespace ns_db
 		LONG SaveDB() override;
 		LONG LoadDB() override;
 
-#pragma region BondHighCamera
-	private:
-		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondHighCamera;
-	public:
-		LONG GetConfigParam_BondHighCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
-		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondHighCamera() { return m_vecConfig_BondHighCamera; };
-		LONG SetConfigParam_BondHighCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
-		LONG SetConfigParam_BondHighCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
-#pragma endregion	
 
-#pragma region BondLowCamera
+#pragma region XYCALIB
 	private:
-		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondLowCamera;
+		std::vector<CONFIG_BASE_STRUCT>  m_vecXYCalibParam;
 	public:
-		LONG GetConfigParam_BondLowCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
-		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondLowCamera() { return m_vecConfig_BondLowCamera; };
-		LONG SetConfigParam_BondLowCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
-		LONG SetConfigParam_BondLowCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
-#pragma endregion	
+		LONG GetXYCalibParam(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+		vector<CONFIG_BASE_STRUCT> GetXYCalibParam() { return m_vecXYCalibParam; }
+		LONG SetXYCalibParam(vector<MODULE_CONFIG_STRUCT> vecconfig);
+		LONG SetXYCalibParam(vector<CONFIG_BASE_STRUCT> vecconfig);
+
+#pragma endregion
 
-#pragma region WaferCamera
+#pragma region LookUpCalib
 	private:
-		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaferCamera;
+		std::vector<CONFIG_BASE_STRUCT>  m_vecCTDCalibParam;
 	public:
-		LONG GetConfigParam_WaferCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
-		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaferCamera() { return m_vecConfig_WaferCamera; };
-		LONG SetConfigParam_WaferCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
-		LONG SetConfigParam_WaferCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
-#pragma endregion	
+		LONG GetCTDCalibParam(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+		vector<CONFIG_BASE_STRUCT> GetCTDCalibParam() { return m_vecCTDCalibParam; }
+		LONG SetCTDCalibParam(vector<MODULE_CONFIG_STRUCT> vecconfig);
+		LONG SetCTDCalibParam(vector<CONFIG_BASE_STRUCT> vecconfig);
+#pragma endregion
 
-#pragma region WaffleCamera
+#pragma region RCalib
 	private:
-		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaffleCamera;
+		std::vector<CONFIG_BASE_STRUCT>  m_vecRCalibParam;
 	public:
-		LONG GetConfigParam_WaffleCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
-		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaffleCamera() { return m_vecConfig_WaffleCamera; };
-		LONG SetConfigParam_WaffleCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
-		LONG SetConfigParam_WaffleCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
-#pragma endregion	
+		LONG GetRCalibParam(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+		vector<CONFIG_BASE_STRUCT> GetRCalibParam() { return m_vecRCalibParam; }
+		LONG SetRCalibParam(vector<MODULE_CONFIG_STRUCT> vecconfig);
+		LONG SetRCalibParam(vector<CONFIG_BASE_STRUCT> vecconfig);
+#pragma endregion
 
-#pragma region BHLookUpCamera
+#pragma region ForceCalib
 	private:
-		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BHLookUpCamera;
+		std::vector<CONFIG_BASE_STRUCT>  m_vecForceCalib;
 	public:
-		LONG GetConfigParam_BHLookUpCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
-		vector<CONFIG_BASE_STRUCT> GetConfigParam_BHLookUpCamera() { return m_vecConfig_BHLookUpCamera; };
-		LONG SetConfigParam_BHLookUpCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
-		LONG SetConfigParam_BHLookUpCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
-#pragma endregion	
+		LONG GetForceCalibParam(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+		vector<CONFIG_BASE_STRUCT> GetForceCalibParam() { return m_vecForceCalib; }
+		LONG SetForceCalibParam(vector<MODULE_CONFIG_STRUCT> vecconfig);
+		LONG SetForceCalibParam(vector<CONFIG_BASE_STRUCT> vecconfig);
+
+//#pragma region BondHighCamera
+//	private:
+//		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondHighCamera;
+//	public:
+//		LONG GetConfigParam_BondHighCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+//		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondHighCamera() { return m_vecConfig_BondHighCamera; };
+//		LONG SetConfigParam_BondHighCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
+//		LONG SetConfigParam_BondHighCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
+//#pragma endregion	
+//
+//#pragma region BondLowCamera
+//	private:
+//		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondLowCamera;
+//	public:
+//		LONG GetConfigParam_BondLowCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+//		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondLowCamera() { return m_vecConfig_BondLowCamera; };
+//		LONG SetConfigParam_BondLowCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
+//		LONG SetConfigParam_BondLowCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
+//#pragma endregion	
+//
+//#pragma region WaferCamera
+//	private:
+//		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaferCamera;
+//	public:
+//		LONG GetConfigParam_WaferCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+//		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaferCamera() { return m_vecConfig_WaferCamera; };
+//		LONG SetConfigParam_WaferCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
+//		LONG SetConfigParam_WaferCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
+//#pragma endregion	
+//
+//#pragma region WaffleCamera
+//	private:
+//		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaffleCamera;
+//	public:
+//		LONG GetConfigParam_WaffleCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+//		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaffleCamera() { return m_vecConfig_WaffleCamera; };
+//		LONG SetConfigParam_WaffleCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
+//		LONG SetConfigParam_WaffleCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
+//#pragma endregion	
+//
+//#pragma region BHLookUpCamera
+//	private:
+//		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BHLookUpCamera;
+//	public:
+//		LONG GetConfigParam_BHLookUpCamera(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+//		vector<CONFIG_BASE_STRUCT> GetConfigParam_BHLookUpCamera() { return m_vecConfig_BHLookUpCamera; };
+//		LONG SetConfigParam_BHLookUpCamera(vector<CONFIG_BASE_STRUCT> vecconfig);
+//		LONG SetConfigParam_BHLookUpCamera(vector<MODULE_CONFIG_STRUCT> vecconfig);
+//#pragma endregion	
 
     };
 

+ 39 - 14
Output/inc/Module/CConfigBase.h

@@ -15,6 +15,7 @@
 #include <windows.h>
 #include <vector>
 #include <mutex>
+#include "CDataBaseOperate.h"
 
 namespace ns_db
 {
@@ -29,20 +30,20 @@ namespace ns_db
 	typedef struct _CONFIG_BASE_STRUCT
 	{
 		INT iNo_;
-		INT iGroupId;
-		string strName;
-		string strDescribe;
-		INT iUserGrade;
-		INT iChangeFlag;
-		string strValue;
-		string strType;
-		string strDefult;
-		string strLowerLimit;
-		string strUpperLimit;
-		string strUnit;
-		string sIcon;
-		bool bEnable;
-		string strCallFun;
+		INT iGroupId = 1;
+		string strName = "";
+		string strDescribe = "";
+		INT iUserGrade = 1;
+		INT iChangeFlag = 1;
+		string strValue = "";
+		string strType = "";
+		string strDefult = "";
+		string strLowerLimit = "-1000000";
+		string strUpperLimit = "1000000";
+		string strUnit = "um";
+		string sIcon = "";
+		bool bEnable = true;
+		string strCallFun = "";
 	}CONFIG_BASE_STRUCT;
 
 	enum CONFIG_TYPE
@@ -121,9 +122,28 @@ namespace ns_db
 
 	}MODULE_CONFIG_STRUCT;
 
+	// 定义函数指针类型
+	using GetFunctionPtr = vector<CONFIG_BASE_STRUCT>(*)();
+	using SetFunctionPtr = std::function<LONG(CDataBaseOperate*, std::vector<CONFIG_BASE_STRUCT>)>;
+
+	typedef struct 
+	{
+		GetFunctionPtr get;
+		SetFunctionPtr set;
+	} CONFIG_FUNCTION_PTR;
+
+
 	class DLL_CONFIG_BASE_API CConfigBase
 	{
+	private:
+		// 函数注册表
+		std::map<std::string, CONFIG_FUNCTION_PTR> m_FunctionRegistry;
+
 	public:
+		// 注册函数
+		void RegisterFunction(const std::string& name,GetFunctionPtr get, SetFunctionPtr set);
+		LONG CallSetFunction(const std::string& name, CDataBaseOperate* obj, std::vector<CONFIG_BASE_STRUCT> vecconfig);
+		
 		CConfigBase(string sPathFile, CppSQLite3DB* pDB);
 
 		LONG LoadConfigDB(string strTableName, vector<CONFIG_BASE_STRUCT>& vecConfig);
@@ -145,7 +165,12 @@ namespace ns_db
 		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, DOUBLE value);
 		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, bool value);
 
+		LONG Append(vector<CONFIG_BASE_STRUCT>* stConfig, MODULE_CONFIG_STRUCT config);
+
+		//在ConfigBase 中查找 ModuleConfig 中需要的数据
 		LONG GetConfigParam(vector<CONFIG_BASE_STRUCT> stConfig, vector<MODULE_CONFIG_STRUCT>* vecconfig);
+
+		//将ModuleConfig的数据设置到ConfigBase中
 		LONG SetConfigParam(vector<CONFIG_BASE_STRUCT>* stConfig, vector<MODULE_CONFIG_STRUCT> vecconfig);
 
 	private:

+ 2 - 2
Output/inc/Module/CDataBaseOperate.h

@@ -36,10 +36,10 @@ namespace ns_db
     {
     private:
         bool m_bIsInit;
-        //static void* context;
+        static void* m_pContext;
         static void* m_pPubSocket;
-        static void* m_pSubscriberSocket;
 
+        static VOID CALLBACK RecvDataChangNoticeProcess(PTP_CALLBACK_INSTANCE Instance, PVOID Parameter, PTP_WORK Work);
     protected:
         CDataBaseOperate(string sPathFile);
         ~CDataBaseOperate();

+ 2 - 4
Output/inc/Module/CEutecticHead.h

@@ -43,9 +43,7 @@ public:
 
 	virtual void SetPickHTestIndex(int index) override;
 	virtual void SetBondHTestIndex(int index) override;
-	virtual LONG PickHighTest() override;//调用之前先SetIndex
 	virtual LONG AllBondHighTest() override;
-	virtual LONG BongHighTest() override;
 	virtual LONG VacuumOn(long lDelay) override;		//真空开
 	virtual LONG VacuumOff(long lDelay) override;		//真空关,吹汽延时,ms 
 	virtual LONG StrongOn() override;		//强吹开
@@ -61,7 +59,7 @@ public:
 
 
 	//吸嘴取晶,若返回值错误,需要自行调用回安全位置
-	virtual LONG MoveToGrabPos(bool waitDone = true)override;
+	virtual LONG MoveToPickGrabPos(bool waitDone = true)override;
 	//拍照,取晶,并上行到上视拍照位,主要用于自动流程
 	virtual LONG PickDie(int index)override;
 	//移动到拾取位,未拍照
@@ -80,7 +78,7 @@ public:
 
 	//吸嘴固晶
 	virtual LONG PlaceDie(int index, X_Y_ANGLE_STRUCT lookUpOffsetPixel)override;
-	virtual LONG MoveToBondPos(int index)override;//修改为BondGrabPos
+	virtual LONG MoveToBondGrabPos(int index)override;//修改为BondGrabPos
 	//返回的拍照结果为物理单位
 	virtual LONG BondGrab(int index, X_Y_ANGLE_STRUCT& result)override;
 	virtual LONG ToBondPos_AddOffset(int index, X_Y_ANGLE_STRUCT bondOffset, X_Y_ANGLE_STRUCT lookUpOffset,

+ 11 - 9
Output/inc/Module/CForceControl.h

@@ -13,9 +13,11 @@
  * 力控类,包含标定和测高功能
  * 标定:通过一系列操作得到力和电流之间的线性表达式
  * 注意:压合距离需要和测高时保持相同!!!!!!
+ * 疑问:寻压测高等应该先判断力控位置?
+ * 增加测试界面
  */
 
-#define BufferNo 6
+//#define BufferNo 6
 
 using namespace ns_db;
 
@@ -55,12 +57,12 @@ public:
      * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
      * 该函数只控制 Z 轴进行高度测试,不控制 XY 轴,使用前应先控制 XY 轴到位
      */
-    LONG HightTest(/*double force, */double givenForceZ, double searchPos, double& hight);
+    LONG HightTest(/*double force, */double givenForce, double searchPos, double& hight);
 
 
 
     //寻高
-    LONG FindForce(double searchForce, double actForce,double givenForceZ);
+    LONG FindForce(double actForce, double searchForce = 500, double givenForceZ = 4000);
 
     /**
      * @brief 顶针高度测试函数
@@ -97,6 +99,9 @@ public:
     //弹簧力控标定
     LONG SpringForceCalib();
 
+    //寻压力为0对应的电流
+    LONG FindZeroForceCurrent();
+
     /**
      * @brief 进行标定计算的函数
      * 该函数根据标定过程中获取的数据,计算力和电流之间的线性表达式
@@ -115,7 +120,7 @@ public:
      * @return 转换后的电流值
      * 该函数根据标定得到的线性表达式,将力值转换为对应的电流值
      */
-    double ChangeForceToCurrent(double force, double givenForceZ);
+    double ChangeForceToCurrent(double force, double givenForceZ = 4180);
 
     /**
      * @brief 电流值转换为力值的函数
@@ -127,7 +132,7 @@ public:
 
 
     //给定电流,转换力控到力控轴反馈位置
-    double ChangeForceToForcerZPos();
+    //double ChangeForceToForcerZPos();
 
     void Stop() { m_bStop = true; }
 
@@ -152,11 +157,8 @@ private:
     // 测高数据,不同的测高,只有搜索位置和搜索距离不同,力的大小通过传参
     int m_nHeadId = 0;  // 头部的 ID,用于标识不同的力控设备
     std::string m_sHeadName = "";
-    int m_nForcerBufferNO = 0;
-    int m_nSpringForcerBufferNO = 0;
+    int m_nForcerBufferNO = 6;
     string m_sParamName = "";
 
-
-
     bool m_bStop = false;
 };

+ 41 - 4
Output/inc/Module/CLookUpCalib.h

@@ -9,6 +9,36 @@ CTD
 2、保证已完成旋转中心标定。已经调用过SetHeadActualPos
 3、调用StartCalib开始标定
 */
+
+struct CALIB_LOOKUP_PARAM 
+{
+    //bool m_bHaveHeadPos = false;//已完成旋转中心标定	
+    double dCameraPosX = 0;;			//下视标定时X位置
+    double dCameraPosY = 0;			//下视标定时Y位置
+    double dCameraPosZ = 0;			//下视标定时Z位置
+
+    double dHeadPosX = 0;         //头位置X
+    double dHeadPosY = 0;         //头位置Y
+    double dHeadPosZ = 0;         //头位置Z
+
+    double dCameraToHeadPosX = 0;		//相机移动到头的相对位置
+    double dCameraToHeadPosY = 0;     //
+
+    double dHeadActualPosX = -1;
+    double dHeadActualPosY = -1;
+
+    double dCameraActualPosX = -1;    //标定相机和上视相机对准时,绑头获取的位置
+    double dCameraActualPosY = -1;    //标定相机和上视相机对准时,绑头获取的位置
+
+    int nBondTempID = 0;			//绑头相机拍Mark点模板ID
+    int nLookUpTempID = 0;		//上视相机拍Mark点模板ID
+    int nTipTempID = 0;        //上视相机拍吸嘴模板
+};
+
+
+
+
+
 class __declspec(dllexport) CCTDCalib :
     public CCalib
 {
@@ -91,17 +121,17 @@ public:
 
     //保存当前标定所使用的数据
     void SetLookUpTempID(int lookUpTemp) {
-        m_stParam.m_nLookUpTempID = lookUpTemp;
+        m_stLookUpParam.nLookUpTempID = lookUpTemp;
         SetParam();
     }
 
     void SetHeadTempID(int tempID) {
-        m_stParam.m_nBondTempID = tempID;
+        m_stLookUpParam.nBondTempID = tempID;
         SetParam();
     }
 
     void SetNozzleTempID(int temp) {
-        m_stParam.m_nTipTempID = temp;
+        m_stLookUpParam.nTipTempID = temp;
         SetParam();
     }
 
@@ -114,9 +144,16 @@ public:
 
     LONG MoveToHeadCalibPos();
 
+private:
+    void DataChangNotice(string strDbName, string strTableName);
+
 private:
     // 标定的查找参数结构体,用于存储标定过程中的各种参数和结果
-    CALIB_LOOKUP m_stParam;
+    //CALIB_LOOKUP m_stParam;
+
+    std::vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
+
+    CALIB_LOOKUP_PARAM m_stLookUpParam;
     // 上视相机对象指针,用于进行拍照操作
     CCameraBase* m_pLookUpCamera = nullptr;
     CXYCalib* m_pHeadCameraXYCalib = nullptr;

+ 1 - 0
Output/inc/Module/CMachineCalibration.h

@@ -21,6 +21,7 @@ namespace ns_db
 #endif
 
 #define MACHINE_CALIBRATION_DATABASE_NAME			    ROOT_PATH##"\\db\\MachineCalibration.db"
+
 #define CTD_CALIB_TABLE_NAME		                    "Calib_CameraTipDis"
 #define XY_CALIB_TABLE_NAME		                        "Calib_XY"
 #define R_CALIB_TABLE_NAME		                        "Calib_R"

+ 33 - 9
Output/inc/Module/CManageDB.h

@@ -19,6 +19,30 @@ using namespace std;
 
 namespace ns_db
 {
+    const static std::map<std::string, std::string> g_mapDatabaseList = {
+        {MODULECONFIG_DATABASE_NAME ,  BONDHEAD_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  WAFERHEAD_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  WAFFLEHEAD_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  EJECTOR_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  WAFERTABLE_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  WAFER_CALIB_TABLE_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME	},
+        {MODULECONFIG_DATABASE_NAME ,  BOND_TABLE_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  NOZZLE_TABLE_CONFIG_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  HARDWARE_SWICH_TABLE_NAME},
+        {MODULECONFIG_DATABASE_NAME ,  ULTRAHEAD_TABLE_NAME	},
+        {MODULECONFIG_DATABASE_NAME ,  ULTRAHEAD_DIAGNOSIS_TABLE_NAME},
+
+        {CALIBCONFIG_DATABASE_NAME , CALIB_CTD_TABLE_NAME},
+        {CALIBCONFIG_DATABASE_NAME , CALIB_XY_TABLE_NAME},
+        {CALIBCONFIG_DATABASE_NAME , CALIB_R_TABLE_NAME	},
+        {CALIBCONFIG_DATABASE_NAME , CALIB_STEP_R_RESULT_TABLE_NAME},
+        {CALIBCONFIG_DATABASE_NAME , FORCE_CONTROL_TABLE_NAME },
+        {CALIBCONFIG_DATABASE_NAME , HORIZONTAL_MEASURE_TABLE_NAME },
+        {CALIBCONFIG_DATABASE_NAME , VERTICAL_MEASURE_TABLE_NAME},
+        {CALIBCONFIG_DATABASE_NAME , CALIB_TIP_RESULT}
+
+    };
 
     class __declspec(dllexport) CManageDB
     {
@@ -38,17 +62,17 @@ namespace ns_db
         CMachineCalibration* GetCMachineCalibration() { return m_pCMachineCalibration; };
         CSecurity* GetCSecurity() { return m_pCSecurity; };
         CCalibrationConfig* GetCCalibrationConfig() { return m_pCCalibrationConfig; };
-
+        std::string GetDbNameByTableName(std::string strTableName);
     private:
         static vector<CDataBaseOperate*> m_vecDataBase;
-        CHardware* m_pCHardware;
-        CSecurity* m_pCSecurity;
-        CStatisticCounters* m_pCStatisticCounters;
-        CProduct* m_pCProduct;
-        CMachineSetup* m_pCMachineSetup;
-        CModuleConfig* m_pCModuleConfig;
-        CMachineCalibration* m_pCMachineCalibration;
-        CCalibrationConfig* m_pCCalibrationConfig;
+        CHardware* m_pCHardware = nullptr;
+        CSecurity* m_pCSecurity = nullptr;
+        CStatisticCounters* m_pCStatisticCounters = nullptr;
+        CProduct* m_pCProduct = nullptr;
+        CMachineSetup* m_pCMachineSetup = nullptr;
+        CModuleConfig* m_pCModuleConfig = nullptr;
+        CMachineCalibration* m_pCMachineCalibration = nullptr;
+        CCalibrationConfig* m_pCCalibrationConfig = nullptr;
 
         string m_strCurrentProgramPath;
 

+ 26 - 1
Output/inc/Module/CModuleConfig.h

@@ -31,8 +31,22 @@ namespace ns_db
 #define NOZZLE_TABLE_CONFIG_TABLE_NAME				"NozzleTable"
 #define HARDWARE_SWICH_TABLE_NAME					"HardwareSwich"
 #define ULTRAHEAD_TABLE_NAME						"UltraHead"
-
+#define ULTRAHEAD_DIAGNOSIS_TABLE_NAME				"UltraHead_Diagnosis"
 	
+	const static std::string g_mapModuleConfigDbList[] = {
+		BONDHEAD_CONFIG_TABLE_NAME,
+		WAFERHEAD_CONFIG_TABLE_NAME,
+		WAFFLEHEAD_CONFIG_TABLE_NAME,
+		EJECTOR_CONFIG_TABLE_NAME,
+		WAFERTABLE_CONFIG_TABLE_NAME,
+		WAFER_CALIB_TABLE_CONFIG_TABLE_NAME,
+		WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME,
+		BOND_TABLE_CONFIG_TABLE_NAME,
+		NOZZLE_TABLE_CONFIG_TABLE_NAME,
+		HARDWARE_SWICH_TABLE_NAME,
+		ULTRAHEAD_TABLE_NAME,
+		ULTRAHEAD_DIAGNOSIS_TABLE_NAME
+	};
 
 	class DLL_MODULE_CONFIG_API CModuleConfig : public CDataBaseOperate
 	{
@@ -178,6 +192,17 @@ private:
 		LONG SetConfigParam_UltraHead(vector<MODULE_CONFIG_STRUCT> vecconfig);
 #pragma endregion
 
+#pragma region UltraHead_Diagnosis
+	private:
+		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_UltraHeadDiagnosis;
+	public:
+		LONG GetConfigParam_UltraHeadDiagnosis(vector<MODULE_CONFIG_STRUCT>* vecconfig);
+		vector<CONFIG_BASE_STRUCT> GetConfigParam_UltraHeadDiagnosis() { return m_vecConfig_UltraHeadDiagnosis; };
+		LONG SetConfigParam_UltraHeadDiagnosis(vector<CONFIG_BASE_STRUCT> vecconfig);
+		LONG SetConfigParam_UltraHeadDiagnosis(vector<MODULE_CONFIG_STRUCT> vecconfig);
+#pragma endregion
+
+
 	};
 
 

+ 2 - 0
Output/inc/Module/CPrStrategy.h

@@ -30,6 +30,8 @@ namespace ns_pr
         CAxis* m_pAxisZ = nullptr; // Z 轴对象指针
         CAxis* m_pAxisR = nullptr; // R 轴对象指针
         vector<CAMERA_CALIB_STRUCT> m_VecCamera; // 相机校准结构体向量
+
+        int m_imageNum = 0;
     public:
         CPRStrategy();
         /**

+ 34 - 7
Output/inc/Module/CRCalib.h

@@ -6,10 +6,28 @@
  * 继承自 CCalib 的 R 轴标定类,用于实现 R 轴的标定功能
  *  1、需要先完成九点标定
  */
+
+
+
+struct CALIB_R_PARAM {
+    double dCalibPosX = 0;
+    double dCalibPosY = 0;
+    double dGrabPosZ = 0;                                     //拍照位
+    int nTempId = 0;
+    double dStartAngle = -40;                                 //标定时角度下限
+    double dEndAngle = 40;                                  //标定时角度上限
+    int nRotationNum = 10;                                     //旋转次数
+
+    XY_DOUBLE_STRUCT stRotateCenter = { 0,0 };                //旋转中心
+    double dRad = 0;                                              //旋转半径
+};
+
+
+//离线模式
 class __declspec(dllexport) CRCalib : public CCalib {
 public:
     /**
-     * @enum RCalibType
+     * @enum RCalibType 
      * @brief 定义 R 轴标定的类型
      */
     enum RCalibType {
@@ -55,11 +73,11 @@ public:
      */
     LONG GetCenter(XY_DOUBLE_STRUCT& center) {
         // 检查旋转中心坐标是否为 (0, 0),如果是则返回 FAIL
-        if (m_stCalibR.m_stRotateCenter.x == 0 && m_stCalibR.m_stRotateCenter.y == 0) {
+        if (m_stCalibParam_R.stRotateCenter.x == 0 && m_stCalibParam_R.stRotateCenter.y == 0) {
             return FAIL;
         }
         // 将旋转中心坐标赋值给输出参数
-        center = m_stCalibR.m_stRotateCenter;
+        center = m_stCalibParam_R.stRotateCenter;
         return OK;
     }
 
@@ -97,7 +115,7 @@ public:
 	
     //设置旋转中心
     void SetCenter(XY_DOUBLE_STRUCT center) { 
-        m_stCalibR.m_stRotateCenter = center; 
+        m_stCalibParam_R.stRotateCenter = center;
         SetParam();
     }
 
@@ -108,22 +126,31 @@ public:
 
     //保存当前标定所使用的数据
     void SetTempID(int tempID) { 
-        m_stCalibR.m_nTempId = tempID; 
+        m_stCalibParam_R.nTempId = tempID;
         SetParam();
     }
 
     //获得标定参数
-    CALIB_R GetCalibParam() { return m_stCalibR; }
+    CALIB_R_PARAM GetCalibParam() { return m_stCalibParam_R; }
 
     LONG MoveToCalibPos();
 
+    LONG CalibTest();
+
+
+private:
+    void DataChangNotice(string strDbName, string strTableName);
+
 private:
     const int ROT_NUM = 8;  // 旋转拍照的次数
 
+    vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
+
     vector<Point2D> m_vetRotatinPoints;  // 旋转拍照结果,存储旋转后的点坐标
     vector<double> m_vetRadius;          // 结果半径,用于插值计算
     vector<double> m_vetAngle;           // 结果角度,用于插值计算
-    CALIB_R m_stCalibR;                  // R 轴标定的相关参数结构体
+    //CALIB_R m_stCalibR;                  // R 轴标定的相关参数结构体
+    CALIB_R_PARAM m_stCalibParam_R;
 
     RCalibType m_calibType = RotationCenterCalib;  // 标定方式,默认为旋转中心标定
     //DOUBLE m_dAngleStep = 1;                        // 标定时旋转角度,角度单位

+ 5 - 2
Output/inc/Module/CResources.h

@@ -41,12 +41,15 @@ class DB_RESCOURCES_DLL_API CResources
 private:
 	CResources();
 	~CResources();
+
+	const BOND_DIR m_BondMatrixSearchDie = BOND_DIR::OrderAndS;
+
 public:
 	static CResources* GetInstance();
 	static void releaseInstance();
 
-	void GetParam();
-	void SetParam();
+	long GetParam();
+	long SetParam();
 
 	//¹¤ÒÕµ¥
 	std::map<int, std::vector<int>> GetStepMap(int productID);

+ 4 - 3
Output/inc/Module/CUltraHead.h

@@ -22,6 +22,9 @@ public:
     void SetUltraDo(CIO* output) { m_pUltraIO = output; }
     LONG AllocateIo(vector<CIO*> vecIo);
 
+    CManageDB* m_pCManageDB = nullptr;
+    CModuleConfig* GetModuleConfig() { return m_pModuleConfigDB; };
+
     virtual void SetDataChangFunction() override;
     virtual LONG SetParam() override;
     virtual LONG GetParam() override;
@@ -32,9 +35,7 @@ public:
 
     virtual void SetPickHTestIndex(int index);
     virtual void SetBondHTestIndex(int index);
-    virtual LONG PickHighTest();//调用之前先SetIndex
     virtual LONG AllBondHighTest();
-    virtual LONG BongHighTest();
     //virtual LONG VacuumOn();		//真空开
     //virtual LONG VacuumOff();		//真空关
     //virtual LONG StrongOn();		//强吹开
@@ -48,7 +49,7 @@ public:
     LONG LookUpGrab(int index,X_Y_ANGLE_STRUCT& result);//移动到上视拍照位,拍照结果放到结构体中
     //吸嘴固晶
     LONG PlaceDie(int index, X_Y_ANGLE_STRUCT lookUpOffsetPixel);
-    LONG MoveToBondPos(int index);
+    LONG MoveToBondGrabPos(int index);
     LONG BondGrab(int index, X_Y_ANGLE_STRUCT& result); //返回的拍照结果为物理单位
     LONG ToBondPos_AddOffset(int index, X_Y_ANGLE_STRUCT bondOffset, X_Y_ANGLE_STRUCT lookUpOffset, bool waitDone = true);//传入物理位置
     LONG BondDieDown(int index);//传入物理位置

+ 32 - 0
Output/inc/Module/CUltraHeadDiagnosis.h

@@ -0,0 +1,32 @@
+#pragma once
+#include "CUltraHead.h"
+
+#ifdef ULTRAHEAD_DIAGNOSIS_EXPORTS
+#define ULTRAHEAD_DIAGNOSIS_DLL_API __declspec(dllexport)
+#else
+#define ULTRAHEAD_DIAGNOSIS_DLL_API //__declspec(dllimport)
+#endif
+
+class ULTRAHEAD_DIAGNOSIS_DLL_API CUltraHeadDiagnosis
+{
+public:
+    typedef struct 
+    {
+        bool bMoveX;
+        bool bMoveY;
+        bool bMoveZ;
+    }XY_ACCURACY_TEST;
+private:
+    CUltraHead *m_pCUltraHead;
+    vector<MODULE_CONFIG_STRUCT> m_vecConfig;
+
+    XY_ACCURACY_TEST m_XY_AccuracyTestParam;
+
+    LONG SetParam();
+    LONG GetParam();
+public:
+    CUltraHeadDiagnosis(CUltraHead* pUltraHeade);
+
+    LONG Diagnosis(string cmd);
+};
+

+ 12 - 8
Output/inc/Module/CXYCalib.h

@@ -8,7 +8,7 @@
 */
 
 //using namespace JVision;
-using namespace std;
+
 
 struct CALIB_XY_PARAM {
     double dCenterPosX = 0;               //九点中间点的X坐标
@@ -34,7 +34,7 @@ public:
      * @param id 标定的唯一标识符
      * @param name 标定的名称
      */
-    CXYCalib(int id, string name);
+    CXYCalib(int id, std::string name);
 
     /**
      * @brief 析构函数,用于销毁CXYCalib对象
@@ -90,18 +90,22 @@ public:
     //CALIB_XY GetCalibParam() { return m_stCalibXYParam; }
 
     //获取拍照后的九点像素坐标
-    vector<JVision::Point2D> GetNinePixel() { return m_pixels; }
+    std::vector<JVision::Point2D> GetNinePixel() { return m_pixels; }
 
     //获取九点物理坐标
-    vector<JVision::Point2D> GetNinePosition() { return m_positions; }
+    std::vector<JVision::Point2D> GetNinePosition() { return m_positions; }
 
     LONG MoveToCalibPos();
+
+    LONG CalibTest(int tempId = -1);
 private:
     /**
      * @brief 计算九个标定位置的坐标
      */
     void calNinePoints();
 
+    void DataChangNotice(string strDbName, string strTableName);
+
     // 定义一个函数来执行二维仿射变换
     //XY_DOUBLE_STRUCT affineTransform(XY_DOUBLE_STRUCT p) {
     //    CManageDB::GetInstance()->GetCMachineCalibration()->GetCalibXYParam(m_nID, m_sName, m_stCalibXYParam);
@@ -119,15 +123,15 @@ private:
     //CALIB_XY m_stCalibXYParam;
     CALIB_XY_PARAM  m_stCalibParam_XY;
     // 存储9个标定位置的物理坐标
-    vector<JVision::Point2D> m_positions;
+    std::vector<JVision::Point2D> m_positions;
 
     //存储九个相对位置,即步长
-    vector<JVision::Point2D> m_relativePositions;
+    std::vector<JVision::Point2D> m_relativePositions;
 
     // 存储9个标定位置对应的像素坐标
-    vector<JVision::Point2D> m_pixels;
+    std::vector<JVision::Point2D> m_pixels;
 
     // 存储9个标定位置对应的相对像素坐标
-    vector<JVision::Point2D> m_relativePixels;
+    std::vector<JVision::Point2D> m_relativePixels;
 };
 

+ 12 - 4
Output/inc/Module/JAxis.h

@@ -8,7 +8,7 @@
 #include "AxisPara.h"
 #include <Windows.h>
 //使用类型擦除方式
-#include <any>
+//#include <any>
 /*
  * 接口设计原则
  * 1、只定义外部接口,Axis内部使用接口不计入
@@ -280,6 +280,8 @@ public:
 
     //运行驱动器中的脚本
     virtual int RunBuffer(int nBufferNo)=0;
+    //关闭驱动器中的脚本
+    virtual int StopBuffer(int nBufferNo)=0;
 
     /*-------------------------
      * 轴运动
@@ -289,10 +291,16 @@ public:
     //模板类型
 
     // template <typename T>
-    virtual int WriteSerialValue(std::string sSerial,std::any tValue)=0;
+    //virtual int WriteSerialValueF(std::string sSerial,std::any tValue)=0;
+    virtual int WriteSerialValueN(std::string sSerial,int nValue)=0;
+    virtual int WriteSerialValueF(std::string sSerial,double dValue)=0;
 
-    //virtual int WriteSerialValue(std::string sSerial)=0;
-    virtual int WriteSockValue(std::string sSerial,std::any tValue)=0;
+    //virtual int WriteSerialValueF(std::string sSerial)=0;
+    //virtual int WriteSockValue(std::string sSerial,std::any tValue)=0;
+    virtual int WriteSockValueN(std::string sSerial,int nValue)=0;
+    virtual int WriteSockValueF(std::string sSerial,double dValue)=0;
+
+    virtual int WriteSockCommand(std::string sSerial)=0;
 
     //设置软使能状态
     virtual int SetAxisSoftEnable(bool bEnable) = 0;

+ 3 - 0
Output/inc/Module/TipMatrix.h

@@ -35,6 +35,9 @@ namespace ns_mat
 		LONG GetBHLowCameraToNozzle(int index, XY_DOUBLE_STRUCT& dis);
 		LONG SetBHLowCameraToNozzle(int index, XY_DOUBLE_STRUCT CameraToNozzle);
 
+		LONG GetBHLowNozzleToCamera(int index, XY_DOUBLE_STRUCT& dis);
+		LONG SetBHLowNozzleToCamera(int index, XY_DOUBLE_STRUCT CameraToNozzle);
+
 		LONG GetWHCameraToNozzle(int index, XY_DOUBLE_STRUCT& cameraToNozzle);
 		LONG SetWHCameraToNozzle(int index, XY_DOUBLE_STRUCT cameraToNozzle);
 

BIN
Output/lib/x64/Common.lib


BIN
Output/lib/x64/Control.lib


BIN
Output/lib/x64/Module.lib


+ 1 - 0
View/die-bonder-ui/OriginalWnd/ChartsAndCamerasWnd.h

@@ -10,6 +10,7 @@
 #include "CameraMaterialGroupWnd/MaterialWindow/Waffle.h"
 #include "CameraMaterialGroupWnd/MaterialWindow/MaterialBox.h"
 #include "JOriginalMainWnd.h"
+#include "CameraMaterialGroupWnd/MaterialWindow/Bond.h"
 
 namespace Ui {
 class ChartsAndCamerasWnd;

+ 153 - 156
View/die-bonder-ui/OriginalWnd/DbTreeViewManager.cpp

@@ -5,63 +5,48 @@
 #include <QTextStream>
 #include <QDateTime>
 #include "Src/common/JMessageTip.h"
+#include "Src/common/JLogAllOutput.h"
 #include "CViewInterface.h"
 
 // 构造函数
-DbTreeViewManager::DbTreeViewManager(OriginalWnd* originalWnd, QWidget* widget2, QWidget* parent)
+DbTreeViewManager::DbTreeViewManager(QWidget* pOriginalWndMenuPage, QWidget* parent)
     : QWidget(parent),
-    m_originalWnd(originalWnd),
-    widget2(widget2),
-    treeViewDown(new QTreeView(this)),
-    model(new QStandardItemModel(this)),
-    restoring(false),
-    m_blockItemChanged(false)
-
+    m_pOriginalWndMenuPage(pOriginalWndMenuPage)
 {
-    if (!widget2) {
-        // qWarning() << "DbTreeViewManager: widget2 未初始化";
-        return;
-    }
-
-    
-    //设置样式
-
-
-    //创建数据库对象
-    m_sqlOper = &SqlOperation::GetInstance();
-
+    m_originalWnd = dynamic_cast<OriginalWnd*>(parent);
+    Init();
 
     // 设置模型
-    treeViewDown->setModel(model);
-    treeViewDown->setHeaderHidden(true);
-    treeViewDown->setEditTriggers(QAbstractItemView::NoEditTriggers);
+    m_pTreeViewDown->setModel(m_pCModel);
+    m_pTreeViewDown->setHeaderHidden(true);
+    m_pTreeViewDown->setEditTriggers(QAbstractItemView::NoEditTriggers);
 
     // 设置树视图的几何位置
-    treeViewDown->setGeometry(16, 106, widget2->width() - 16, widget2->height() - 106);
+    m_pTreeViewDown->setGeometry(16, 106, m_pOriginalWndMenuPage->width() - 16, m_pOriginalWndMenuPage->height() - 106);
 
     // 安装事件过滤器以自定义绘制虚线
-    treeViewDown->viewport()->installEventFilter(this);
+    m_pTreeViewDown->viewport()->installEventFilter(this);
 
     // 创建统一分隔线
-    lineFrame1 = createUnifiedSeparator(widget2, 2);
-    lineFrame1->setGeometry(16, 100, 460, 2);
+    m_pLineFrame1 = createUnifiedSeparator(m_pOriginalWndMenuPage, 2);
+    m_pLineFrame1->setGeometry(16, 100, 460, 2);
 
     // 创建按钮并设置布局
     setupButton();
 
     // 创建导航栏
-    navigationWidget = new QWidget(widget2);
-    navigationWidget->setGeometry(15, 15, 300, 74);
+    m_pNavigationWidget = new QWidget(m_pOriginalWndMenuPage);
+    m_pNavigationWidget->setGeometry(15, 15, 300, 74);
 
     // 连接目录前的复选框信号与槽
-    connect(model, &QStandardItemModel::itemChanged, this, &DbTreeViewManager::onItemChanged);
+    connect(m_pCModel, &QStandardItemModel::itemChanged, this, &DbTreeViewManager::onItemChanged);
 
     // 目录树连接点击信号
-    connect(treeViewDown, &QTreeView::clicked, this, &DbTreeViewManager::onTreeViewClicked);
+    connect(m_pTreeViewDown, &QTreeView::clicked, this, &DbTreeViewManager::onTreeViewClicked);
 
     // 连接目录 expanded 和 collapsed 信号
-    connect(treeViewDown, &QTreeView::expanded, this, [=](const QModelIndex &index) {
-        QStandardItem *item = model->itemFromIndex(index);
+    connect(m_pTreeViewDown, &QTreeView::expanded, this, [=](const QModelIndex &index) {
+        QStandardItem *item = m_pCModel->itemFromIndex(index);
         if (!item) return;
 
         QStringList path = buildItemPath(item);
@@ -72,8 +57,8 @@ DbTreeViewManager::DbTreeViewManager(OriginalWnd* originalWnd, QWidget* widget2,
         saveExpandedPaths();
     });
 
-    connect(treeViewDown, &QTreeView::collapsed, this, [=](const QModelIndex &index) {
-        QStandardItem *item = model->itemFromIndex(index);
+    connect(m_pTreeViewDown, &QTreeView::collapsed, this, [=](const QModelIndex &index) {
+        QStandardItem *item = m_pCModel->itemFromIndex(index);
         if (!item) return;
 
         QStringList path = buildItemPath(item);
@@ -88,7 +73,7 @@ DbTreeViewManager::DbTreeViewManager(OriginalWnd* originalWnd, QWidget* widget2,
 
     // 所有展开操作完成后更新分隔线
     QTimer::singleShot(0, this, [=]() {
-        QStandardItem *rootItem = model->invisibleRootItem();
+        QStandardItem *rootItem = m_pCModel->invisibleRootItem();
         QStandardItem *thirdItem = findFirstThirdLevelItemDFS(rootItem);
         if (thirdItem)
         {
@@ -110,7 +95,7 @@ DbTreeViewManager::DbTreeViewManager(OriginalWnd* originalWnd, QWidget* widget2,
     });
 
     // 应用自定义只读复选框委托
-    treeViewDown->setItemDelegate(new NonInteractiveCheckDelegate(treeViewDown));
+    m_pTreeViewDown->setItemDelegate(new NonInteractiveCheckDelegate(m_pTreeViewDown));
     menuArray[0] = {2, false,-1};
     menuArray[1] = {5, false,-1};
     menuArray[2] = {3, false,-1};
@@ -124,6 +109,14 @@ DbTreeViewManager::~DbTreeViewManager()
   
 }
 
+void DbTreeViewManager::Init()
+{
+    m_pTreeViewDown = new QTreeView(this);
+    m_pCModel       = new QStandardItemModel(this);
+
+    m_sqlOper       = &SqlOperation::GetInstance();
+}
+
 // 创建横线样式
 QFrame* DbTreeViewManager::createUnifiedSeparator(QWidget *parent, int height)
 {
@@ -137,7 +130,7 @@ QFrame* DbTreeViewManager::createUnifiedSeparator(QWidget *parent, int height)
 
 // 目录树样式
 void DbTreeViewManager::applyCustomStyles() {
-    treeViewDown->setStyleSheet(R"(
+    m_pTreeViewDown->setStyleSheet(R"(
         /* 设置分支图标 */
         QTreeView::branch:closed:has-children {
             border-image: none;
@@ -208,7 +201,11 @@ bool DbTreeViewManager::hasPrivilege(const int &UserGrade, const int &userPrivil
 
 void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
 {
-    qDebug() << "Initializing tree with configId:" << name << "and userPrivilege:" << userPrivilege;
+    QString strLog = "Initializing tree with configId:";
+    strLog += name;
+    strLog += "and userPrivilege:";
+    strLog += userPrivilege;
+    JLogAllOutput::cmd_debug(strLog.toStdString());
 
     m_currentConfigName = name;  // 设置当前配置ID
     // 先清空历史
@@ -216,13 +213,13 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
 
     // 保存之前的选中/展开状态
     m_blockItemChanged = true;
-    restoring = true;
+    m_isRestoring = true;
 
     // 清理当前的分隔线
     clearAllSeparators();
 
     // 清空已有模型数据和相关记录
-    model->clear();
+    m_pCModel->clear();
     firstLevelSeparators.clear();
     expandedPaths.clear();
 
@@ -230,30 +227,30 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
     clearThirdLevelMenu();
 
     // **Home 界面逻辑**
-    if (name == "Home") {
-
+    if (name == "Home") 
+    {
         // 隐藏目录树和分隔线
-        treeViewDown->hide();
-
-        for (auto separator : firstLevelSeparators) {
+        m_pTreeViewDown->hide();
+        for (auto separator : firstLevelSeparators) 
+        {
             if (separator)
+            {
                 separator->hide();
+            }
         }
         // 隐藏导航栏
-        navigationWidget->hide();
+        m_pNavigationWidget->hide();
 
         // 隐藏按钮
         updateButtonsVisibility(); // 将按钮隐藏
 
         // 隐藏特定的分隔线 lineFrame1
-        if (lineFrame1) {
-            lineFrame1->hide();
+        if (m_pLineFrame1) 
+        {
+            m_pLineFrame1->hide();
         }
 
         // 从 BondHead 和 Buttons 表中加载 DirectoryId = 1 的数据
-
-
-
         QList<Table_Control_Data> tableControlDatas;
         bool allChangeFlag = false;
         m_sqlOper->GetThirdDirControlData("HomeProduct", userPrivilege, tableControlDatas, allChangeFlag);
@@ -275,9 +272,9 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
     } else {
         // **其他配置逻辑**
         // 设置 treeViewDown 的几何位置
-        treeViewDown->setGeometry(16, 106, widget2->width() - 16, widget2->height() - 106);
+        m_pTreeViewDown->setGeometry(16, 106, m_pOriginalWndMenuPage->width() - 16, m_pOriginalWndMenuPage->height() - 106);
         // 显示目录树和分隔线
-        treeViewDown->show();
+        m_pTreeViewDown->show();
         for (auto separator : firstLevelSeparators) {
             if (separator)
                 separator->show();
@@ -286,14 +283,14 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
         applyCustomStyles();
 
         // 显示导航栏
-        navigationWidget->show();
+        m_pNavigationWidget->show();
 
         // 显示按钮
         updateButtonsVisibility();
 
         // 显示特定的分隔线 lineFrame1
-        if (lineFrame1) {
-            lineFrame1->show();
+        if (m_pLineFrame1) {
+            m_pLineFrame1->show();
         }
 
         // 加载目录数据 并进行权限判断
@@ -309,7 +306,7 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
 
         m_blockItemChanged = false;
 
-        restoring = false;
+        m_isRestoring = false;
 
         // qDebug() << "Tree initialization completed.";
 
@@ -320,10 +317,10 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
         loadCheckedPaths();
 
         // 自动选中第一个根目录项并更新导航栏
-        QStandardItem *rootItem = model->invisibleRootItem()->child(0);
+        QStandardItem *rootItem = m_pCModel->invisibleRootItem()->child(0);
         if (rootItem) {
-            QModelIndex rootIndex = model->indexFromItem(rootItem);
-            treeViewDown->setCurrentIndex(rootIndex);
+            QModelIndex rootIndex = m_pCModel->indexFromItem(rootItem);
+            m_pTreeViewDown->setCurrentIndex(rootIndex);
             updateNavigationBar(rootIndex);
 
             // 如果当前根目录是三级目录,则加载其字段内容
@@ -385,7 +382,7 @@ void DbTreeViewManager::initializeTree(QString name, const int &userPrivilege)
         //寻找第一个三级目录,显示第一个三级目录的按钮
 
         // 自动找第一个三级目录
-        QStandardItem *rootItem1 = model->invisibleRootItem();
+        QStandardItem *rootItem1 = m_pCModel->invisibleRootItem();
         QStandardItem *firstThirdItem = findFirstThirdLevelItemDFS(rootItem1);
         if (!firstThirdItem) {
             // qDebug() << "[initializeTree] No third-level item found, do nothing.";
@@ -528,13 +525,13 @@ void DbTreeViewManager::buildTreeFromDirectories(const QList<QJsonObject> &direc
 
         if (parentId == -1) {
             // 说明这是一级目录
-            model->invisibleRootItem()->appendRow(childItem);
+            m_pCModel->invisibleRootItem()->appendRow(childItem);
             qDebug() << " !!!!! first :" << "child : " << currentId;
 
 
             // 如果一级目录的 "Separator" == 1,则为其创建一条分割线
             if (dir["Separator"].toInt() == 1) {
-                QFrame *sep = createUnifiedSeparator(widget2, 2);
+                QFrame *sep = createUnifiedSeparator(m_pOriginalWndMenuPage, 2);
                 sep->hide();
                 firstLevelSeparators.insert(childItem, sep);
             }
@@ -696,13 +693,13 @@ void DbTreeViewManager::buildTreeFromDirectories(const QList<QJsonObject> &direc
 bool DbTreeViewManager::eventFilter(QObject *watched, QEvent *event)
 {
     // 拦截 Paint 事件
-    if (watched == treeViewDown->viewport() && event->type() == QEvent::Paint)
+    if (watched == m_pTreeViewDown->viewport() && event->type() == QEvent::Paint)
     {
         // 进行默认绘制
         bool handled = QWidget::eventFilter(watched, event);
 
         // 使用 QPainter 叠加画“拐角线”
-        QPainter painter(treeViewDown->viewport());
+        QPainter painter(m_pTreeViewDown->viewport());
         if (!painter.isActive()) {
             qWarning() << "Painter not active";
             return handled;
@@ -725,11 +722,11 @@ bool DbTreeViewManager::eventFilter(QObject *watched, QEvent *event)
 // 递归绘制所有分支
 void DbTreeViewManager::paintAllBranches(const QModelIndex &parentIndex, QPainter &painter)
 {
-    int rowCount = model->rowCount(parentIndex);
+    int rowCount = m_pCModel->rowCount(parentIndex);
     for(int i = 0; i < rowCount; ++i)
     {
         // 当前子节点
-        QModelIndex childIndex = model->index(i, 0, parentIndex);
+        QModelIndex childIndex = m_pCModel->index(i, 0, parentIndex);
         if (!childIndex.isValid()) continue;
 
         // 1) 父->子拐角线
@@ -751,12 +748,12 @@ void DbTreeViewManager::drawParentChildLine(const QModelIndex &childIndex, QPain
     QModelIndex parentIndex = childIndex.parent();
     if (!parentIndex.isValid()) {
         // “顶层节点”定义一个固定的起点 (rootX, rootY)
-        int indent = treeViewDown->indentation();
+        int indent = m_pTreeViewDown->indentation();
         int depth = 0;  // 顶层节点深度为0
         int branchX = (depth + 1) * indent - indent / 2; // 计算 branchX 基于缩进和深度
 
         // 定义 rootY 为节点中心 Y
-        QRect childRect = treeViewDown->visualRect(childIndex);
+        QRect childRect = m_pTreeViewDown->visualRect(childIndex);
         if (!childRect.isValid())
             return;
 
@@ -778,8 +775,8 @@ void DbTreeViewManager::drawParentChildLine(const QModelIndex &childIndex, QPain
         return;
     }
 
-    QRect parentRect = treeViewDown->visualRect(parentIndex);
-    QRect childRect  = treeViewDown->visualRect(childIndex);
+    QRect parentRect = m_pTreeViewDown->visualRect(parentIndex);
+    QRect childRect  = m_pTreeViewDown->visualRect(childIndex);
     if (!parentRect.isValid() || !childRect.isValid()) {
         // 父或子超出可视区域
         return;
@@ -796,7 +793,7 @@ void DbTreeViewManager::drawParentChildLine(const QModelIndex &childIndex, QPain
         p = p.parent();
     }
 
-    int indent = treeViewDown->indentation();
+    int indent = m_pTreeViewDown->indentation();
     int branchX = depth * indent - indent / 2;
 
     // branchX 不超出视图范围
@@ -825,14 +822,14 @@ void DbTreeViewManager::drawSiblingLine(const QModelIndex &childIndex, QPainter
 
     // 下一个兄弟
     int row       = childIndex.row();
-    int lastRow   = model->rowCount(parentIndex) - 1;
+    int lastRow   = m_pCModel->rowCount(parentIndex) - 1;
     if (row >= lastRow) {
         return; // 说明是最后一个兄弟,不用画延伸线
     }
 
-    QModelIndex nextSibling = model->index(row + 1, 0, parentIndex);
-    QRect currRect = treeViewDown->visualRect(childIndex);
-    QRect nextRect = treeViewDown->visualRect(nextSibling);
+    QModelIndex nextSibling = m_pCModel->index(row + 1, 0, parentIndex);
+    QRect currRect = m_pTreeViewDown->visualRect(childIndex);
+    QRect nextRect = m_pTreeViewDown->visualRect(nextSibling);
     if (!currRect.isValid() || !nextRect.isValid()) {
         return;
     }
@@ -845,7 +842,7 @@ void DbTreeViewManager::drawSiblingLine(const QModelIndex &childIndex, QPainter
         p = p.parent();
     }
 
-    int indent = treeViewDown->indentation();
+    int indent = m_pTreeViewDown->indentation();
     int branchX = depth * indent - indent / 2;
 
     // 确保 branchX 不超出视图范围
@@ -892,7 +889,7 @@ QStandardItem* DbTreeViewManager::findFirstThirdLevelItemDFS(QStandardItem *pare
 
 void DbTreeViewManager::onItemChanged(QStandardItem *item)
 {
-    if (m_blockItemChanged || restoring) {
+    if (m_blockItemChanged || m_isRestoring) {
         return; // 防止递归和恢复期间触发
     }
 
@@ -913,7 +910,7 @@ void DbTreeViewManager::onItemChanged(QStandardItem *item)
     // 更新所有父项的复选框状态
     QModelIndex parentIndex = item->index().parent();
     while (parentIndex.isValid()) {
-        QStandardItem *parentItem = model->itemFromIndex(parentIndex);
+        QStandardItem *parentItem = m_pCModel->itemFromIndex(parentIndex);
         if (!parentItem) break;
 
         int checkedCount = 0;
@@ -1035,7 +1032,7 @@ void DbTreeViewManager::loadpage(const int &configId){
 
 void DbTreeViewManager::onTreeViewClicked(const QModelIndex &index)
 {
-    QStandardItem *item = model->itemFromIndex(index);
+    QStandardItem *item = m_pCModel->itemFromIndex(index);
     if (!item) return;
     // 是否第三层,提取第三层的目录ID及目录表格名字
     bool isThird = false;
@@ -1126,7 +1123,7 @@ void DbTreeViewManager::onTreeViewClicked(const QModelIndex &index)
 }
 
 void DbTreeViewManager::onTreeViewClicked_updown(const QModelIndex &index){
-    QStandardItem *item = model->itemFromIndex(index);
+    QStandardItem *item = m_pCModel->itemFromIndex(index);
     if (!item) return;
     // 是否第三层
     bool isThird = false;
@@ -1211,22 +1208,22 @@ void DbTreeViewManager::onTreeViewClicked_updown(const QModelIndex &index){
 
 void DbTreeViewManager::updateNavigationBar(const QModelIndex &index)
 {
-    QStandardItem *item = model->itemFromIndex(index);
+    QStandardItem *item = m_pCModel->itemFromIndex(index);
     if (!item) {
         qWarning() << "导航栏更新失败:未找到对应项";
         return;
     }
 
     // 清理现有布局
-    if (navigationWidget->layout()) {
+    if (m_pNavigationWidget->layout()) {
         QLayoutItem *child;
-        while ((child = navigationWidget->layout()->takeAt(0)) != nullptr) {
+        while ((child = m_pNavigationWidget->layout()->takeAt(0)) != nullptr) {
             if (child->widget()) {
                 child->widget()->deleteLater();
             }
             delete child;
         }
-        delete navigationWidget->layout();
+        delete m_pNavigationWidget->layout();
     }
 
     // 构建路径列表,从当前项回溯到根节点
@@ -1260,14 +1257,14 @@ void DbTreeViewManager::updateNavigationBar(const QModelIndex &index)
         font.setBold(true);         // 设置文字为粗体
         font.setLetterSpacing(QFont::PercentageSpacing,105);    // 设置字间距100%为默认
         label->setFont(font);
-        label->setFixedHeight(navigationWidget->height() / 3);
+        label->setFixedHeight(m_pNavigationWidget->height() / 3);
 
         newLayout->addWidget(label);
     }
 
     // 设置布局并更新导航栏
-    navigationWidget->setLayout(newLayout);
-    navigationWidget->update();
+    m_pNavigationWidget->setLayout(newLayout);
+    m_pNavigationWidget->update();
 
 }
 
@@ -1291,7 +1288,7 @@ void DbTreeViewManager::clearAllSeparators()
 void DbTreeViewManager::updateSeparatorLine()
 {
     // 如果目录树被隐藏,就把分割线都藏起来
-    if (!treeViewDown->isVisible()) {
+    if (!m_pTreeViewDown->isVisible()) {
         for (auto it = firstLevelSeparators.begin(); it != firstLevelSeparators.end(); ++it) {
             QFrame *sep = it.value();
             if (sep) sep->hide();
@@ -1306,8 +1303,8 @@ void DbTreeViewManager::updateSeparatorLine()
         if (!firstLevelItem || !separator) continue;
 
         // 拿到可视区域
-        QModelIndex firstLevelIndex = model->indexFromItem(firstLevelItem);
-        QRect firstLevelRect = treeViewDown->visualRect(firstLevelIndex);
+        QModelIndex firstLevelIndex = m_pCModel->indexFromItem(firstLevelItem);
+        QRect firstLevelRect = m_pTreeViewDown->visualRect(firstLevelIndex);
 
         // 如果这个一级目录滚动到看不见了,就把分割线也藏起来
         if (!firstLevelRect.isValid()) {
@@ -1316,13 +1313,13 @@ void DbTreeViewManager::updateSeparatorLine()
         }
 
         // 如果展开并且它有子节点,就找“最后一个可见子项”
-        if (treeViewDown->isExpanded(firstLevelIndex) && firstLevelItem->hasChildren()) {
+        if (m_pTreeViewDown->isExpanded(firstLevelIndex) && firstLevelItem->hasChildren()) {
             QModelIndex lastVisibleChild = findLastVisibleChild(firstLevelIndex);
             if (lastVisibleChild.isValid()) {
-                QRect lastChildRect = treeViewDown->visualRect(lastVisibleChild);
+                QRect lastChildRect = m_pTreeViewDown->visualRect(lastVisibleChild);
                 if (lastChildRect.isValid()) {
                     // 将分割线放在最后一个子项下面
-                    separator->setGeometry(16,lastChildRect.bottom() + 115,widget2->width() - 40,1);
+                    separator->setGeometry(16,lastChildRect.bottom() + 115, m_pOriginalWndMenuPage->width() - 40,1);
                     separator->show();
                     continue;
                 }
@@ -1330,7 +1327,7 @@ void DbTreeViewManager::updateSeparatorLine()
         }
 
         // 如果收起或找不到可见子项,就放在本一级目录下面
-        separator->setGeometry(16,firstLevelRect.bottom() + 115,widget2->width() - 40,1);
+        separator->setGeometry(16,firstLevelRect.bottom() + 115, m_pOriginalWndMenuPage->width() - 40,1);
         separator->show();
     }
 }
@@ -1339,13 +1336,13 @@ void DbTreeViewManager::updateSeparatorLine()
 QModelIndex DbTreeViewManager::findLastVisibleChild(const QModelIndex &parentIndex) {
     if (!parentIndex.isValid()) return QModelIndex();
 
-    int childCount = model->rowCount(parentIndex);
+    int childCount = m_pCModel->rowCount(parentIndex);
     QModelIndex lastVisible;
 
     for (int i = childCount - 1; i >= 0; --i) {
-        QModelIndex childIndex = model->index(i, 0, parentIndex);
-        if (!treeViewDown->isRowHidden(i, parentIndex)) {
-            if (treeViewDown->isExpanded(childIndex) && model->rowCount(childIndex) > 0) {
+        QModelIndex childIndex = m_pCModel->index(i, 0, parentIndex);
+        if (!m_pTreeViewDown->isRowHidden(i, parentIndex)) {
+            if (m_pTreeViewDown->isExpanded(childIndex) && m_pCModel->rowCount(childIndex) > 0) {
                 QModelIndex deeper = findLastVisibleChild(childIndex);
                 if (deeper.isValid()) {
                     return deeper;
@@ -1893,10 +1890,10 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<Table_Control_Data>&
     }
 
     // 获取当前选中的目录项,设置状态
-    QModelIndex currentIndex = treeViewDown->currentIndex();
+    QModelIndex currentIndex = m_pTreeViewDown->currentIndex();
     if (currentIndex.isValid())
     {
-        QStandardItem* currentItem = model->itemFromIndex(currentIndex);
+        QStandardItem* currentItem = m_pCModel->itemFromIndex(currentIndex);
         if (currentItem)
         {
             currentItem->setCheckState(allChangeFlag ? Qt::Checked : Qt::Unchecked);
@@ -1908,7 +1905,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<Table_Control_Data>&
     }
 
     // 隐藏目录树及所有分隔线
-    treeViewDown->hide();
+    m_pTreeViewDown->hide();
     for (auto separator : firstLevelSeparators)
     {
         if (separator)
@@ -1919,17 +1916,17 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<Table_Control_Data>&
     m_fieldWidgets.clear();
 
     // 创建新的 "字段展示" 窗口,并赋值给 m_thirdLevelFieldWnd
-    m_thirdLevelFieldWnd = new QWidget(widget2);
+    m_thirdLevelFieldWnd = new QWidget(m_pOriginalWndMenuPage);
     m_thirdLevelFieldWnd->setWindowTitle("字段展示");
     m_thirdLevelFieldWnd->setStyleSheet("background-color: transparent;");
     if (isHome)
     {
         // Home 界面,填满 widget2
-        m_thirdLevelFieldWnd->setGeometry(0, 0, widget2->width(), widget2->height());
+        m_thirdLevelFieldWnd->setGeometry(0, 0, m_pOriginalWndMenuPage->width(), m_pOriginalWndMenuPage->height());
     } else
     {
         // 其他配置界面,设置与 treeViewDown 相同的几何位置
-        m_thirdLevelFieldWnd->setGeometry(treeViewDown->geometry());
+        m_thirdLevelFieldWnd->setGeometry(m_pTreeViewDown->geometry());
     }
 
     // 创建滚动区域
@@ -2502,7 +2499,7 @@ void DbTreeViewManager::onButtonBackClicked()
         m_thirdLevelFieldWnd = nullptr;
 
         // 显示目录树和分隔线
-        treeViewDown->show();
+        m_pTreeViewDown->show();
         for (auto separator : firstLevelSeparators) {
             if (separator)
                 separator->show();
@@ -2510,7 +2507,7 @@ void DbTreeViewManager::onButtonBackClicked()
 
         // 获取当前导航路径
         QStringList path;
-        QLayout* layout = navigationWidget->layout();
+        QLayout* layout = m_pNavigationWidget->layout();
         if (!layout) {
             qWarning() << "导航栏没有布局,无法获取路径。";
             return;
@@ -2549,14 +2546,14 @@ void DbTreeViewManager::onButtonBackClicked()
         }
 
         // 选中父目录项
-        treeViewDown->setCurrentIndex(parentIndex);
-        treeViewDown->scrollTo(parentIndex);
+        m_pTreeViewDown->setCurrentIndex(parentIndex);
+        m_pTreeViewDown->scrollTo(parentIndex);
 
         // 更新导航栏
         updateNavigationBar(parentIndex);
 
         // 检查父目录是否为第三层目录
-        QStandardItem* parentItem = model->itemFromIndex(parentIndex);
+        QStandardItem* parentItem = m_pCModel->itemFromIndex(parentIndex);
         if (!parentItem) {
             qWarning() << "父目录项无效。";
             return;
@@ -2599,7 +2596,7 @@ void DbTreeViewManager::onButtonBackClicked()
             //displayThirdLevelFields(data, false); // 传递参数表示非 Home 界面
         } else {
             // 父目录不是第三层目录,确保目录树和分隔线可见
-            treeViewDown->show();
+            m_pTreeViewDown->show();
             for (auto separator : firstLevelSeparators) {
                 if (separator)
                     separator->show();
@@ -2611,13 +2608,13 @@ void DbTreeViewManager::onButtonBackClicked()
     //  如果不在第三层目录,则在目录树中返回上一层
     qDebug() << "当前不在第三层目录,尝试在目录树中返回上一层。";
 
-    QModelIndex currentIndex = treeViewDown->currentIndex();
+    QModelIndex currentIndex = m_pTreeViewDown->currentIndex();
     if (!currentIndex.isValid()) {
         qWarning() << "当前没有选中的目录项,无法返回。";
         return;
     }
 
-    QStandardItem* currentItem = model->itemFromIndex(currentIndex);
+    QStandardItem* currentItem = m_pCModel->itemFromIndex(currentIndex);
     if (!currentItem) {
         qWarning() << "当前选中的目录项无效。";
         return;
@@ -2629,15 +2626,15 @@ void DbTreeViewManager::onButtonBackClicked()
         return;
     }
 
-    QModelIndex parentIndex = model->indexFromItem(parentItem);
+    QModelIndex parentIndex = m_pCModel->indexFromItem(parentItem);
     if (!parentIndex.isValid()) {
         qWarning() << "父目录的 QModelIndex 无效。";
         return;
     }
 
     // 选中父目录项
-    treeViewDown->setCurrentIndex(parentIndex);
-    treeViewDown->scrollTo(parentIndex);
+    m_pTreeViewDown->setCurrentIndex(parentIndex);
+    m_pTreeViewDown->scrollTo(parentIndex);
 
     // 更新导航栏
     updateNavigationBar(parentIndex);
@@ -2682,7 +2679,7 @@ QList<QStandardItem*> DbTreeViewManager::collectAllThirdLevelItems()
 {
     QList<QStandardItem*> result;
     // 从根节点开始递归搜集
-    QStandardItem *root = model->invisibleRootItem();
+    QStandardItem *root = m_pCModel->invisibleRootItem();
     if (!root) return result;
 
     std::function<void(QStandardItem*)> dfsCollectThirdLevel;
@@ -2723,13 +2720,13 @@ void DbTreeViewManager::onButtonDownClicked()
     }
 
     // 2) 找到  当前选中的节点 在 thirdLevelList 里的索引
-    QModelIndex curIndex = treeViewDown->currentIndex();
+    QModelIndex curIndex = m_pTreeViewDown->currentIndex();
     if (!curIndex.isValid()) {
         qDebug() << "[onButtonDownClicked] 当前没有选中节点,默认跳到第一个三级目录。";
         // 如果想默认跳到第一个
         QStandardItem *firstItem = thirdLevelList.first();
-        QModelIndex idx = model->indexFromItem(firstItem);
-        treeViewDown->setCurrentIndex(idx);
+        QModelIndex idx = m_pCModel->indexFromItem(firstItem);
+        m_pTreeViewDown->setCurrentIndex(idx);
         // 模拟点击一下
         onTreeViewClicked_updown(idx);
         // 保存复选框状态
@@ -2739,7 +2736,7 @@ void DbTreeViewManager::onButtonDownClicked()
         return;
     }
 
-    QStandardItem *curItem = model->itemFromIndex(curIndex);
+    QStandardItem *curItem = m_pCModel->itemFromIndex(curIndex);
     if (!curItem) {
         qWarning() << "[onButtonDownClicked] currentItem 无效。";
         return;
@@ -2765,8 +2762,8 @@ void DbTreeViewManager::onButtonDownClicked()
             if (currentPos < 0) {
                 qDebug() << "还是找不到,说明当前目录不属于任何三级目录,直接跳到第一个";
                 QStandardItem *firstItem = thirdLevelList.first();
-                QModelIndex idx = model->indexFromItem(firstItem);
-                treeViewDown->setCurrentIndex(idx);
+                QModelIndex idx = m_pCModel->indexFromItem(firstItem);
+                m_pTreeViewDown->setCurrentIndex(idx);
                 onTreeViewClicked_updown(idx);
                 // 保存复选框状态
                 saveCheckedPaths();
@@ -2786,8 +2783,8 @@ void DbTreeViewManager::onButtonDownClicked()
 
     //  跳到下一个
     QStandardItem *nextItem = thirdLevelList[nextPos];
-    QModelIndex nextIndex = model->indexFromItem(nextItem);
-    treeViewDown->setCurrentIndex(nextIndex);
+    QModelIndex nextIndex = m_pCModel->indexFromItem(nextItem);
+    m_pTreeViewDown->setCurrentIndex(nextIndex);
     // 相当于模拟点击
     onTreeViewClicked_updown(nextIndex);
     // 保存复选框状态
@@ -2806,13 +2803,13 @@ void DbTreeViewManager::onButtonUpClicked()
     }
 
     // 2) 找到 当前选中的节点
-    QModelIndex curIndex = treeViewDown->currentIndex();
+    QModelIndex curIndex = m_pTreeViewDown->currentIndex();
     if (!curIndex.isValid()) {
         qDebug() << "[onButtonUpClicked] 当前无选中节点,默认跳到最后一个三级目录。";
         //  跳到最后一个
         QStandardItem *lastItem = thirdLevelList.last();
-        QModelIndex idx = model->indexFromItem(lastItem);
-        treeViewDown->setCurrentIndex(idx);
+        QModelIndex idx = m_pCModel->indexFromItem(lastItem);
+        m_pTreeViewDown->setCurrentIndex(idx);
         // 模拟点击
         onTreeViewClicked_updown(idx);
         // 保存复选框状态
@@ -2822,7 +2819,7 @@ void DbTreeViewManager::onButtonUpClicked()
         return;
     }
 
-    QStandardItem *curItem = model->itemFromIndex(curIndex);
+    QStandardItem *curItem = m_pCModel->itemFromIndex(curIndex);
     if (!curItem) {
         qWarning() << "[onButtonUpClicked] currentItem 无效。";
         return;
@@ -2844,8 +2841,8 @@ void DbTreeViewManager::onButtonUpClicked()
         if (currentPos < 0) {
             qDebug() << "找不到任何三级目录,直接跳到最后一个。";
             QStandardItem *lastItem = thirdLevelList.last();
-            QModelIndex idx = model->indexFromItem(lastItem);
-            treeViewDown->setCurrentIndex(idx);
+            QModelIndex idx = m_pCModel->indexFromItem(lastItem);
+            m_pTreeViewDown->setCurrentIndex(idx);
             onTreeViewClicked_updown(idx);
             // 保存复选框状态
             saveCheckedPaths();
@@ -2864,8 +2861,8 @@ void DbTreeViewManager::onButtonUpClicked()
 
     // 跳到上一个
     QStandardItem *prevItem = thirdLevelList[prevPos];
-    QModelIndex prevIndex = model->indexFromItem(prevItem);
-    treeViewDown->setCurrentIndex(prevIndex);
+    QModelIndex prevIndex = m_pCModel->indexFromItem(prevItem);
+    m_pTreeViewDown->setCurrentIndex(prevIndex);
     // 模拟点击
     onTreeViewClicked_updown(prevIndex);
     // 保存复选框状态
@@ -2942,7 +2939,7 @@ QModelIndex DbTreeViewManager::findItemByPath(const QStringList &path)
 {
     if (path.isEmpty()) return QModelIndex();
 
-    QStandardItem *currentItem = model->invisibleRootItem();
+    QStandardItem *currentItem = m_pCModel->invisibleRootItem();
     QModelIndex currentIndex;
 
     for (const QString &part : path) {
@@ -2954,7 +2951,7 @@ QModelIndex DbTreeViewManager::findItemByPath(const QStringList &path)
                 qDebug() << "child is nullptr";
             }
             if (child->text() == part) {
-                currentIndex = model->indexFromItem(child);
+                currentIndex = m_pCModel->indexFromItem(child);
                 currentItem = child;
                 found = true;
                 qDebug() << "找到路径部分:" << part;
@@ -2980,7 +2977,7 @@ void DbTreeViewManager::setCheckedPaths(const QStringList &checkedPathsList)
         QStringList path = pathStr.split("/");
         QModelIndex idx = findItemByPath(path);
         if (idx.isValid()) {
-            QStandardItem *item = model->itemFromIndex(idx);
+            QStandardItem *item = m_pCModel->itemFromIndex(idx);
             if (item) {
                 item->setCheckState(Qt::Checked);
                 qDebug() << " Setting item:" << item->text() << "to Checked";
@@ -3000,7 +2997,7 @@ QStringList DbTreeViewManager::collectCheckedPathsRecursive(QStandardItem *item,
 {
     QStringList checkedList;
     if (!item) {
-        item = model->invisibleRootItem();
+        item = m_pCModel->invisibleRootItem();
     }
 
     for (int i = 0; i < item->rowCount(); ++i) {
@@ -3024,7 +3021,7 @@ QStringList DbTreeViewManager::collectCheckedPathsRecursive(QStandardItem *item,
 // 收集所有被选中的复选框路径
 QStringList DbTreeViewManager::collectCheckedPaths()
 {
-    return collectCheckedPathsRecursive(model->invisibleRootItem(), QStringList());
+    return collectCheckedPathsRecursive(m_pCModel->invisibleRootItem(), QStringList());
 }
 
 
@@ -3330,7 +3327,7 @@ void DbTreeViewManager::displayThirdLevelButtons(const QList<CONFIG_BASE_STRUCT>
 void DbTreeViewManager::clearThirdLevelMenu()
 {
     // 遍历所有子控件,找到标题为 "字段展示" 的窗口并关闭
-    foreach (QObject *child, widget2->children()) {
+    foreach (QObject *child, m_pOriginalWndMenuPage->children()) {
         QWidget *childWidget = qobject_cast<QWidget*>(child);
         if (childWidget && childWidget->windowTitle() == "字段展示") {
             qDebug() << "关闭现有的字段展示窗口";
@@ -3339,7 +3336,7 @@ void DbTreeViewManager::clearThirdLevelMenu()
     }
 
     // 显示主目录树和分隔线
-    treeViewDown->show();
+    m_pTreeViewDown->show();
     for (auto separator : firstLevelSeparators) {
         separator->show();
     }
@@ -3402,19 +3399,19 @@ void DbTreeViewManager::loadCheckedPaths()
         QStringList lastPath = lastPathStr.split("/");
         QModelIndex lastIdx  = findItemByPath(lastPath);
         if (lastIdx.isValid()) {
-            treeViewDown->setCurrentIndex(lastIdx);
+            m_pTreeViewDown->setCurrentIndex(lastIdx);
             updateNavigationBar(lastIdx);
         }
     } else {
         // 如果没有加载到任何路径,自动选择第一个目录
-        QStandardItem *rootItem = model->invisibleRootItem();
+        QStandardItem *rootItem = m_pCModel->invisibleRootItem();
         if (rootItem->rowCount() > 0) {
-            QModelIndex firstIndex = model->index(0, 0, QModelIndex());
+            QModelIndex firstIndex = m_pCModel->index(0, 0, QModelIndex());
             if (firstIndex.isValid()) {
-                treeViewDown->setCurrentIndex(firstIndex);
-                treeViewDown->expand(firstIndex); // 展开第一个目录
+                m_pTreeViewDown->setCurrentIndex(firstIndex);
+                m_pTreeViewDown->expand(firstIndex); // 展开第一个目录
 
-                QStandardItem *firstItem = model->itemFromIndex(firstIndex);
+                QStandardItem *firstItem = m_pCModel->itemFromIndex(firstIndex);
                 QVariant data = firstItem->data(Qt::UserRole + 2);
                 if (data.canConvert<QJsonObject>()) {
                     QJsonObject thirdLevelObj = data.toJsonObject();
@@ -3487,7 +3484,7 @@ void DbTreeViewManager::loadExpandedPaths()
         QStringList path = p.split("/");
         QModelIndex idx = findItemByPath(path);
         if (idx.isValid()) {
-            treeViewDown->expand(idx);
+            m_pTreeViewDown->expand(idx);
             expandedPaths.insert(p);
             qDebug() << "成功恢复展开路径:" << p;
         } else {
@@ -3518,17 +3515,17 @@ DbTreeViewManager::PageState DbTreeViewManager::getCurrentPageState()
     // 判断是否在第三层窗口中
     if (m_thirdLevelFieldWnd && m_thirdLevelFieldWnd->isVisible()) {
         // 如果此时是在第三层界面,则用当前导航栏 or 目录树的 “选中项” 来获取路径
-        QModelIndex curIndex = treeViewDown->currentIndex();
+        QModelIndex curIndex = m_pTreeViewDown->currentIndex();
         if (!curIndex.isValid()) {
 
             st.path << "未知目录";
         } else {
-            QStandardItem* item = model->itemFromIndex(curIndex);
+            QStandardItem* item = m_pCModel->itemFromIndex(curIndex);
             st.path = buildItemPath(item);
         }
 
         // 如果能拿到 DirectoryId,则置为第三层
-        QVariant dataVar = model->itemFromIndex(treeViewDown->currentIndex())->data(Qt::UserRole + 2);
+        QVariant dataVar = m_pCModel->itemFromIndex(m_pTreeViewDown->currentIndex())->data(Qt::UserRole + 2);
         if (dataVar.canConvert<QJsonObject>()) {
             QJsonObject obj = dataVar.toJsonObject();
             if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
@@ -3540,9 +3537,9 @@ DbTreeViewManager::PageState DbTreeViewManager::getCurrentPageState()
     }
     else {
         // 当前是目录树界面,就看 treeView 选中项
-        QModelIndex curIndex = treeViewDown->currentIndex();
+        QModelIndex curIndex = m_pTreeViewDown->currentIndex();
         if (curIndex.isValid()) {
-            QStandardItem* item = model->itemFromIndex(curIndex);
+            QStandardItem* item = m_pCModel->itemFromIndex(curIndex);
             st.path = buildItemPath(item);
 
             // 检查是否第三层
@@ -3573,8 +3570,8 @@ void DbTreeViewManager::loadPageState(const PageState &st, bool isByHistoryNav)
     }
 
     // 选中该节点
-    treeViewDown->setCurrentIndex(idx);
-    treeViewDown->scrollTo(idx);
+    m_pTreeViewDown->setCurrentIndex(idx);
+    m_pTreeViewDown->scrollTo(idx);
 
     // 更新导航栏
     updateNavigationBar(idx);
@@ -3602,7 +3599,7 @@ void DbTreeViewManager::loadPageState(const PageState &st, bool isByHistoryNav)
             m_thirdLevelFieldWnd->deleteLater();
             m_thirdLevelFieldWnd = nullptr;
         }
-        treeViewDown->show();
+        m_pTreeViewDown->show();
         for (auto sep : firstLevelSeparators) {
             if (sep) sep->show();
         }

+ 18 - 21
View/die-bonder-ui/OriginalWnd/DbTreeViewManager.h

@@ -36,7 +36,6 @@
 #include <QLabel>
 #include <QHBoxLayout>
 #include <QPushButton>
-#include <QDebug>
 #include <QVBoxLayout>
 #include <QStandardItem>
 #include <QMap>
@@ -45,7 +44,7 @@
 #include "CViewInterface.h"
 #include "Src/Sql/SqlOperation.h"
 
-class OriginalWnd; ///< 前向声明
+class OriginalWnd;
 
 /**
  * @class DbTreeViewManager
@@ -59,20 +58,19 @@ class DbTreeViewManager : public QWidget
     Q_OBJECT
 
 public:
-
     /**
      * @brief 构造函数
      * @param originalWnd  指向 OriginalWnd 对象的指针
      * @param widget2      另一个父级或容器部件,用于添加子控件
      * @param parent       父窗口指针,可为空
      */
-    explicit DbTreeViewManager(OriginalWnd* originalWnd,
-                               QWidget* widget2, QWidget* parent = nullptr);
+    explicit DbTreeViewManager(QWidget* pOriginalWndMenuPage, QWidget* parent = nullptr);
+    ~DbTreeViewManager();
 
-    /**
-     * @brief 析构函数,清理资源
+
+    /**构造初始化
      */
-    ~DbTreeViewManager();
+    void Init();
 
     /**
      * @brief 初始化目录树,从数据库加载数据
@@ -184,31 +182,28 @@ private slots:
     void onItemChanged(QStandardItem *item);
 
 private:
-
-    /**
-     * @brief 指向 OriginalWnd 对象的指针,用于访问或联动其它窗口功能
+    /**OriginalWnd 窗口
      */
     OriginalWnd* m_originalWnd = nullptr;
 
-    /**
-     * @brief widget2 外部传入的父级/容器,用于承载子控件
+    /** 主菜单页面,显示功能
      */
-    QWidget *widget2 = nullptr;
+    QWidget * m_pOriginalWndMenuPage = nullptr;
 
     /**
      * @brief 树视图控件
      */
-    QTreeView *treeViewDown = nullptr;
+    QPointer<QTreeView>     m_pTreeViewDown;
 
     /**
      * @brief 导航栏 QWidget,用于显示路径信息
      */
-    QWidget *navigationWidget = nullptr;
+    QPointer<QWidget>      m_pNavigationWidget;
 
     /**
      * @brief 树状模型,用于存放目录层级
      */
-    QStandardItemModel *model = nullptr;
+    QPointer<QStandardItemModel> m_pCModel = nullptr;
 
     /**
      * @brief 用于存储第三层字段展示窗口的指针(单实例)
@@ -241,9 +236,9 @@ private:
     QList<PageState> m_forwardStack;
 
     /**
- * @brief restoring 标记是否在恢复阶段
- */
-    bool restoring = false;
+    * @brief restoring 标记是否在恢复阶段
+    */
+    bool m_isRestoring = false;
 
     /**
      * @brief 存储“一级目录”和相应分隔线的映射,用于更新和控制分隔线位置、可见性等
@@ -270,8 +265,10 @@ private:
     /**
      * @brief  特定分隔线,Home 界面时隐藏,其他界面时显示
      */
-    QFrame* lineFrame1 = nullptr;
+    QPointer<QFrame>     m_pLineFrame1;
 
+    /**数据库存储
+     */
     SqlOperation* m_sqlOper = nullptr;
 
 private:

+ 4 - 7
View/die-bonder-ui/OriginalWnd/MainAndSecondaryCamerasWnd.cpp

@@ -84,16 +84,11 @@ void MainAndSecondaryCamerasWnd::initFrom()
 
     checkSettings();
 
-
+    lastLastGroupId = 1;
+    lastLastIndex = 1;
 
     GetCurrentSelectSlots(lastLastGroupId, lastLastIndex);
     GetCurrentSelectSlots(lastGroupId, lastIndex);
-
-
-
-    
-
-
 }
 
 void MainAndSecondaryCamerasWnd::InitPage()
@@ -414,6 +409,7 @@ void MainAndSecondaryCamerasWnd::HideLayout(QHBoxLayout* layout, bool isHide)
 
 void MainAndSecondaryCamerasWnd::UpdataLightJoystickSwitchPage(int groupId, int index, bool isShow)
 {
+    groupId -= 1;
     auto Fun = [&](Group* pGroup,LightJoystickSwitchPage* p, ControlOperationPage* pContPage, bool bShow)
     {
         p->UpdatemPageGroup(pGroup);
@@ -466,6 +462,7 @@ void MainAndSecondaryCamerasWnd::timerEvent(QTimerEvent* event)
 {
     int nID = event->timerId();
 }
+
 void MainAndSecondaryCamerasWnd::GetCurrentSelectSlots(int groupId, int nIndex) {
     int nOnClickGroupId = groupId - 1; // 这里new 有些是0,有些是1 暂时选择
     if (m_pMainCameraBind == nullptr || m_allGroup.size() < nOnClickGroupId)

+ 41 - 19
View/die-bonder-ui/OriginalWnd/OriginalWnd.cpp

@@ -28,7 +28,7 @@ OriginalWnd::OriginalWnd(QWidget* parent, CameraBind* pCameraBind)
 
     RegFun();
 
-    if (gen_if.getLanguageValue() == 0)
+    if (gen_if.getLanguageValue() == 0)//TODO: 这里有问题吧.... ==-1 也加载?
     {
 
     }
@@ -36,26 +36,8 @@ OriginalWnd::OriginalWnd(QWidget* parent, CameraBind* pCameraBind)
     {
         setChineseMode(this);
     }
-    // 确保 ui->widget_2 已经初始化
-    if (!ui->widget_2)
-    {
-        qWarning() << "ui->widget_2 未初始化";
-    }
-
-    // 初始化 DbTreeViewManager,传递两个参数
-    m_pdbTreeViewManager.reset(new DbTreeViewManager(this, ui->widget_2, this));
-    connect(m_pdbTreeViewManager.get(), &DbTreeViewManager::RunFunSignals, this, &OriginalWnd::JRunFunSlots);
 
-    // 将 DbTreeViewManager 添加到 UI
-    // 假设 ui->widget_2 是你原来放 TreeViewManager 的地方
-    QVBoxLayout* layout = new QVBoxLayout(ui->widget_2);
-    layout->addWidget(m_pdbTreeViewManager.get());
-    ui->widget_2->setLayout(layout);
-
-    // 初始化界面
     InitForm();
-
-    SwitchToConfig("Home", 1, 0, false);
 }
 
 OriginalWnd::~OriginalWnd()
@@ -155,7 +137,11 @@ void OriginalWnd::switchToSystemConfig()
 
 void OriginalWnd::InitForm()
 {
+    InitTreeViewManager();
     m_nTimerID = startTimer(100);
+    m_pLogStateSidebar = new LogStateSidebar(this);
+    m_pLogStateSidebar->move(-m_pLogStateSidebar->width(), 0);
+    m_pLogStateSidebar->resize(m_pLogStateSidebar->width(), height());
 
     //给stopbutton加样式
     QString stopButton_styleSheet = "QToolButton:hover { background: #cc0000; }"
@@ -173,6 +159,20 @@ void OriginalWnd::InitForm()
 
     ui->label_userlogo->installEventFilter(this);
     ui->label_username->installEventFilter(this);
+
+    // 这个地方是否也要保存切换?
+    SwitchToConfig("Home", 1, 0, false);
+}
+
+void OriginalWnd::InitTreeViewManager()
+{
+    m_pdbTreeViewManager.reset(new DbTreeViewManager(ui->menuFunctionsSwitchWidget, this));
+    connect(m_pdbTreeViewManager.get(), &DbTreeViewManager::RunFunSignals, this, &OriginalWnd::JRunFunSlots);
+
+    // 把TreeViewManager放到页面上
+    QVBoxLayout* layout = new QVBoxLayout(ui->menuFunctionsSwitchWidget);
+    layout->addWidget(m_pdbTreeViewManager.get());
+    ui->menuFunctionsSwitchWidget->setLayout(layout);
 }
 
 void OriginalWnd::UpdateTime()
@@ -250,6 +250,16 @@ void OriginalWnd::timerEvent(QTimerEvent* event)
     }
 }
 
+void OriginalWnd::resizeEvent(QResizeEvent* event)
+{
+    if (m_pLogStateSidebar) 
+    {
+        m_pLogStateSidebar->resize(m_pLogStateSidebar->width(), height());
+    }
+
+    QMainWindow::resizeEvent(event);
+}
+
 void OriginalWnd::on_ChartButton_clicked()
 {
     CreateSwitchMainPage(EN_WND_SWITCH::ChartsAnd);
@@ -265,6 +275,18 @@ void OriginalWnd::on_SingleImageButton_clicked()
     CreateSwitchMainPage(EN_WND_SWITCH::SingleCameraOperation);
 }
 
+void OriginalWnd::on_LogStatBut_clicked()
+{
+    if (m_pLogStateSidebar->isExpanded()) 
+    {
+        m_pLogStateSidebar->HideSidebar();
+    }
+    else 
+    {
+        m_pLogStateSidebar->ShowSidebar();
+    }
+}
+
 void OriginalWnd::on_startButton_clicked()
 {
     RunOrStopSwitch();

+ 8 - 0
View/die-bonder-ui/OriginalWnd/OriginalWnd.h

@@ -14,6 +14,7 @@
 #include "Src/CameraBind.h"
 #include "JOriginalMainWnd.h"
 #include "CameraDistribute.h"
+#include "Src/RewriteControl/Sidebar/LogStatePage.h"
 //#include "CViewInterface.h"
 
 QT_BEGIN_NAMESPACE
@@ -69,8 +70,12 @@ protected:
     bool eventFilter(QObject* obj, QEvent* event) override;
     void timerEvent(QTimerEvent* event) override;
 
+    void resizeEvent(QResizeEvent* event) override;
+
     void InitForm(); // 初始化表单控件
 
+    void InitTreeViewManager();
+
     /**更新当前时间
      */
     void UpdateTime();
@@ -87,6 +92,7 @@ private slots:
     void on_ChartButton_clicked();
     void on_DoubleImageButton_clicked();
     void on_SingleImageButton_clicked();
+    void on_LogStatBut_clicked();
 
     void on_startButton_clicked();
 
@@ -134,6 +140,8 @@ private:
     /**快捷按钮切换用
      */
     bool    m_isDisabled = true;
+
+    QPointer<LogStateSidebar> m_pLogStateSidebar;
 };
 
 

+ 14 - 1
View/die-bonder-ui/OriginalWnd/OriginalWnd.ui

@@ -30,7 +30,7 @@
      </size>
     </property>
    </widget>
-   <widget class="QWidget" name="widget_2" native="true">
+   <widget class="QWidget" name="menuFunctionsSwitchWidget" native="true">
     <property name="geometry">
      <rect>
       <x>1118</x>
@@ -213,6 +213,19 @@ production</string>
       <enum>Qt::Horizontal</enum>
      </property>
     </widget>
+    <widget class="QPushButton" name="LogStatBut">
+     <property name="geometry">
+      <rect>
+       <x>170</x>
+       <y>10</y>
+       <width>21</width>
+       <height>101</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>1</string>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="Toptitlebar" native="true">
     <property name="geometry">

+ 4 - 0
View/die-bonder-ui/SBTdie-bonder-ui.vcxproj

@@ -240,8 +240,10 @@
     <ClCompile Include="Src\common\JMessageTip.cpp" />
     <ClCompile Include="Src\common\JUserAccountsData.cpp" />
     <ClCompile Include="Src\RewriteControl\ControlOperationPage.cpp" />
+    <ClCompile Include="Src\RewriteControl\JoystickPage.cpp" />
     <ClCompile Include="Src\RewriteControl\LightJoystickSwitchPage.cpp" />
     <ClCompile Include="Src\RewriteControl\MsgDlg\CustomMessageDlg.cpp" />
+    <ClCompile Include="Src\RewriteControl\Sidebar\LogStatePage.cpp" />
     <ClCompile Include="Src\Sql\SqlOperation.cpp" />
     <ClCompile Include="Src\SystemInfoPage\PageWnd\AccountMaintenanceWnd.cpp" />
     <ClCompile Include="Src\SystemInfoPage\PageWnd\AddUserAccountWnd.cpp" />
@@ -268,6 +270,8 @@
     <QtMoc Include="Src\RewriteControl\LightJoystickSwitchPage.h" />
     <QtMoc Include="Src\RewriteControl\MsgDlg\CustomMessageDlg.h" />
     <QtMoc Include="Src\RewriteControl\ControlOperationPage.h" />
+    <QtMoc Include="Src\RewriteControl\JoystickPage.h" />
+    <QtMoc Include="Src\RewriteControl\Sidebar\LogStatePage.h" />
     <ClInclude Include="Src\Sql\SqlOperation.h" />
     <QtMoc Include="Src\CameraBind.h" />
     <QtMoc Include="OriginalWnd\CameraDataHandleAndShow.h">

+ 15 - 3
View/die-bonder-ui/SBTdie-bonder-ui.vcxproj.filters

@@ -127,6 +127,9 @@
     <Filter Include="Source Files\Src\common\GlobalUse">
       <UniqueIdentifier>{2cb77129-4457-44f2-87f2-6a65f01a5d62}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Source Files\Src\RewriteControl\Sidebar">
+      <UniqueIdentifier>{dc851964-1171-43a7-8096-aabcf15a7dad}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="ImageWidget.cpp">
@@ -246,6 +249,12 @@
     <ClCompile Include="Src\common\GlobalUse\JMouseMonitorThread.cpp">
       <Filter>Source Files\Src\common\GlobalUse</Filter>
     </ClCompile>
+    <ClCompile Include="Src\RewriteControl\JoystickPage.cpp">
+      <Filter>Source Files\Src\RewriteControl</Filter>
+    </ClCompile>
+    <ClCompile Include="Src\RewriteControl\Sidebar\LogStatePage.cpp">
+      <Filter>Source Files\Src\RewriteControl\Sidebar</Filter>
+    </ClCompile>
     <ClCompile Include="CameraMaterialGroupWnd\MaterialWindow\Bond.cpp">
       <Filter>Source Files\CameraMaterialGroupWnd\MaterialWindow</Filter>
     </ClCompile>
@@ -329,10 +338,13 @@
     <QtMoc Include="Src\common\GlobalUse\JMouseMonitorThread.h">
       <Filter>Source Files\Src\common\GlobalUse</Filter>
     </QtMoc>
-    <QtMoc Include="CameraMaterialGroupWnd\MaterialWindow\Bond.h">
-      <Filter>Header Files\CameraMaterialGroupWnd\MaterialWindow</Filter>
+    <QtMoc Include="Src\RewriteControl\JoystickPage.h">
+      <Filter>Source Files\Src\RewriteControl</Filter>
     </QtMoc>
-    <QtMoc Include="CameraMaterialGroupWnd\MaterialWindow\BondGraphicsView.h">
+    <QtMoc Include="Src\RewriteControl\Sidebar\LogStatePage.h">
+      <Filter>Source Files\Src\RewriteControl\Sidebar</Filter>
+    </QtMoc>
+    <QtMoc Include="CameraMaterialGroupWnd\MaterialWindow\Bond.h">
       <Filter>Header Files\CameraMaterialGroupWnd\MaterialWindow</Filter>
     </QtMoc>
   </ItemGroup>

+ 18 - 12
View/die-bonder-ui/Src/RewriteControl/ControlOperationPage.cpp

@@ -1,5 +1,6 @@
 #include "ControlOperationPage.h"
 #include "ui_ControlOperationPage.h"
+#include "JoystickPage.h"
 
 ControlOperationPage::ControlOperationPage(QWidget* parent)
     : QWidget(parent)
@@ -211,7 +212,8 @@ void ControlOperationPage::setMaterialBox(MaterialBox* materialbox) {
     m_materialbox = materialbox;
     updateMaterialWidget(materialbox_kind);
 }
-void ControlOperationPage::setBond(Bond *bond){
+
+void ControlOperationPage::setBond(Bond* bond) {
     m_bond = bond;
     updateMaterialWidget(bond_kind);
 }
@@ -263,11 +265,11 @@ void ControlOperationPage::UpDateCameraBind(CameraBind* pCameraBind)
     m_pCameraBindCopy = pCameraBind;
 
     // 有指针了在去刷新
-//    if (m_pCameraBindCopy != nullptr)
-//    {
-//        DeduplicationBox(ui->moduleTypeComboBox, m_pCameraBindCopy->m_vecCAxis, 0);
-//        DeduplicationBox(ui->axisTypeComboBox, m_pCameraBindCopy->m_vecCAxis, 1);
-//    }
+    if (m_pCameraBindCopy != nullptr)
+    {
+        DeduplicationBox(ui->moduleTypeComboBox, m_pCameraBindCopy->m_vecCAxis, 0);
+        DeduplicationBox(ui->axisTypeComboBox, m_pCameraBindCopy->m_vecCAxis, 1);
+    }
 }
 
 void ControlOperationPage::on_switchJoystickBut_clicked()
@@ -393,6 +395,10 @@ void ControlOperationPage::InitWnd()
 {
     HideLayout(false);
     
+  /*  connect(ui->widgetPage, &JoystickPage::PositionChangedSignals, [&](qreal x, qreal y) {
+        ui->showLabel->setText(QString("摇杆位置: (%1, %2)").arg(x, 0, 'f', 2).arg(y, 0, 'f', 2));
+        });*/
+
     this->setMouseTracking(true);
     this->installEventFilter(this);
 }
@@ -458,12 +464,6 @@ void ControlOperationPage::LockMouse(bool islockMouse)
 template<class T>
 void ControlOperationPage::DeduplicationBox(QComboBox* pCom, const T& veTemp, int nIndex)
 {
-    QStringList items;
-    for (int i = 0; i < pCom->count(); ++i)
-    {
-        items << pCom->itemText(i);
-    }
-
     for (auto& a : veTemp)
     {
         QString strName;
@@ -476,6 +476,12 @@ void ControlOperationPage::DeduplicationBox(QComboBox* pCom, const T& veTemp, in
             strName = a->GetStringAxisType().c_str();
         }
 
+        QStringList items;
+        for (int i = 0; i < pCom->count(); ++i)
+        {
+            items << pCom->itemText(i);
+        }
+
         bool bMa = false; // 是否匹配
         for (auto b : items)
         {

+ 108 - 0
View/die-bonder-ui/Src/RewriteControl/JoystickPage.cpp

@@ -0,0 +1,108 @@
+// *****************************************************************************
+// 版权所有(C)2023~2099 上海骄成超声波技术有限公司
+// 保留所有权利
+// *****************************************************************************
+// 作者 : 杨坚
+// 版本 : 1.0
+// 功能说明:
+//          摇杆页面
+// *****************************************************************************
+#include "JoystickPage.h"
+
+JoystickPage::JoystickPage(QWidget* parent /*= nullptr*/)
+    : QWidget(parent), m_radius(50), m_handlePos(0, 0), m_isPressed(false) 
+{
+    setFixedSize(m_radius * 2 + 20, m_radius * 2 + 20);
+}
+
+void JoystickPage::paintEvent(QPaintEvent*)
+{
+    QPainter painter(this);
+    painter.setRenderHint(QPainter::Antialiasing);
+
+    // 绘制摇杆底座
+    painter.setPen(Qt::NoPen);
+    painter.setBrush(Qt::gray);
+    painter.drawEllipse(rect().center(), m_radius, m_radius);
+
+    // 绘制摇杆手柄
+    painter.setBrush(m_isPressed ? Qt::red : Qt::blue);
+    QPoint handleCenter = rect().center() + m_handlePos;
+    painter.drawEllipse(handleCenter, m_radius / 3, m_radius / 3);
+
+    if (QLineF(QPointF(0, 0), m_handlePos).length() > m_radius * 0.8)
+    {
+        painter.setBrush(Qt::red);
+    }
+    else 
+    {
+        painter.setBrush(m_isPressed ? Qt::darkBlue : Qt::blue);
+    }
+    ////绘制摇杆中的大圆
+    //QPixmap bigCircle_Pixmap;
+    //bigCircle_Pixmap.load(":/new/prefix1/image/max.png");
+    //painter.drawPixmap(SmallCir_xy.x() - BIG_CIRCLE_RADIUS, SmallCir_xy.y() - BIG_CIRCLE_RADIUS, \
+    //    BIG_CIRCLE_RADIUS * 2, BIG_CIRCLE_RADIUS * 2, bigCircle_Pixmap);
+
+    ////绘制摇杆中的小圆
+    //QPixmap smallCircle_Pixmap;
+    //smallCircle_Pixmap.load(":/new/prefix1/image/min.png");
+    //painter.drawPixmap(BigCir_xy.x() - SMALL_CIRCLE_RADIUS, BigCir_xy.y() - SMALL_CIRCLE_RADIUS, \
+    //    SMALL_CIRCLE_RADIUS * 2, SMALL_CIRCLE_RADIUS * 2, smallCircle_Pixmap);
+}
+
+void JoystickPage::mousePressEvent(QMouseEvent* event)
+{
+    if (QLineF(rect().center(), event->pos()).length() <= m_radius) 
+    {
+        m_isPressed = true;
+        updateHandlePosition(event->pos());
+        update();
+    }
+}
+
+void JoystickPage::mouseMoveEvent(QMouseEvent* event)
+{
+    if (m_isPressed) 
+    {
+        updateHandlePosition(event->pos());
+        update();
+    }
+}
+
+void JoystickPage::mouseReleaseEvent(QMouseEvent*)
+{
+    m_isPressed = false;
+    m_handlePos = QPoint(0, 0);
+    emit PositionChangedSignals(0, 0);
+    update();
+}
+
+void JoystickPage::updateHandlePosition(const QPoint& pos)
+{
+    QPoint center = rect().center();
+    QPointF delta = pos - center;
+    qreal distance = QLineF(center, pos).length();
+
+    if (distance > m_radius)
+    {
+        delta = delta * m_radius / distance;
+    }
+
+    m_handlePos = delta.toPoint();
+
+    if (distance < m_deadZone)
+    {
+        m_handlePos = QPoint(0, 0);
+        emit PositionChangedSignals(0, 0);
+    }
+    else
+    {
+        // 归一化到[-1, 1]范围
+        qreal x = delta.x() / m_radius;
+        qreal y = -delta.y() / m_radius; // Y轴反转,使向上为正
+
+        emit PositionChangedSignals(x, y);
+        //qDebug() << x << ":" << y;
+    }
+}

+ 49 - 0
View/die-bonder-ui/Src/RewriteControl/JoystickPage.h

@@ -0,0 +1,49 @@
+// *****************************************************************************
+// 版权所有(C)2023~2099 上海骄成超声波技术有限公司
+// 保留所有权利
+// *****************************************************************************
+// 作者 : 杨坚
+// 版本 : 1.0
+// 功能说明:
+//              摇杆页面
+// *****************************************************************************
+
+#ifndef __JOYSTICKPAGE_H__
+#define __JOYSTICKPAGE_H__ 1
+
+#include <QWidget>
+#include <QPainter>
+#include <QMouseEvent>
+
+class JoystickPage : public QWidget 
+{
+    Q_OBJECT
+public:
+    JoystickPage(QWidget* parent = nullptr);
+
+protected:
+    void paintEvent(QPaintEvent*) override;
+
+    void mousePressEvent(QMouseEvent* event) override;
+
+    void mouseMoveEvent(QMouseEvent* event) override;
+
+    void mouseReleaseEvent(QMouseEvent*) override;
+
+private:
+    void updateHandlePosition(const QPoint& pos);
+
+signals:
+    void PositionChangedSignals(qreal x, qreal y);
+
+private:
+    int         m_radius;
+    QPoint      m_handlePos;
+    bool        m_isPressed;
+
+    /**微小移动
+     */
+    qreal       m_deadZone= 0.11;
+};
+
+#endif  //__JOYSTICKPAGE_H__

+ 32 - 1
View/die-bonder-ui/Src/RewriteControl/LightJoystickSwitchPage.ui

@@ -23,7 +23,7 @@
     </rect>
    </property>
    <property name="currentIndex">
-    <number>0</number>
+    <number>1</number>
    </property>
    <widget class="QWidget" name="GreenLightTab">
     <attribute name="title">
@@ -499,9 +499,40 @@
       <string>当前选中:模组xxx   轴:x</string>
      </property>
     </widget>
+    <widget class="JoystickPage" name="widgetPage" native="true">
+     <property name="geometry">
+      <rect>
+       <x>100</x>
+       <y>10</y>
+       <width>141</width>
+       <height>101</height>
+      </rect>
+     </property>
+    </widget>
+    <widget class="QLabel" name="showLabel">
+     <property name="geometry">
+      <rect>
+       <x>10</x>
+       <y>70</y>
+       <width>221</width>
+       <height>16</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+    </widget>
    </widget>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>JoystickPage</class>
+   <extends>QWidget</extends>
+   <header location="global">Src/RewriteControl/JoystickPage.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
  <resources/>
  <connections/>
 </ui>

+ 58 - 0
View/die-bonder-ui/Src/RewriteControl/Sidebar/LogStatePage.cpp

@@ -0,0 +1,58 @@
+// *****************************************************************************
+// 版权所有(C)2023~2099 上海骄成超声波技术有限公司
+// 保留所有权利
+// *****************************************************************************
+// 作者 : 杨坚
+// 版本 : 1.0
+// 功能说明:
+//          侧边栏日志状态
+// *****************************************************************************
+
+#include "LogStatePage.h"
+#include "QGraphicsEffect"
+
+LogStateSidebar::LogStateSidebar(QWidget* parent /*= nullptr*/) : QWidget(parent) 
+{
+    setGraphicsEffect(new QGraphicsDropShadowEffect(this));
+    setFixedWidth(200);
+    setStyleSheet("background-color: #333; color: white;");
+    //setStyleSheet("background-color: rgba(51, 51, 51, 220);");
+    // 创建动画
+    m_pAnimation = new QPropertyAnimation(this, "pos");
+    m_pAnimation->setDuration(300);
+    m_pAnimation->setEasingCurve(QEasingCurve::InOutQuad);
+
+    // 添加一些内容
+    auto layout = new QVBoxLayout(this);
+    layout->addWidget(new QPushButton("Option 1", this));
+    layout->addWidget(new QPushButton("Option 2", this));
+    layout->addWidget(new QPushButton("Option 3", this));
+    layout->addStretch();
+}
+
+void LogStateSidebar::ShowSidebar()
+{
+    m_pAnimation->stop();
+    m_pAnimation->setStartValue(QPoint(-width(), y()));
+    m_pAnimation->setEndValue(QPoint(0, y()));
+    show();
+    m_pAnimation->start();
+    m_expanded = true;
+}
+
+void LogStateSidebar::HideSidebar()
+{
+    m_pAnimation->stop();
+    m_pAnimation->setStartValue(QPoint(x(), y()));
+    m_pAnimation->setEndValue(QPoint(-width(), y()));
+    connect(m_pAnimation, &QPropertyAnimation::finished, this, [this]() {
+        // hide(); // 完成了不要隐藏
+        m_expanded = false;
+        });
+    m_pAnimation->start();
+}
+
+bool LogStateSidebar::isExpanded()
+{
+    return x() >= 0;
+}

+ 90 - 0
View/die-bonder-ui/Src/RewriteControl/Sidebar/LogStatePage.h

@@ -0,0 +1,90 @@
+// *****************************************************************************
+// 版权所有(C)2023~2099 上海骄成超声波技术有限公司
+// 保留所有权利
+// *****************************************************************************
+// 作者 : 杨坚
+// 版本 : 1.0
+// 功能说明:
+//          侧边栏日志状态
+// *****************************************************************************
+
+#ifndef __LOGSTATEPAGE_H__
+#define __LOGSTATEPAGE_H__ 1
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QPropertyAnimation>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+class LogStateSidebar : public QWidget 
+{
+    Q_OBJECT
+public:
+    LogStateSidebar(QWidget* parent = nullptr);
+
+    void ShowSidebar();
+
+    void HideSidebar();
+
+    bool isExpanded();
+
+    void toggle() {
+        if (m_expanded) {
+            HideSidebar();
+        }
+        else {
+            ShowSidebar();
+        }
+    }
+
+private:
+    bool m_expanded = false;
+    QPropertyAnimation* m_pAnimation;
+};
+
+//class MainWindow : public QMainWindow {
+//    Q_OBJECT
+//public:
+//    MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
+//        // 创建主窗口内容
+//        auto centralWidget = new QWidget(this);
+//        auto layout = new QVBoxLayout(centralWidget);
+//
+//        toggleButton = new QPushButton("Toggle Sidebar", centralWidget);
+//        layout->addWidget(toggleButton);
+//
+//        setCentralWidget(centralWidget);
+//
+//        // 创建侧边栏
+//        sidebar = new LogStateSidebar(this);
+//        sidebar->move(-sidebar->width(), 0);
+//        sidebar->resize(sidebar->width(), height());
+//
+//        connect(toggleButton, &QPushButton::clicked, this, [this]() {
+//            if (sidebar->isExpanded()) {
+//                sidebar->hideSidebar();
+//            }
+//            else {
+//                sidebar->showSidebar();
+//            }
+//            });
+//    }
+//
+//protected:
+//    void resizeEvent(QResizeEvent* event) override {
+//        QMainWindow::resizeEvent(event);
+//        if (sidebar) {
+//            sidebar->resize(sidebar->width(), height());
+//        }
+//    }
+//
+//private:
+//    LogStateSidebar* sidebar;
+//    QPushButton* toggleButton;
+//};
+
+
+#endif  //__LOGSTATEPAGE_H__
+
+

+ 152 - 23
View/die-bonder-ui/Src/Sql/SqlOperation.cpp

@@ -18,9 +18,35 @@
 #include <string>
 #include "../common/JLogAllOutput.h"
 #include "../common/JMessageTip.h"
+#include "CManageDB.h"
 
 SqlOperation::SqlOperation()
 {
+    m_pCViewInterface.reset(ns_module::CViewInterface::GetInstance());
+    if (m_pCViewInterface == nullptr)
+    {
+        ErrorInfo(QObject::tr("SqlOperation:Initialization failed, please check", "初始化失败,请检查"));
+        return;
+    }
+
+    //注册回调
+    DataNoticeCallbackFun fun = std::bind(&SqlOperation::DataChange, this, std::placeholders::_1, std::placeholders::_2);
+    //模组
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, BONDHEAD_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, WAFERHEAD_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, WAFFLEHEAD_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, EJECTOR_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, WAFERTABLE_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, WAFER_CALIB_TABLE_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, BOND_TABLE_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, NOZZLE_TABLE_CONFIG_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(MODULECONFIG_DATABASE_NAME, ULTRAHEAD_TABLE_NAME, fun);
+    //标定
+    m_pCViewInterface->RecvDataChangNotice(CALIBCONFIG_DATABASE_NAME, CALIB_CTD_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(CALIBCONFIG_DATABASE_NAME, CALIB_XY_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(CALIBCONFIG_DATABASE_NAME, CALIB_R_TABLE_NAME, fun);
+    m_pCViewInterface->RecvDataChangNotice(CALIBCONFIG_DATABASE_NAME, FORCE_CONTROL_TABLE_NAME, fun);
 
 }
 
@@ -32,7 +58,7 @@ SqlOperation& SqlOperation::GetInstance()
 
 int SqlOperation::LoadSql()
 {
-    m_pCViewInterface.reset(ns_module::CViewInterface::GetInstance());
+
 
     // 获取构建目录路径
     QString buildDirPath = QCoreApplication::applicationDirPath();
@@ -249,18 +275,19 @@ int SqlOperation::loadAllControlData()
     }
 
     m_allControlData.clear();
-    QList<QString> dbList;
-    dbList.append("BondTable");
-    dbList.append("Ejector");
-    dbList.append("EutecticHead");
-    dbList.append("NozzleTable");
-    dbList.append("UltraHead");
-    dbList.append("WaferCalibTable");
-    dbList.append("WaferHead");
-    dbList.append("WaferTable");
-    dbList.append("WaffleCalibTable");
-    dbList.append("WaffleHead");
-    for (QString& dbName : dbList)
+    QList<QString> moduleTableNameList;
+    moduleTableNameList.append(BONDHEAD_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(WAFERHEAD_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(WAFFLEHEAD_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(EJECTOR_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(WAFERTABLE_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(WAFER_CALIB_TABLE_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(BOND_TABLE_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(NOZZLE_TABLE_CONFIG_TABLE_NAME);
+    moduleTableNameList.append(ULTRAHEAD_TABLE_NAME);
+
+    for (QString& dbName : moduleTableNameList)
     {
         Table_Control_Data controlDatas_module;
         vector<int> iGroupId;
@@ -292,6 +319,19 @@ int SqlOperation::loadAllControlData()
             m_allControlData.append(controlDatas_module);*/
     }
 
+
+    Table_Control_Data controlData;
+    int rtn = LoadControlDataFromModule(CALIB_XY_TABLE_NAME, controlData);  
+    if (rtn == 0) { m_allControlData.append(controlData); }
+
+
+    rtn = LoadControlDataFromModule(CALIB_CTD_TABLE_NAME, controlData);
+    if (rtn == 0) { m_allControlData.append(controlData); }
+
+    rtn = LoadControlDataFromModule(CALIB_R_TABLE_NAME, controlData);
+    if (rtn == 0) { m_allControlData.append(controlData); }
+
+
     for (auto it = m_mapAllDirectories.begin(); it != m_mapAllDirectories.end(); ++it)
     {
         for (int i = 0; i < it.value().size(); i++)
@@ -299,12 +339,21 @@ int SqlOperation::loadAllControlData()
             QJsonObject controlData = it.value()[i];
             if (controlData["IsThirdLevel"].toBool())
             {
-                QStringList tableNames = controlData["TableName"].toString().split(",");
-                for (const QString& name : tableNames)
+                QStringList tableNames = controlData["TableName"].toString().split(";");
+                for (const QString& tableAndGroup : tableNames)
                 {
+                    QString name = tableAndGroup.split(",")[0];
+                    if (isModuleTable(name) || name.isEmpty())
+                    {
+                        continue;
+                    }
                     Table_Control_Data controlDatas;
-                    int rtn = loadGivenTableControlData(name, controlDatas);
-                    //if (rtn != 0) return -1;
+                    rtn = loadGivenTableControlData(name, controlDatas);
+                    if (rtn != 0)
+                    {
+                        qDebug() << "read table fail : " << name;
+                        continue;
+                    }
                     m_allControlData.append(controlDatas);
                 }
                 
@@ -313,8 +362,8 @@ int SqlOperation::loadAllControlData()
     }
     //另外加载HomeProduct的控件数据
     Table_Control_Data controlDatas;
-    int rtn = loadGivenTableControlData(HOME_TABLE_NAME, controlDatas);
-    if (rtn != 0) return 0;
+    rtn = loadGivenTableControlData(HOME_TABLE_NAME, controlDatas);
+    if (rtn != 0) return rtn;
     m_allControlData.append(controlDatas);
     return 0;
 }
@@ -460,28 +509,50 @@ int SqlOperation::GetDirectories(QString tableName, const int& userPrivilege, QL
 int SqlOperation::GetThirdDirControlData(QString multiTableName, const int& userPrivilege, QList<Table_Control_Data>& data, bool& allChangeFlag)
 {
     allChangeFlag = true;
-    QStringList tableNames = multiTableName.split(",");
+    QStringList tableNames = multiTableName.split(";");
     for (const QString& name : tableNames)
     {
+        QStringList nameAndGroups = name.split(",");
+        vector<int> vecGroup;
+        for (int i = 1; i < nameAndGroups.size(); i++)
+        {
+            vecGroup.push_back(nameAndGroups[i].toInt());
+        }
+
         Table_Control_Data needControls;
         for (Table_Control_Data& tableData : m_allControlData)
         {
             //寻找表格对应的所有控件
-            if (tableData.tableName == name)
+            if (tableData.tableName == nameAndGroups[0])
             {
                 needControls.tableName = name;
 
                 //寻找用户等级对应的控件
                 for (CONFIG_BASE_STRUCT& value : tableData.controlDataList)
                 {
-                    //if (value.iUserGrade == userPrivilege)
+                    if (vecGroup.size() == 0)
                     {
                         needControls.controlDataList.append(value);
                         if (value.iChangeFlag == false)
                         {
                             allChangeFlag = false;
                         }
+                    } else
+                    {
+                        for (int& groupId : vecGroup)
+                        {
+                            //if (value.iUserGrade == userPrivilege)
+                            if (value.iGroupId == groupId)
+                            {
+                                needControls.controlDataList.append(value);
+                                if (value.iChangeFlag == false)
+                                {
+                                    allChangeFlag = false;
+                                }
+                            }
+                        }
                     }
+
                 }
                 
             }
@@ -546,5 +617,63 @@ void SqlOperation::ErrorInfo(const QString& strError)
 {
     JMessageTip::Message_question(strError);
     JLogAllOutput::cmd_debug(strError.toStdString());
-    exit(0);
+    //exit(0); //TODO: 关闭可以交给主界面
+}
+
+bool SqlOperation::isModuleTable(QString tableName)
+{
+    if (tableName == BONDHEAD_CONFIG_TABLE_NAME ||
+        tableName == WAFERHEAD_CONFIG_TABLE_NAME ||
+        tableName == WAFFLEHEAD_CONFIG_TABLE_NAME ||
+        tableName == EJECTOR_CONFIG_TABLE_NAME ||
+        tableName == WAFERTABLE_CONFIG_TABLE_NAME ||
+        tableName == WAFER_CALIB_TABLE_CONFIG_TABLE_NAME ||
+        tableName == WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME ||
+        tableName == BOND_TABLE_CONFIG_TABLE_NAME ||
+        tableName == NOZZLE_TABLE_CONFIG_TABLE_NAME ||
+        tableName == ULTRAHEAD_TABLE_NAME ||
+        tableName == CALIB_CTD_TABLE_NAME ||
+        tableName == CALIB_XY_TABLE_NAME ||
+        tableName == CALIB_R_TABLE_NAME)
+    {
+        return true;
+    }
+    return false;
+}
+
+int SqlOperation::LoadControlDataFromModule(std::string tableName, Table_Control_Data& controlData)
+{
+    QTextCodec* codec = QTextCodec::codecForName("GBK");
+    vector<int> vecCalibGroupId;
+    vector<CONFIG_BASE_STRUCT> vecCalibConfig;
+    int rtn = m_pCViewInterface->LoadConfigDB(tableName, vecCalibGroupId, vecCalibConfig);
+    if (rtn != OK)
+    {
+        JLogAllOutput::cmd_debug("读取底层表格数据出错");
+        return -1;
+    }
+    controlData.tableName = QString::fromStdString(tableName);
+    controlData.controlDataList.clear();
+    for (CONFIG_BASE_STRUCT& element : vecCalibConfig)
+    {
+        QString str;
+        if (element.strDescribe.size() > 0)
+        {
+            str = codec->toUnicode(element.strDescribe.data(), element.strDescribe.size());
+            element.strDescribe = str.toStdString();
+        }
+        if (element.strUnit.size() > 0)
+        {
+            str = codec->toUnicode(element.strUnit.data(), element.strUnit.size());
+            element.strUnit = str.toStdString();
+        }
+        controlData.controlDataList.append(element);
+    }
+    return 0;
+    //m_allControlData.append(controlData);
+}
+
+void SqlOperation::DataChange(string strDbName, string strTableName)
+{
+
 }

+ 35 - 10
View/die-bonder-ui/Src/Sql/SqlOperation.h

@@ -19,15 +19,15 @@
 #include "CViewInterface.h"
 #include <QMap>
 
-#define MENU_TABLE_NAME  "Menu"
-#define HOME_TABLE_NAME  "HomeProduct"
-#define Dir_Calibration_TABLE_NAME "Dir_Calibration"
-#define Dir_Diagnosis_TABLE_NAME "Dir_Diagnosis"
-#define Dir_Message_TABLE_NAME "Dir_Message"
-#define Dir_ModuleConfig_TABLE_NAME "Dir_ModuleConfig"
-#define Dir_ProductAssist_TABLE_NAME "Dir_ProductAssist"
-#define Dir_Programme_TABLE_NAME "Dir_Programme"
-#define Dir_SystemInfo_TABLE_NAME "Dir_SystemInfo"
+//#define MENU_TABLE_NAME  "Menu"
+//#define HOME_TABLE_NAME  "HomeProduct"
+//#define Dir_Calibration_TABLE_NAME "Dir_Calibration"
+//#define Dir_Diagnosis_TABLE_NAME "Dir_Diagnosis"
+//#define Dir_Message_TABLE_NAME "Dir_Message"
+//#define Dir_ModuleConfig_TABLE_NAME "Dir_ModuleConfig"
+//#define Dir_ProductAssist_TABLE_NAME "Dir_ProductAssist"
+//#define Dir_Programme_TABLE_NAME "Dir_Programme"
+//#define Dir_SystemInfo_TABLE_NAME "Dir_SystemInfo"
 
 
 
@@ -119,6 +119,12 @@ public:
 private:
     void ErrorInfo(const QString& strError);
 
+    bool isModuleTable(QString tableName);
+
+    int LoadControlDataFromModule(std::string tableName, Table_Control_Data& controlData);
+
+    void DataChange(string strDbName, string strTableName);
+
 private:
 
     std::unique_ptr<ns_module::CViewInterface> m_pCViewInterface;
@@ -134,7 +140,11 @@ private:
         ["Separator"];
         ["UserGrade"];
         ["Circle"];
-        ["TableName"];}
+        ["TableName"]:{
+                        []
+                        }
+        ;}
+        TableName 格式: BondHead,1,2
     */
 
     //每个三级目录下(可能包括多个数据表格) 对应的数据
@@ -154,6 +164,21 @@ private:
     /**页面配置信息
      */
     ST_APP_CONFIG                   m_appConifg;
+
+    //目录表名
+    const QString  MENU_TABLE_NAME = "Menu";
+    const QString  HOME_TABLE_NAME = "HomeProduct";
+    const QString  Dir_Calibration_TABLE_NAME = "Dir_Calibration";
+    const QString  Dir_Diagnosis_TABLE_NAME = "Dir_Diagnosis";
+    const QString  Dir_Message_TABLE_NAME = "Dir_Message";
+    const QString  Dir_ModuleConfig_TABLE_NAME = "Dir_ModuleConfig";
+    const QString  Dir_ProductAssist_TABLE_NAME = "Dir_ProductAssist";
+    const QString  Dir_Programme_TABLE_NAME = "Dir_Programme";
+    const QString  Dir_SystemInfo_TABLE_NAME = "Dir_SystemInfo";
+
+    //Module 表名
+
+
 };
 
 #endif  //__SQLOPERATION_H__

+ 1 - 1
View/die-bonder-ui/Src/common/JMessageTip.cpp

@@ -13,7 +13,7 @@ void JMessageTip::Message_information(const QString& strTip, QWidget* parent /*=
 
 QMessageBox::StandardButton JMessageTip::Message_question(const QString& strMsg, QWidget* parent /*= nullptr*/)
 {
-    return QMessageBox::information(nullptr, "Title", "Content", QMessageBox::Yes | QMessageBox::No);
+    return QMessageBox::information(nullptr, tr("error"), strMsg, QMessageBox::Yes | QMessageBox::No);
 }
 
 void JMessageTip::Message_warning(const QString& strMsg, QWidget* parent /*= nullptr*/)