Răsfoiți Sursa

智能群组,增加容差值

Hongwenjun 6 luni în urmă
părinte
comite
22d6bd917e

+ 12 - 5
08_SmartGroup/ToolsBox.cpp

@@ -200,11 +200,18 @@ INT_PTR CALLBACK ToolsBoxPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LP
     if (uMsg == WM_COMMAND) {
         try {
             switch (LOWORD(wParam)) {
-            case IDC_RED :
-                Box_AutoGroup(cdr);
-
-            //    MessageBox(NULL, "方框智能群组:Union-Find 算法\n 分组记录请查看: D:\\group.txt", "CPG代码测试", MB_ICONSTOP);
-                Active_CorelWindows(hDlg);
+            case IDC_RED :{
+                    char ibuf[64];
+                    memset(ibuf, 0, 64);
+                    GetWindowText(::GetDlgItem(hDlg, EXP_TEXT), ibuf, 64);
+                    double exp = 0.0;
+                    sscanf(ibuf, "%lf", &exp);
+
+                    Box_AutoGroup(cdr, exp);
+
+                //    MessageBox(NULL, "方框智能群组:Union-Find 算法\n 分组记录请查看: D:\\group.txt", "CPG代码测试", MB_ICONSTOP);
+                    Active_CorelWindows(hDlg);
+                }
                 break;
 
             case IDC_CQL_OUTLINE:

+ 7 - 11
08_SmartGroup/ToolsBox.rc

@@ -10,28 +10,24 @@
 
 
 
-//
-// Bitmap resources
-//
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
-
 //
 // Dialog resources
 //
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-IDD_TOOLS_BOX DIALOGEX 0, 0, 136, 125
+IDD_TOOLS_BOX DIALOGEX 0, 0, 136, 127
 STYLE DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU
 CAPTION "蘭雅 CPG 插件 福利群版"
 FONT 8, "MS Shell Dlg", 400, 0, 1
 {
     CTEXT           "蘭雅 CorelDRAW CPG 插件 2024.8.8 智能群组版", 0, 21, 105, 94, 17, SS_CENTER, WS_EX_LEFT
-    PUSHBUTTON      "方框智能群组", IDC_RED, 73, 2, 59, 24, 0, WS_EX_LEFT
+    PUSHBUTTON      "方框智能群组", IDC_RED, 73, 2, 59, 21, 0, WS_EX_LEFT
     PUSHBUTTON      "CQL轮廓色相同", IDC_CQL_OUTLINE, 5, 2, 59, 24, 0, WS_EX_LEFT
-    PUSHBUTTON      "无填色", IDC_CLEAR_FILL, 73, 26, 59, 24, 0, WS_EX_LEFT
-    PUSHBUTTON      "批量镜像", IDC_SR_FLIP, 73, 52, 59, 24, 0, WS_EX_LEFT
-    PUSHBUTTON      "CQL颜色相同", IDC_CQL_FILL, 5, 26, 59, 24, 0, WS_EX_LEFT
+    PUSHBUTTON      "无填色", IDC_CLEAR_FILL, 74, 36, 59, 19, 0, WS_EX_LEFT
+    PUSHBUTTON      "批量镜像", IDC_SR_FLIP, 73, 57, 59, 19, 0, WS_EX_LEFT
+    PUSHBUTTON      "CQL颜色相同", IDC_CQL_FILL, 5, 27, 59, 24, 0, WS_EX_LEFT
     PUSHBUTTON      "CQL尺寸相同", IDC_CQL_SIZE, 5, 52, 59, 24, 0, WS_EX_LEFT
     PUSHBUTTON      "CDR复制到AI", IDC_CDR2AI, 6, 78, 59, 24, 0, WS_EX_LEFT
     PUSHBUTTON      "AI粘贴到CDR", IDC_AI2CDR, 74, 78, 59, 24, 0, WS_EX_LEFT
+    LTEXT           "容差:(mm)", EXP_LT, 72, 25, 37, 9, SS_LEFT, WS_EX_LEFT
+    EDITTEXT        EXP_TEXT, 107, 23, 28, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_DLGMODALFRAME
 }

+ 19 - 1
08_SmartGroup/boxAutoGroup.cpp

@@ -5,6 +5,7 @@
 #include <iostream>
 #include <fstream>
 #include <chrono>
+#include <math.h>
 
 #define GET_BOUNDING_BOX(box)                                                  \
   GetBoundingBox(&(box).x, &(box).y, &(box).w, &(box).h, false)
@@ -18,6 +19,18 @@ typedef struct {
   double h; // 高度
 } BoundingBox;
 
+// 扩展边界框
+void expand_bounding_boxes(std::vector<BoundingBox>& boxes, double exp) {
+    for (auto& box : boxes) {
+        // 扩展宽度和高度
+        box.w += 2 * exp; // 左右各扩展
+        box.h += 2 * exp; // 上下各扩展
+        // 调整左下角坐标
+        box.x -= exp; // 向左扩展
+        box.y -= exp; // 向下扩展
+    }
+}
+
 double get_bounding_box_area(BoundingBox box) { return box.w * box.h; }
 
 // 自定义比较函数,按 BoundingBox 的面积大小进行排序
@@ -62,7 +75,7 @@ bool BBox_DrawRectangle(corel *cdr) {
 // 快速分组重叠的区域, 使用算法"Union-Find" 算法。这个算法可以有效地处理这种并集问题。
 // 算法的时间复杂度为 O(n^2),其中 n 是矩形的数量。如果矩形数量较多,可以考虑使用更高效的算法,
 // 例如使用四叉树(Quadtree)或者区间树(Interval Tree)等数据结构来加速计算。
-bool Box_AutoGroup(corel *cdr) {
+bool Box_AutoGroup(corel *cdr, double exp) {
   BoundingBox box;
 
   auto sr = cdr->ActiveSelectionRange; // 获得选择范围
@@ -82,6 +95,11 @@ bool Box_AutoGroup(corel *cdr) {
     parent.push_back(i);
   }
 
+  // 扩展边界框,或者收缩边界框
+  if (abs(exp) > 0.01 ) {
+    expand_bounding_boxes(boxes, exp);
+  }
+
   // 实现 Union-Find 算法来合并重叠的区域
   for (int i = 0; i < boxes.size(); i++) {
     for (int j = i + 1; j < boxes.size(); j++) {

+ 1 - 1
08_SmartGroup/cdrapp.h

@@ -13,7 +13,7 @@ bool Clear_Fill(corel *cdr);
 void CdrCopy_to_AdobeAI(corel *cdr);
 void AdobeAI_Copy_ImportCdr(corel *cdr);
 
-bool Box_AutoGroup(corel *cdr);
+bool Box_AutoGroup(corel *cdr, double exp = 0.0);
 bool BBox_DrawRectangle(corel *cdr);
 
 #endif // CDRAPP_H_INCLUDED

+ 2 - 0
08_SmartGroup/resource.h

@@ -11,3 +11,5 @@
 #define IDC_CLEAR_FILL                          40005
 #define IDC_CDR2AI                              40006
 #define IDC_AI2CDR                              40007
+#define EXP_LT                                  40008
+#define EXP_TEXT                                40009

+ 1 - 1
08_SmartGroup/vbadll.cpp

@@ -45,7 +45,7 @@ try {
         break;
 
         case 10:
-            Box_AutoGroup(cdr);
+            Box_AutoGroup(cdr, 0.0);
         break;
 
         default: