|  | @@ -2,11 +2,10 @@ import { useProjectStore } from "@/store/modules/project";
 | 
	
		
			
				|  |  |  import { calcComboInfo } from "@/utils/calc";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const ABSORB_DISTANCE = 10;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  export function useAdsorb() {
 | 
	
		
			
				|  |  |    const projectStore = useProjectStore();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  const getAdsorb = ( move: number, xy: number, wh: number, targetVal: number) => {
 | 
	
		
			
				|  |  | +  const getMoveAdsorb = ( move: number, xy: number, wh: number, targetVal: number) => {
 | 
	
		
			
				|  |  |      // 始端吸附
 | 
	
		
			
				|  |  |      if (Math.abs((xy + move) - targetVal) < ABSORB_DISTANCE) {
 | 
	
		
			
				|  |  |        move = targetVal - xy;
 | 
	
	
		
			
				|  | @@ -23,14 +22,35 @@ export function useAdsorb() {
 | 
	
		
			
				|  |  |      return move;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  const getScaleAdsorb = ( xy: number, wh: number, targetVal: number) => {
 | 
	
		
			
				|  |  | +    // 始端吸附
 | 
	
		
			
				|  |  | +    if (Math.abs(xy - targetVal) < ABSORB_DISTANCE) {
 | 
	
		
			
				|  |  | +      xy = targetVal;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    // 中间吸附
 | 
	
		
			
				|  |  | +    if (Math.abs((xy + wh / 2 ) - targetVal) < ABSORB_DISTANCE) {
 | 
	
		
			
				|  |  | +      xy = targetVal - wh / 2;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    // 终端吸附
 | 
	
		
			
				|  |  | +    if (Math.abs((xy + wh ) - targetVal) < ABSORB_DISTANCE) {
 | 
	
		
			
				|  |  | +      xy = targetVal - wh;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (Math.abs(xy + wh - targetVal) < ABSORB_DISTANCE) {
 | 
	
		
			
				|  |  | +      wh = targetVal - xy;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    return {xy, wh};
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    /**
 | 
	
		
			
				|  |  | -   * 获取吸附信息
 | 
	
		
			
				|  |  | +   * 获取移动吸附信息
 | 
	
		
			
				|  |  |     * @param moveX 移动x坐标
 | 
	
		
			
				|  |  |     * @param moveY 移动y坐标
 | 
	
		
			
				|  |  |     * @param moveW 移动宽度
 | 
	
		
			
				|  |  |     * @param moveH 移动高度
 | 
	
		
			
				|  |  |     */
 | 
	
		
			
				|  |  | -  const getAdsorbInfo = ({ moveX, moveY, moveW, moveH }: { moveX: number, moveY: number, moveW: number, moveH: number }) => {
 | 
	
		
			
				|  |  | +  const getMoveAdsorbInfo = ({ moveX, moveY }: { moveX: number, moveY: number }) => {
 | 
	
		
			
				|  |  |      // 1、获取当前操作元素
 | 
	
		
			
				|  |  |      const selcetedElements = projectStore.currentSelectedElements;
 | 
	
		
			
				|  |  |      // 2、获取所有组件及参考线
 | 
	
	
		
			
				|  | @@ -45,43 +65,77 @@ export function useAdsorb() {
 | 
	
		
			
				|  |  |      elements.forEach(item => {
 | 
	
		
			
				|  |  |        const { x: itemX = 0, y: itemY = 0, width = 0, height = 0 } = item.container.props;
 | 
	
		
			
				|  |  |        // 左
 | 
	
		
			
				|  |  | -      moveX = getAdsorb(moveX, x, w, itemX);
 | 
	
		
			
				|  |  | +      moveX = getMoveAdsorb(moveX, x, w, itemX);
 | 
	
		
			
				|  |  |        // 中
 | 
	
		
			
				|  |  | -      moveX = getAdsorb(moveX, x, w, itemX + (width / 2));
 | 
	
		
			
				|  |  | +      moveX = getMoveAdsorb(moveX, x, w, itemX + (width / 2));
 | 
	
		
			
				|  |  |        // 右
 | 
	
		
			
				|  |  | -      moveX = getAdsorb(moveX, x, w, itemX + width);
 | 
	
		
			
				|  |  | +      moveX = getMoveAdsorb(moveX, x, w, itemX + width);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // 上
 | 
	
		
			
				|  |  | -      moveY = getAdsorb(moveY, y, h, itemY);
 | 
	
		
			
				|  |  | +      moveY = getMoveAdsorb(moveY, y, h, itemY);
 | 
	
		
			
				|  |  |        // 中
 | 
	
		
			
				|  |  | -      moveY = getAdsorb(moveY, y, h, itemY + (height / 2));
 | 
	
		
			
				|  |  | +      moveY = getMoveAdsorb(moveY, y, h, itemY + (height / 2));
 | 
	
		
			
				|  |  |        // 下
 | 
	
		
			
				|  |  | -      moveY = getAdsorb(moveY, y, h, itemY + height);
 | 
	
		
			
				|  |  | +      moveY = getMoveAdsorb(moveY, y, h, itemY + height);
 | 
	
		
			
				|  |  |      })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      referLines.forEach(line => {
 | 
	
		
			
				|  |  |        if (line.type === "vertical") {
 | 
	
		
			
				|  |  | -        moveY = getAdsorb(moveY, y, h, line.value);
 | 
	
		
			
				|  |  | +        moveY = getMoveAdsorb(moveY, y, h, line.value);
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  | -        moveX = getAdsorb(moveX, x, w, line.value);
 | 
	
		
			
				|  |  | +        moveX = getMoveAdsorb(moveX, x, w, line.value);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 屏幕边线吸附
 | 
	
		
			
				|  |  | -    moveY = getAdsorb(moveY, y, h, 0);
 | 
	
		
			
				|  |  | -    moveY = getAdsorb(moveY, y, h, projectStore.projectInfo.height);
 | 
	
		
			
				|  |  | -    moveX = getAdsorb(moveX, x, w, 0);
 | 
	
		
			
				|  |  | -    moveX = getAdsorb(moveX, x, w, projectStore.projectInfo.width);
 | 
	
		
			
				|  |  | +    moveY = getMoveAdsorb(moveY, y, h, 0);
 | 
	
		
			
				|  |  | +    moveY = getMoveAdsorb(moveY, y, h, projectStore.projectInfo.height);
 | 
	
		
			
				|  |  | +    moveX = getMoveAdsorb(moveX, x, w, 0);
 | 
	
		
			
				|  |  | +    moveX = getMoveAdsorb(moveX, x, w, projectStore.projectInfo.width);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return {
 | 
	
		
			
				|  |  |        newMoveX: moveX,
 | 
	
		
			
				|  |  |        newMoveY: moveY,
 | 
	
		
			
				|  |  | -      newMoveW: moveW,
 | 
	
		
			
				|  |  | -      newMoveH: moveH
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取缩放吸附信息
 | 
	
		
			
				|  |  | +   * @param x X坐标
 | 
	
		
			
				|  |  | +   * @param y Y坐标
 | 
	
		
			
				|  |  | +   * @param w 宽
 | 
	
		
			
				|  |  | +   * @param h 高
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  const getScaleAdsorbInfo = ({x, y, width, height}: {x: number, y: number, width: number, height: number}) => {
 | 
	
		
			
				|  |  | +    // TODO 完善缩放吸附功能
 | 
	
		
			
				|  |  | +    // 1、获取当前操作元素
 | 
	
		
			
				|  |  | +    // const selcetedElements = projectStore.currentSelectedElements;
 | 
	
		
			
				|  |  | +    // 2、获取所有组件及参考线
 | 
	
		
			
				|  |  | +    const referLines = projectStore.showReffer ? projectStore.referLines : [];
 | 
	
		
			
				|  |  | +    // const elements = projectStore.elements.filter(item => selcetedElements.findIndex(ele => ele.key === item.key) === -1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    referLines.forEach(line => {
 | 
	
		
			
				|  |  | +      if (line.type === "vertical") {
 | 
	
		
			
				|  |  | +        const res = getScaleAdsorb(y, height, line.value);
 | 
	
		
			
				|  |  | +        y = res.xy;
 | 
	
		
			
				|  |  | +        height = res.wh;
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        const res = getScaleAdsorb(x, width, line.value);
 | 
	
		
			
				|  |  | +        x = res.xy;
 | 
	
		
			
				|  |  | +        width = res.wh;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      newX: x,
 | 
	
		
			
				|  |  | +      newY: y,
 | 
	
		
			
				|  |  | +      newWidth: width,
 | 
	
		
			
				|  |  | +      newHeight: height
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return {
 | 
	
		
			
				|  |  | -    getAdsorbInfo
 | 
	
		
			
				|  |  | +    getMoveAdsorbInfo,
 | 
	
		
			
				|  |  | +    getScaleAdsorbInfo
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 |