Parcourir la source

最简单的 C++ CorelDRAW 插件 callcdr.cpp

蘭雅sRGB il y a 6 mois
Parent
commit
a28bae8da9

BIN
08_SmartGroup/LYVBA.ico


BIN
08_SmartGroup/Makefile


+ 9 - 9
08_SmartGroup/ToolsBox.cpp

@@ -201,15 +201,10 @@ INT_PTR CALLBACK ToolsBoxPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LP
         try {
             switch (LOWORD(wParam)) {
             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);
-
+                    double exp = GetTextValue(hDlg, EXP_TEXT);
                     Box_AutoGroup(cdr, exp);
 
-                //    MessageBox(NULL, "方框智能群组:Union-Find 算法\n 分组记录请查看: D:\\group.txt", "CPG代码测试", MB_ICONSTOP);
+// MessageBox(NULL, "方框智能群组:Union-Find 算法\n 分组记录请查看: D:\\group.txt", "CPG代码测试", MB_ICONSTOP);
                     Active_CorelWindows(hDlg);
                 }
                 break;
@@ -229,8 +224,12 @@ INT_PTR CALLBACK ToolsBoxPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LP
                 Active_CorelWindows(hDlg);
                 break;
 
-            case IDC_CLEAR_FILL:
-                Clear_Fill(cdr);
+            case IDC_CLEAR_FILL:{
+                    double exp = GetTextValue(hDlg, EXP_TEXT);
+                    BBox_DrawRectangle(cdr, exp);
+                    Active_CorelWindows(hDlg);
+                // Clear_Fill(cdr);
+                }
                 break;
 
             case IDC_SR_FLIP:
@@ -256,6 +255,7 @@ INT_PTR CALLBACK ToolsBoxPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LP
         }
 
     } else if (uMsg == WM_INITDIALOG) {
+             SetWindowText(::GetDlgItem(hDlg, EXP_TEXT), "0");
         return 1;
     }
     return 0;

+ 9 - 1
08_SmartGroup/ToolsBox.rc

@@ -22,7 +22,7 @@ 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, 21, 0, WS_EX_LEFT
     PUSHBUTTON      "CQL轮廓色相同", IDC_CQL_OUTLINE, 5, 2, 59, 24, 0, WS_EX_LEFT
-    PUSHBUTTON      "无填色", IDC_CLEAR_FILL, 74, 36, 59, 19, 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
@@ -31,3 +31,11 @@ FONT 8, "MS Shell Dlg", 400, 0, 1
     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
 }
+
+
+
+//
+// Icon resources
+//
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+IDI_ICON1          ICON           ".\\LYVBA.ico"

+ 19 - 16
08_SmartGroup/VBA_GMS/VbaCallCPG.bas

@@ -1,47 +1,50 @@
 Attribute VB_Name = "VbaCallCPG"
-Private Declare PtrSafe Function vbadll Lib "lycpg64.cpg" (ByVal code As Long) As Long
+Private Declare PtrSafe Function vbadll Lib "lycpg64.cpg" (ByVal code As Long, ByVal x As Double) As Long
 
-Sub VBA调用CPG_CDR复制物件到AI()
- ret = vbadll(2)
- MsgBox "CDR复制物件到AI 功能 " & ret
+Sub VBA璋冪敤CPG_CDR澶嶅埗鐗╀欢鍒癆I()
+ ret = vbadll(2, 0)
+ MsgBox "CDR澶嶅埗鐗╀欢鍒癆I 鍔熻兘 " & ret
 End Sub
 
-Sub AI复制物件到CDR()
- ret = vbadll(1)
- MsgBox "AI复制物件到CDR 功能 " & ret
+Sub AI澶嶅埗鐗╀欢鍒癈DR()
+ ret = vbadll(1, 0)
+ MsgBox "AI澶嶅埗鐗╀欢鍒癈DR 鍔熻兘 " & ret
 End Sub
 
 Sub Clear_Fill()
- ret = vbadll(3)
- MsgBox "Clear_Fill功能 " & ret
+ ret = vbadll(3, 0)
+ MsgBox "Clear_Fill鍔熻兘 " & ret
 End Sub
 
 
 Sub cql_FillColor()
- ret = vbadll(5)
+ ret = vbadll(5, 0)
 End Sub
 
 
 Sub Shapes_Filp()
- ret = vbadll(4)
+ ret = vbadll(4, 0)
 End Sub
 
 Sub cql_OutlineColor()
- ret = vbadll(6)
+ ret = vbadll(6, 0)
 End Sub
 
 Sub cql_SameSize()
- ret = vbadll(7)
+ ret = vbadll(7, 0)
 End Sub
 
 Sub fill_red()
- ret = vbadll(8)
+ ret = vbadll(8, 0)
 End Sub
 
+'// 绗�9鍙峰姛鑳�: 鎸夎竟鐣屾壒閲忕粯鍒剁煩褰�  鍙傛暟:姝f暟鍚戝�锛岃礋鏁板悜鍐�
 Sub BBox_DrawRectangle()
- ret = vbadll(9)
+ ret = vbadll(9, -2#)
 End Sub
 
+'// 绗�10鍙峰姛鑳�: 鏅鸿兘缇ょ粍鍔熻兘  鍙傛暟:姝f暟 鍚戝�瀹瑰樊  璐熸暟 鍚戝唴瀹瑰樊
 Sub Box_AutoGroup()
- ret = vbadll(10)
+ ret = vbadll(10, -2#)
 End Sub
+

+ 13 - 3
08_SmartGroup/boxAutoGroup.cpp

@@ -58,17 +58,27 @@ bool isOverlapped(const BoundingBox &a, const BoundingBox &b) {
   return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
 } // 函数使用AABB(Axis-Aligned Bounding Box)碰撞检测
 
-bool BBox_DrawRectangle(corel *cdr) {
+bool BBox_DrawRectangle(corel *cdr, double exp) {
   BoundingBox box;
   auto sr = cdr->ActiveSelectionRange; // 获得选择范围
   auto al = cdr->ActiveLayer;          // 获得当前层
   if (!sr || !al) return false;
+  
+  BeginOpt(cdr);
+  auto srs = cdr->CreateShapeRange();
 
   // CorelDRAW Shapes 物件 Item 编号从1开始
   for (auto i = 0; i != sr->Count; i++) {
     sr->Shapes->Item[i + 1]->GET_BOUNDING_BOX(box); // 获得Shapes的BoundingBox,赋值到box
-    al->CreateRectangle2(box.x, box.y, box.w, box.h, ZERO_4PC); // 使用BoundingBox box 创建一个矩形
+    if (fabs(exp) > 0.02 ) { box.w += 2 * exp; box.h += 2 * exp; box.x -= exp; box.y -= exp; }
+    
+    auto s = al->CreateRectangle2(box.x, box.y, box.w, box.h, ZERO_4PC); // 使用BoundingBox box 创建一个矩形
+    s->Outline->Color->RGBAssign(0, 255, 0);
+    srs->Add(s);
   }
+  srs->CreateSelection();
+  
+  EndOpt(cdr);
   return true;
 }
 
@@ -96,7 +106,7 @@ bool Box_AutoGroup(corel *cdr, double exp) {
   }
 
   // 扩展边界框,或者收缩边界框
-  if (abs(exp) > 0.01 ) {
+  if (fabs(exp) > 0.02 ) {
     expand_bounding_boxes(boxes, exp);
   }
 

+ 10 - 0
08_SmartGroup/cdrapi.cpp

@@ -1,4 +1,5 @@
 #include <windows.h>
+#include <stdio.h>
 #include "cdrapi.h"
 
 void BeginOpt(corel *cdr)
@@ -24,4 +25,13 @@ void Active_CorelWindows(HWND hDlg)
 {                
   // 将焦点返回到父窗口 关闭对话框窗口
   SetFocus(GetParent(hDlg));
+}
+
+double GetTextValue(HWND hDlg, int IDITEM) {
+    char ibuf[64];
+    memset(ibuf, 0, sizeof(ibuf));
+    GetWindowText(::GetDlgItem(hDlg, IDITEM), ibuf, sizeof(ibuf));
+    double exp = 0.0;
+    sscanf_s(ibuf, "%lf", &exp);
+    return exp;
 }

+ 1 - 0
08_SmartGroup/cdrapi.h

@@ -13,5 +13,6 @@ using namespace VGCore;
 void BeginOpt(corel *cdr);
 void EndOpt(corel *cdr);
 void Active_CorelWindows(HWND hDlg);
+double GetTextValue(HWND hDlg, int IDITEM);
 
 #endif // CDRAPI_H_INCLUDED

+ 1 - 1
08_SmartGroup/cdrapp.h

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

+ 1 - 0
08_SmartGroup/resource.h

@@ -3,6 +3,7 @@
 #endif
 
 #define IDD_TOOLS_BOX                           100
+#define IDI_ICON1                               101
 #define IDC_RED                                 40000
 #define IDC_CQL_FILL                            40001
 #define IDC_CQL_OUTLINE                         40002

+ 3 - 3
08_SmartGroup/vbadll.cpp

@@ -4,7 +4,7 @@
 
 extern corel *cdr;
 extern "C" __declspec(dllexport)
-int __stdcall vbadll(int code){
+int __stdcall vbadll(int code, double x =0.0){
 
 try {
     switch(code){
@@ -41,11 +41,11 @@ try {
         break;
 
         case 9:
-            BBox_DrawRectangle(cdr);
+            BBox_DrawRectangle(cdr, x);
         break;
 
         case 10:
-            Box_AutoGroup(cdr, 0.0);
+            Box_AutoGroup(cdr, x);
         break;
 
         default:

+ 41 - 0
base/callcdr.cpp

@@ -0,0 +1,41 @@
+#import "VGCoreAuto.tlb"
+#include <Windows.h>
+
+#define corel VGCore::IVGApplication
+using namespace VGCore;
+
+void Call_CorelDRAW();
+bool fill_red(corel *cdr);
+
+corel *cdr = NULL;
+int main() {
+  HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+  if (SUCCEEDED(hr)) {
+    try {
+      Call_CorelDRAW();
+
+    } catch (_com_error &e) {
+      MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
+    }
+    CoUninitialize();
+  }
+  return 0;
+}
+void Call_CorelDRAW() {
+  IVGApplicationPtr app(L"CorelDRAW.Application.16");  // 我的电脑 X6 正常 ; 毛子版 CorelDRAW 2020  绑定不上,没法使用
+  app->Visible = VARIANT_TRUE;
+
+  auto doc = app->ActiveDocument;
+  if (!doc)
+    doc = app->CreateDocument();
+
+  cdr = app;
+  fill_red(cdr);
+}
+
+bool fill_red(corel *cdr) {
+  auto sr = cdr->ActiveSelectionRange;
+  auto red = cdr->CreateCMYKColor(0, 100, 100, 0);
+  sr->ApplyUniformFill(red);
+  return true;
+}