From 87b19bd94359bff02108b7267cbfdc38e9e7553c Mon Sep 17 00:00:00 2001 From: wangbing Date: Thu, 25 Sep 2025 16:44:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- legend/我的电脑#L22,10.png | Bin 1403 -> 0 bytes legend/我的电脑.png | Bin 0 -> 2060 bytes ...#L409,528.png => 我的电脑窗口.png} | Bin src/main/java/xyz/wbsite/jmacro/JMacro.java | 24 ++++- src/main/java/xyz/wbsite/jmacro/JRoot.java | 39 -------- .../java/xyz/wbsite/jmacro/base/Legend.java | 28 ------ .../java/xyz/wbsite/jmacro/tool/Measure.java | 6 +- .../xyz/wbsite/jmacro/tool/PickLegend.java | 89 ++++++++++++------ .../xyz/wbsite/jmacro/tool/PickPoint.java | 4 +- .../java/xyz/wbsite/jmacro/tool/PickRect.java | 4 +- .../java/xyz/wbsite/jmacro/util/Logger.java | 1 + src/main/java/xyz/wbsite/jtask/TaskImpl.java | 2 +- 12 files changed, 88 insertions(+), 109 deletions(-) delete mode 100644 legend/我的电脑#L22,10.png create mode 100644 legend/我的电脑.png rename legend/{我的电脑窗口#L409,528.png => 我的电脑窗口.png} (100%) delete mode 100644 src/main/java/xyz/wbsite/jmacro/JRoot.java diff --git a/legend/我的电脑#L22,10.png b/legend/我的电脑#L22,10.png deleted file mode 100644 index 1288d9ba579c1487f5761720f06ecefda5fe9202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1403 zcmV->1%&#EP)X1^@s6CN-WK000F-Nkl*=1o_4mlLFf8*Wrd_JG=u{cFD&Gf^2c9;cT^M1dd=lS^6H1&aXrp1nyPRIWu zX8CF0>Nj?xqUu$pS5Uq~s%-nqx=JcvLMf?aTeVUZiYt`Lcc6$>ww*q=qp++J1*NQQ z^0Q#_dD64+m05kA~nLn{{`XQdb`v*3RKfs332UtHci?reUSm(Znb%Xb?c3=i; z>@!H|okEIj3Q5*UBzE0J!X47>3BL!<+?Vk~YlWd)mu@W$mUFtm&uw`zK9uX_|$iVQ6ZV{^lx(Mh*@M+S?0ayymU|J8^ zqny@c0w#4%>al7)#@r;Bm{zZvRxbhBArHBNc?4lF-rN8k}Vvhs>d zU|RmU>k&(_#)<E(!O_Np@{*F%rh++)2w0>N63#~pgC0V39ZBUa7jZUTN`#iGx;@zky^q-WgpdGtnxYYw%mb5?d4JZC** zkH)kv*(ZUTO93R83wJ4(A9P~DdmZq9rvp#C)s8J$xdxb@DxZC1AWv(ZL!3EttjkR6 zVFvod`mu~v0Li8Q+Z}j(XFDEy^ENhTSWK6z>NW9PDl>WaJWMjJL6bcn=^6*kYy>ZG{Ey|_tkzM)f_k?wEN&usX5=z zC%?b@$MdPSt{$}~49)lZdzyUZ_irHAti$MakHO{|h1Karx5I-|=bK24;`8){CbZcG z(c0s}EvpmPI|gw0y8XX{U);16o6@r%k=7YY`&s*r|K^{-e*xL1taT))1rPuL002ov JPDHLkV1jD0qMQH# diff --git a/legend/我的电脑.png b/legend/我的电脑.png new file mode 100644 index 0000000000000000000000000000000000000000..e0363db46189fe0b555638465ca1706bb5e65578 GIT binary patch literal 2060 zcmV+n2=n)eP)^bTG@brDZ-+S-O5F0M%n4UH*=R9X-?)sVMdEW0G z42Mga@Si5be+|?}6&6&~wESDd_tFKm_0>Jtv}L=ZZP@s-RO;s6YD!6e1sg~yX$!)}u2C%S7{T)P5j@*EjAfQ#1UC*MxM2`W>j$u;){ezrldAd=c>68_Z{0<} z%|7^-_2QW?dg1rE4ZffCVBxiHEG+3pY|=)3Q0&U{1NRZuufW*u;koX61VcdWqjB78EyAYe0 zsuPOhS&TrNaz=q!bh}?T6Hvi0HsOwM zX^#L}Krjogb_*DvOP%n!(4ilSJ0qjICu1U@Wi3NmR6%!0b%PRyqFUq>m48LAh{}(h zQDD@l<`8F-!Fvh1K`&zS$9txF`zE$f@Nb|5LaZvrB zjEZ2Eusd3B2&Q6uZ@NWP+#81Rx!571k}y_+X~XPuq_eFsCg_Et5tqG@Qx!xoOKS$S zsMOy0mlKGXDw{G@HiBVixWt{9cbO!j>JZM%EhKk7lrXak+A!-(E286)^+EAk!@Xf= zII6`WDgvV31n`I}y%8nWMqEZU-x)@UYHp!b!U%WT@N|9)yz(sYJY_*tT#`;GTKL9~ zcmPEeC`Py2NjO&f9U&AiJ>R0QKg?g$v_%^W4FSp}_l`h9{qZGqQG3uc;{5E+}O z4~kdg#b5V}1yI0Z;IuJdvkBj%M#E1Sh_RkgEj?*++i4UXXc4!cpPuS zjAM<6jL{24kB2}Jm0WN9mEJgyxQL2J{BoyoNA||*fMItCW>!7{<+X^YJPBszdrk1j zC7_%}xWC(oh?oR@Q2eaY9t~eQ9u2yz%OiIXVT{)Y#Scvh(<9t*^hOzRWi{rg7-p^lBch@bb8l1_&l466W(GMk z{cQ>Ji^HUY^;oYPik{%Ur8ec!AV*w_%DFd%asiyJ_U25B7S&7h(iF6z)0KwgbqM*NJNDgk41OqFovZ3X5q!BA9gZ?Zde0%+QwYcO@68EYeB^g+eZ zZyX=h8Fe-OSaxUjxDl7VaZHu_yAnoqN5GIfPaRO)`AZF^WtuVdbu*s$Q#IB`#p;9N zpA#yGAaQ>?o8cl#^Zac@z@`$@KS_P=Ze1Ncj6~S zOyUOdz~m>nF+Lg5tT!pYo0mCvT zr|W~7NaHVZ_}D3-?A+5*$wXhsBCD*?K@U{Ro{ji=2o1%Vfk^PR5B1Z5dZVZcdkad1 z{&4()i+CIF9}jild=*~LFU8K>3qt&!w>@nC_JjFC>T#-e9lt2Fui$fJ6;-=J@r}1# zAHsv$VkGR$BIV)Q-)%TS@3$Sw*T9@_lD01gi94^L5uM0=We>g265G_9%VTb!3F_Yi zT*;Ehv0l6R9c}BPb6-Oeea<*k0E6ldyTKsgr>q$JA_rknsiaJtAG6>fy^o|Dre)>` zxWqym^!&A4%0U#J7oKtswPU3)25iLH;ZYP`Z2Z?J{i6*A;m)CAa^yP{ZjXZZeltcc z?Sgk;2#GE-V#aRoh42r30Y{sG#n$pQD>?$4UYYUY(0us1nBouZ|MiGCq4C zj^)q(%d=5AT!=737)*9MPOtHVPe2H5e?jgKT_wclv0DbVIFVv18oMtJHe{4xAa5O} zOql|MxJVf?3>mmdUt*MC`9y#E2LR@5abYiSU%0vNMj7}x1KehKiEYLYM`1n^CHH&m zMuldD9i}jYxb}&G3hZ?E#Lu4CfpR*6zZ75Jz?p}qyd`WE2NRUze7cogUWkE1eiJR^ zxwlGJe3ko`;jyVt;_+!aP%&^ybIKIv__F+E%89uA)oBRN8x&u}ke+#rZnTT22Q(MZzB#8O$BQ}XjN;Z*gTt0#a`OsLpFZaoU9+nHjU(75>AJiHM8{-CQ< qF7Y`#We0JhEW>~>lO4DA`r@DOFI_V7PUtWI0000 MAX_DELAY) { - throw new IllegalArgumentException("Delay must be to 0 to 60,000ms"); - } - } -} diff --git a/src/main/java/xyz/wbsite/jmacro/base/Legend.java b/src/main/java/xyz/wbsite/jmacro/base/Legend.java index 2c002b0..8dc629e 100644 --- a/src/main/java/xyz/wbsite/jmacro/base/Legend.java +++ b/src/main/java/xyz/wbsite/jmacro/base/Legend.java @@ -2,10 +2,7 @@ package xyz.wbsite.jmacro.base; import cn.hutool.cache.Cache; import cn.hutool.cache.CacheUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ReUtil; -import org.sikuli.script.Location; import xyz.wbsite.jmacro.util.ImageUtil; import xyz.wbsite.jmacro.util.Logger; @@ -15,13 +12,6 @@ import java.util.List; /** * 图例 - *

- * 图例分带坐标和不带坐标图例 - *

- * 其中带坐标图例,通过将坐标融合进文件名称实现,定义如下 - * 以something#L0,0.png为例 - * 图例名称:something - * 图例坐标:#L0,0(在实例化时转为location) * * @author wangbing * @version 0.0.1 @@ -54,11 +44,6 @@ public class Legend { */ private String name; - /** - * 图例坐标 - */ - private Location location; - public static void setDefaultBase(File base) { defaultBase = base; } @@ -93,15 +78,6 @@ public class Legend { newLegend.base = defaultBase; newLegend.file = file; newLegend.name = name; - - if (!file.getName().matches("[\\S\\s]+#L[0-9]+,[0-9]+\\.png")) { - newLegend.location = null; - } else { - int x = Convert.toInt(ReUtil.get("[\\S\\s]+#L([0-9]+),[0-9]+\\.png", file.getName(), 1), 0); - int y = Convert.toInt(ReUtil.get("[\\S\\s]+#L[0-9]+,([0-9]+)\\.png", file.getName(), 1), 0); - newLegend.location = new Location(x, y); - } - fileCache.put(name, newLegend); return newLegend; } @@ -121,8 +97,4 @@ public class Legend { public String getName() { return name; } - - public Location getLocation() { - return location; - } } diff --git a/src/main/java/xyz/wbsite/jmacro/tool/Measure.java b/src/main/java/xyz/wbsite/jmacro/tool/Measure.java index f66428f..bdd73e0 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/Measure.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/Measure.java @@ -118,14 +118,12 @@ public class Measure extends JFrame { int top = getCaptureY(); int right = getCaptureX() + getCaptureWidth(); int bottom = getCaptureY() + getCaptureHeight(); - Logger.info("=========================测量距离========================="); + Logger.info("↓↓↓↓↓测量距离↓↓↓↓↓"); Logger.info("水平距离:{}px", getCaptureWidth()); Logger.info("垂直距离:{}px", getCaptureHeight()); - Logger.info("用法示例:"); Logger.info("1、区域点击:mouseLeftClick(of({},{},{},{}));", left - originX, top - originY, right - originX, bottom - originY); - - Logger.info("=========================测量距离========================="); + Logger.info("↑↑↑↑↑测量距离↑↑↑↑↑"); close(); } }); diff --git a/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java b/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java index e37452f..b88def6 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java @@ -11,10 +11,17 @@ import xyz.wbsite.jmacro.util.Logger; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; -import java.awt.event.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.prefs.Preferences; /** @@ -201,8 +208,7 @@ public class PickLegend extends JFrame { // 上一次保存目录 String lastPath = preferences.get(LAST_PATH, ""); // 默认文件名 - String location = "L" + (getCaptureX() - originX) + "," + (getCaptureY() - originY); - String filename = StrUtil.format("{}#{}.png", System.currentTimeMillis(), location); + String filename = StrUtil.format("{}.png", System.currentTimeMillis()); JFileChooser jFileChooser = new JFileChooser(); jFileChooser.setFileFilter(new FileNameExtensionFilter("png", "png")); @@ -211,38 +217,61 @@ public class PickLegend extends JFrame { jFileChooser.setSelectedFile(new File(filename)); int returnVal = jFileChooser.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { - // 默认文件 - File file = jFileChooser.getSelectedFile(); - String name = file.getName().replaceAll("\\.png", ""); - String legendName = name.split("#")[0]; - String prefix = legendName + "#"; - - List files = FileUtil.loopFiles(Legend.getDefaultBase(), pathname -> pathname.getName().startsWith(prefix)); - if (files.size() > 0) { - DialogUtil.confirm("提示", "存在相同图例,是否旧的删除?", result -> { - if (result) { - for (File file1 : files) { - boolean delete = file1.delete(); - if (!delete) { - Logger.info("删除失败,{}", file1.getAbsolutePath()); - } - } - } - }); + File selectedFile = jFileChooser.getSelectedFile(); + String legendName = selectedFile.getName(); + if (!legendName.endsWith(".png")) { + legendName += ".png"; } - // 图例文件名 - filename = StrUtil.format("{}#{}.png", legendName, location); - file = new File(file.getParent(), filename); + File parentDir = selectedFile.getParentFile(); + String finalLegendName = legendName; - Logger.info("保存路径" + file); - ImgUtil.cut(capture, file, new Rectangle(getCaptureX(), getCaptureY(), getCaptureWidth(), getCaptureHeight())); + // 提取公共的保存逻辑 + Runnable saveAction = () -> { + File targetFile = new File(parentDir, finalLegendName); + doSave(targetFile); + close(); + }; - preferences.put(LAST_PATH, file.getParent()); - Logger.info("保存目录" + file.getParent()); - Logger.info("保存地址" + file); + List existingFiles = FileUtil.loopFiles(Legend.getDefaultBase(), + pathname -> pathname.getName().equals(finalLegendName)); + + if (existingFiles.isEmpty()) { + saveAction.run(); + } else { + DialogUtil.confirm("提示", "存在相同图例,是否覆盖?", result -> { + if (result) { + saveAction.run(); + } else { + close(); // 用户取消时也关闭窗口 + } + }); + } + } else { + close(); // 用户取消选择时关闭窗口 } - close(); + } + + private void doSave(File targetFile) { + Logger.info("↓↓↓↓↓区域采集↓↓↓↓↓"); + + Logger.info("图例名称:{}", targetFile.getName().replaceAll("\\.png","")); + + Logger.info("保存路径 {}", targetFile); + ImgUtil.cut(capture, targetFile, new Rectangle( + getCaptureX(), + getCaptureY(), + getCaptureWidth(), + getCaptureHeight() + )); + + preferences.put(LAST_PATH, targetFile.getParent()); + Logger.info("保存目录 {}", targetFile.getParent()); + Logger.info("保存地址 {}", targetFile); + Logger.info("用法示例:"); + Logger.info("查找图例:findLegend(\"{}\", 0.9)",targetFile.getName().replaceAll("\\.png","")); + Logger.info(""); + Logger.info("↑↑↑↑↑区域采集↑↑↑↑↑"); } public void close() { diff --git a/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java b/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java index a5e3f2b..6ed7ed0 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java @@ -99,7 +99,7 @@ public class PickPoint extends JFrame { super.mouseReleased(e); x = e.getX(); y = e.getY(); - Logger.info("=========================坐标采集========================="); + Logger.info("↓↓↓↓↓坐标采集↓↓↓↓↓"); Logger.info("屏幕坐标:[{},{}]", x, y); Logger.info("相对坐标:[{},{}]", x - originX, y - originY); String hexColor = Integer.toHexString(capture.getRGB(x, y) & 0xFFFFFF); @@ -108,7 +108,7 @@ public class PickPoint extends JFrame { Logger.info("用法示例:"); Logger.info("1、点击坐标:macro.mouseLeftClick(macro.of({},{}));", x - originX, y - originY); Logger.info("2、色值比对:macro.matchColor(macro.of({},{},\"#{}\"));", x - originX, y - originY, hexColor); - Logger.info("=========================坐标采集========================="); + Logger.info("↑↑↑↑↑坐标采集↑↑↑↑↑"); close(); JOptionPane.showMessageDialog(null, StrUtil.format("屏幕坐标:[{},{}]\n相对坐标:[{},{}]\n坐标色值:[#{}]", x, y, x - originX, y - originY, hexColor), "坐标信息", 1); diff --git a/src/main/java/xyz/wbsite/jmacro/tool/PickRect.java b/src/main/java/xyz/wbsite/jmacro/tool/PickRect.java index e300f1b..6a55e74 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/PickRect.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/PickRect.java @@ -117,7 +117,7 @@ public class PickRect extends JFrame { int top = getCaptureY(); int right = getCaptureX() + getCaptureWidth(); int bottom = getCaptureY() + getCaptureHeight(); - Logger.info("=========================区域采集========================="); + Logger.info("↓↓↓↓↓区域采集↓↓↓↓↓"); Logger.info("屏幕区域:[{},{},{},{}]", left, top, right, bottom); Logger.info("相对区域:[{},{},{},{}]", left - originX, top - originY, right - originX, bottom - originY); Logger.info("-------------------"); @@ -155,7 +155,7 @@ public class PickRect extends JFrame { Logger.info("区域查色:macro.findColor(macro.of({},{},{},{}), \"{}\");", left - originX, top - originY, right - originX, bottom - originY, topColor.get(0)); Logger.info("区域找色:macro.hasColor(macro.of({},{},{},{}), \"{}\");", left - originX, top - originY, right - originX, bottom - originY, String.join("\",\"", topColor)); - Logger.info("=========================区域采集========================="); + Logger.info("↑↑↑↑↑区域采集↑↑↑↑↑"); close(); } }); diff --git a/src/main/java/xyz/wbsite/jmacro/util/Logger.java b/src/main/java/xyz/wbsite/jmacro/util/Logger.java index fd58997..d289e2c 100644 --- a/src/main/java/xyz/wbsite/jmacro/util/Logger.java +++ b/src/main/java/xyz/wbsite/jmacro/util/Logger.java @@ -24,6 +24,7 @@ public class Logger { String level = Level.INFO.toString(); // 格式化日志信息 String log = StrUtil.format(format, arg); + System.out.println(log); // 获取调用者类名 String name = CallerUtil.getCallerCaller().getSimpleName(); // 获取当前线程的堆栈追踪 diff --git a/src/main/java/xyz/wbsite/jtask/TaskImpl.java b/src/main/java/xyz/wbsite/jtask/TaskImpl.java index af7ad2f..e9e1b7b 100644 --- a/src/main/java/xyz/wbsite/jtask/TaskImpl.java +++ b/src/main/java/xyz/wbsite/jtask/TaskImpl.java @@ -35,7 +35,7 @@ public class TaskImpl extends JMacro { return; } - Logger.info("启动图标坐标:", launch.toString()); + Logger.info("启动图标坐标:{}", launch.getRect().toString()); Logger.info("移动鼠标"); mouseMove(launch.getCenter()); Logger.info("双击我的电脑");