From b289a4c397c65f40aa89d13604a51f9f13a0328f Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期六, 19 十月 2024 10:17:50 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/tool.js |  208 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 149 insertions(+), 59 deletions(-)

diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index 9896dc0..8f942a9 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -330,82 +330,170 @@
     }
 }
 
+
+// export const showSelectedEffect = (sprite) => {
+//     if (!sprite?.texture || !sprite?.texture?.valid) {
+//         return;
+//     }
+//     const { width, height } = sprite;
+//     const scale = sprite.scale.x;
+//     const sideLen = (Math.max(width, height) + 10) * scale;
+//     const color = themeMode === 'light' ? 0x273c75 : 0xffffff;
+
+//     effectHalfCircle = new PIXI.Graphics();
+//     effectHalfCircle.beginFill(color);
+//     effectHalfCircle.lineStyle(2 * scale, color);
+//     effectHalfCircle.arc(0, 0, sideLen, 0, Math.PI);
+//     effectHalfCircle.endFill();
+//     effectHalfCircle.position.set(sprite.x, sprite.y);
+//     effectHalfCircle.scale.set(1 / scale);
+//     effectHalfCircle.zIndex = 9999;
+
+//     effectRectangle = new PIXI.Graphics();
+//     effectRectangle.lineStyle(5 * scale, color, 1);
+//     effectRectangle.drawRoundedRect(0, 0, sideLen, sideLen, 16 * scale);
+//     effectRectangle.endFill();
+//     effectRectangle.mask = effectHalfCircle;
+//     effectRectangle.zIndex = 9999;
+
+//     const scaledWidth = sideLen * (1 / scale);
+//     const scaledHeight = sideLen * (1 / scale);
+
+//     effectRectangle.scale.set(1 / scale);
+//     effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
+
+//     mapContainer.addChild(effectRectangle);
+//     mapContainer.addChild(effectHalfCircle);
+
+//     selectedSprite = sprite;
+
+//     let phase = 0;
+//     effectTick = (delta) => {
+//         phase += delta / 10;
+//         phase %= (Math.PI * 2);
+//         if (effectHalfCircle) {
+//             effectHalfCircle.rotation = phase;
+//         }
+//     };
+
+//     app.ticker.add(effectTick);
+// }
+
+// export const removeSelectedEffect = () => {
+//     if (effectTick) {
+//         app.ticker.remove(effectTick);
+//     }
+//     if (effectHalfCircle) {
+//         mapContainer.removeChild(effectHalfCircle);
+//         effectHalfCircle = null;
+//     }
+//     if (effectRectangle) {
+//         mapContainer.removeChild(effectRectangle);
+//         effectRectangle = null;
+//     }
+//     selectedSprite = null;
+// }
+
+// export const updateEffect = (sprite) => {
+//     if (!sprite || sprite !== selectedSprite || !effectRectangle || !effectHalfCircle) {
+//         return
+//     }
+//     const { width, height } = sprite;
+//     const scale = sprite?.scale.x;
+//     const sideLen = (Math.max(width, height) + 10) * scale;
+//     const scaledWidth = sideLen * (1 / scale);
+//     const scaledHeight = sideLen * (1 / scale);
+
+//     effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
+
+//     effectHalfCircle.position.set(sprite.x, sprite.y);
+// }
+
+let effectCircle = null;
+let effectTicker = null;
+
 export const showSelectedEffect = (sprite) => {
     if (!sprite?.texture || !sprite?.texture?.valid) {
         return;
     }
+
+    // 濡傛灉宸茬粡鏈夌壒鏁堬紝鍏堢Щ闄�
+    removeSelectedEffect();
+
     const { width, height } = sprite;
     const scale = sprite.scale.x;
-    const sideLen = (Math.max(width, height) + 10) * scale;
+    const maxDimension = Math.max(width, height);
+    const radius = (maxDimension / 2) * scale * 1.2; // 鏀惧ぇ1.2鍊嶏紝浣垮渾绋嶅ぇ浜巗prite
+
     const color = themeMode === 'light' ? 0x273c75 : 0xffffff;
 
-    effectHalfCircle = new PIXI.Graphics();
-    effectHalfCircle.beginFill(color);
-    effectHalfCircle.lineStyle(2 * scale, color);
-    effectHalfCircle.arc(0, 0, sideLen, 0, Math.PI);
-    effectHalfCircle.endFill();
-    effectHalfCircle.position.set(sprite.x, sprite.y);
-    effectHalfCircle.scale.set(1 / scale);
-    effectHalfCircle.zIndex = 9999;
+    // 鍒涘缓鍦嗗舰鐗规晥
+    effectCircle = new PIXI.Graphics();
+    effectCircle.lineStyle(2 * scale, color, 1);
+    effectCircle.drawCircle(0, 0, radius);
+    effectCircle.endFill();
+    effectCircle.position.set(sprite.x, sprite.y);
+    effectCircle.zIndex = sprite.zIndex - 1; // 纭繚涓嶉伄鎸prite
 
-    effectRectangle = new PIXI.Graphics();
-    effectRectangle.lineStyle(5 * scale, color, 1);
-    effectRectangle.drawRoundedRect(0, 0, sideLen, sideLen, 16 * scale);
-    effectRectangle.endFill();
-    effectRectangle.mask = effectHalfCircle;
-    effectRectangle.zIndex = 9999;
-
-    const scaledWidth = sideLen * (1 / scale);
-    const scaledHeight = sideLen * (1 / scale);
-
-    effectRectangle.scale.set(1 / scale);
-    effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
-
-    mapContainer.addChild(effectRectangle);
-    mapContainer.addChild(effectHalfCircle);
+    // 灏嗙壒鏁堟坊鍔犲埌瀹瑰櫒涓�
+    mapContainer.addChild(effectCircle);
 
     selectedSprite = sprite;
 
-    let phase = 0;
-    effectTick = (delta) => {
-        phase += delta / 10;
-        phase %= (Math.PI * 2);
-        if (effectHalfCircle) {
-            effectHalfCircle.rotation = phase;
+    // 瀹炵幇鑴夊啿鏁堟灉
+    let pulseScale = 1;
+    let scalingUp = true;
+    effectTicker = (delta) => {
+        const pulseSpeed = 0.005 * delta;
+        if (scalingUp) {
+            pulseScale += pulseSpeed;
+            if (pulseScale >= 1.2) {
+                scalingUp = false;
+            }
+        } else {
+            pulseScale -= pulseSpeed;
+            if (pulseScale <= 1) {
+                scalingUp = true;
+            }
         }
+        effectCircle.scale.set(pulseScale);
+        // 濮嬬粓璺熼殢sprite鐨勪綅缃�
+        effectCircle.position.set(selectedSprite.x, selectedSprite.y);
     };
 
-    app.ticker.add(effectTick);
-}
+    app.ticker.add(effectTicker);
+};
 
 export const removeSelectedEffect = () => {
-    if (effectTick) {
-        app.ticker.remove(effectTick);
+    if (effectTicker) {
+        app.ticker.remove(effectTicker);
+        effectTicker = null;
     }
-    if (effectHalfCircle) {
-        mapContainer.removeChild(effectHalfCircle);
-        effectHalfCircle = null;
-    }
-    if (effectRectangle) {
-        mapContainer.removeChild(effectRectangle);
-        effectRectangle = null;
+    if (effectCircle) {
+        mapContainer.removeChild(effectCircle);
+        effectCircle.destroy();
+        effectCircle = null;
     }
     selectedSprite = null;
-}
+};
 
-export const updateEffect = (sprite) => {
-    if (!sprite || sprite !== selectedSprite || !effectRectangle || !effectHalfCircle) {
-        return
+export const updateEffect = () => {
+    if (!selectedSprite || !effectCircle) {
+        return;
     }
-    const { width, height } = sprite;
-    const scale = sprite?.scale.x;
-    const sideLen = (Math.max(width, height) + 10) * scale;
-    const scaledWidth = sideLen * (1 / scale);
-    const scaledHeight = sideLen * (1 / scale);
+    // 鏇存柊鍦嗙殑浣嶇疆锛岀‘淇濊窡闅弒prite
+    effectCircle.position.set(selectedSprite.x, selectedSprite.y);
+};
 
-    effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
+export const multipleSelectEnhancer = (selectedSprites, setCurSprite, setBatchSprites) => {
+    selectedSprites = selectedSprites.filter(sprite => sprite.data?.type);
 
-    effectHalfCircle.position.set(sprite.x, sprite.y);
+    if (selectedSprites.length === 1) {
+        unMarkSprite(selectedSprites[0]);
+        setCurSprite(selectedSprites[0]);
+    } else {
+        setBatchSprites(selectedSprites);
+    }
 }
 
 export const rotationToNum = (rotation) => {
@@ -496,29 +584,31 @@
 
 // dynamic graphic ----------------
 
-export const generateDynamicGraphic = (curZone, data) => {
+export const generateDynamicGraphic = (curZone, data, setCurSprite) => {
     // console.log("ws", curZone, data);
 
-    for (const agvVo of data.agvVos) {
-        showAgvSprite(curZone, agvVo)
+    for (const agv of data.agvVos) {
+        showAgvSprite(curZone, agv, setCurSprite)
     }
 
 }
 
-const showAgvSprite = (curZone, agvVo) => {
-    const { agvNo, code, direction, backpack, battery, ...rest } = agvVo;
+const showAgvSprite = (curZone, agv, setCurSprite) => {
+    const { agvNo, code, direction, backpack, battery, ...rest } = agv;
     if (!code) { return }
     const codeSprite = querySprite(DEVICE_TYPE.POINT, code);
     if (!codeSprite) { return }
     let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo);
     if (!agvSprite) {
-        agvSprite = generateSprite(DEVICE_TYPE.AGV, generateAgvSpriteTexture(getAgvStatusMode(backpack, battery)));
+        agvSprite = generateSprite(DEVICE_TYPE.AGV,
+            generateAgvSpriteTexture(getAgvStatusMode(backpack.filter(item => item.loaded === true).length, battery))
+        );
         initSprite(agvSprite, DEVICE_TYPE.AGV);
         agvSprite.data.no = agvNo;
         agvSprite.position.set(codeSprite.position.x, codeSprite.position.y);
         agvSprite.rotation = rotationParseNum(direction);
         mapContainer.addChild(agvSprite);
-        // viewFeature(shuttle, setCurSPrite); // todo
+        beInsight(agvSprite, setCurSprite);
         // agv no on sprite
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1