// ==UserScript== // @name 点云标注-指定标签批注(不填备注) // @namespace http://tampermonkey.net/ // @version 3.6 // @description F2:打开弹窗→点开下拉→选属性错误→直接点确定,跳过备注填写 // @author You // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); // 工具栏第5个按钮,数组下标4 function getTargetCommentBtn() { const toolBtns = document.querySelectorAll('div[role="toolbar"] button,.toolbar button,header button'); const btnArr = Array.from(toolBtns); const targetBtn = btnArr[4]; if(targetBtn){ const rect = targetBtn.getBoundingClientRect(); if(rect.width>20 && rect.height>20){ return targetBtn; } } return null; } // 等待元素出现 async function waitElement(selector, timeout=3000){ const start = Date.now(); while(Date.now()-start < timeout){ const el = document.querySelector(selector); if(el) return el; await sleep(120); } return null; } // 根据文本查找dom function findByText(text){ const all = document.querySelectorAll('*'); for(let el of all){ if(el.textContent && el.textContent.trim() === text){ return el; } } return null; } // 模拟鼠标点击,双重兜底 async function realClick(el){ if(!el) return; const rect = el.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; el.dispatchEvent(new MouseEvent('mousedown', {clientX:x, clientY:y, bubbles:true})); await sleep(40); el.dispatchEvent(new MouseEvent('mouseup', {clientX:x, clientY:y, bubbles:true})); await sleep(40); el.dispatchEvent(new MouseEvent('click', {clientX:x, clientY:y, bubbles:true})); el.click(); } async function runTask(){ console.log("\n=====【开始整套批注(跳过备注)】====="); // 步骤1:点击工具栏批注按钮,打开弹窗 const triggerBtn = getTargetCommentBtn(); if(!triggerBtn){ console.error("❌找不到工具栏第5个批注按钮"); return; } console.log("✅步骤1:点击工具栏批注按钮"); await realClick(triggerBtn); // 等待弹窗出现 await sleep(700); const dialog = await waitElement('div[role="dialog"]'); if(!dialog){ console.error("❌批注弹窗未打开"); return; } console.log("✅弹窗已打开"); // 步骤2:点击下拉框展开选项列表 const selectWrap = dialog.querySelector('.ant-select'); if(!selectWrap){ console.error("❌弹窗内找不到类型下拉组件"); return; } console.log("✅步骤2:点击下拉框展开菜单"); await realClick(selectWrap); // 等待下拉浮层弹出 await sleep(800); const listBox = await waitElement('div[role="listbox"]'); if(!listBox){ console.error("❌下拉选项浮层没有弹出来"); return; } // 步骤3:点击【属性错误】选项 const attrErrItem = findByText("属性错误"); if(!attrErrItem){ console.error("❌下拉列表找不到属性错误"); return; } console.log("✅步骤3:点击下拉选项【属性错误】"); await realClick(attrErrItem); await sleep(600); // 不操作备注框,直接点确定 const okBtn = findByText("确定"); if(!okBtn){ console.error("❌找不到【确定】按钮"); return; } console.log("✅步骤4:直接点击确定提交"); await realClick(okBtn); console.log("=====✅流程全部完成====="); } window.autoComment = runTask; // F2触发整套流程 document.addEventListener('keydown', async function(e){ if(e.key === 'F2'){ e.preventDefault(); await runTask(); } }); console.log("✅脚本已加载,选中物体按F2运行;跳过备注填写"); })();