addModelButton(添加模型按钮)

2022-2-18
import { message } from 'antd';
import { debounce } from 'lodash';

const BDIP_TOOLBAR_NAME = 'bimBdipToolbar'; // bdip toolbar名称

// 创建单个按钮
function createModelleBtn({ AV, btnName, iconClass, toolTip, callback }) {
  const modelBtn = new AV.UI.Button(btnName);

  modelBtn.icon.classList.add('iconfont');
  modelBtn.setIcon(iconClass);
  modelBtn.setToolTip(toolTip);
  // https://lodash.com/docs/4.17.15#debounce
  modelBtn.onClick = debounce(
    function () {
      const state = modelBtn.getState();

      callback.call(this, ...arguments);
      Number.parseInt(state) === 1 ? modelBtn.setState(0) : modelBtn.setState(1);
    },
    180,
    {
      leading: true,
      trailing: false,
    }
  );

  return modelBtn;
}

/**
 * 模型添加按钮
 * @param {Object} Viewer       模型对象
 * @param {Object} AV           Autodesk.Viewing
 * @param {String} toolbarName  按钮要添加到目标toolbar的名称
 * @param {Number} index        按钮要添加到目标toolbar的位置
 */
const addModelBtn = ({ Viewer, AV, toolbarName, index = 0 }) => async ({
  btnName,
  iconClass,
  toolTip,
  btnType = 0, // 0为按钮 1为按钮组
  btnList = [],
  callback = function () {},
}) => {
  if (!Viewer || !AV) return message.warning('模型对象丢失,请重新打开模型');

  // Viewer.addEventListener(AV.TOOLBAR_CREATED_EVENT, () => {
  //  console.log("toobar created==>");
  // });

  const toolbar = Viewer.getToolbar();
  const targetToolbar =
    toolbar?.getControl(toolbarName) || new AV.UI.ControlGroup(BDIP_TOOLBAR_NAME);

  if (btnType === 0) {
    const modelBtn = createModelleBtn({ AV, btnName, iconClass, toolTip, callback });
    targetToolbar?.addControl(modelBtn, {
      index,
    });
  } else {
    const btnGroup = new window.Autodesk.Viewing.UI.ComboButton(btnName);
    btnGroup.icon.classList.add('iconfont');
    btnGroup.setIcon(iconClass);
    btnGroup.setToolTip(toolTip);

    btnList &&
      Array.isArray(btnList) &&
      btnList.forEach(({ btnName, iconClass, toolTip, callback }) => {
        const modelBtn = createModelleBtn({
          AV,
          btnName,
          iconClass,
          toolTip,
          callback,
          targetToolbar,
        });
        btnGroup.addControl(modelBtn);
      });

    targetToolbar.addControl(btnGroup, {
      index,
    });
  }

  if (toolbar) {
    !toolbar.getControl(toolbarName) && toolbar.addControl(targetToolbar);
  }
};

export { BDIP_TOOLBAR_NAME };
export default addModelBtn;