controller.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import { MatController } from "@/controller/MatController";
  2. import { MatchModule } from "@/modules/match";
  3. import { QueditorModule } from "@queenjs-modules/queditor";
  4. import { switchSceneProdComp } from "@queenjs-modules/queditor/module/controls/Queen3dCtrl/actions/geom";
  5. import { PackMat } from "@queenjs-modules/queditor/objects";
  6. import { queenApi } from "queenjs";
  7. export default function createController(
  8. match: MatchModule,
  9. queditor: QueditorModule
  10. ) {
  11. const ctrl = new MatController();
  12. const switchComp = (compName = "") => {
  13. switchSceneProdComp.call(
  14. queditor.controls.queen3dCtrl,
  15. queditor.store.pack.scenes[0].products[0].id,
  16. compName
  17. );
  18. };
  19. function findCompDef(product: any, compName = "") {
  20. return product.components.find((c: any) => c.name == compName);
  21. }
  22. function renderGroupMat(matsGroup: MatsMatchComp, isCreate = true) {
  23. const targetPro = queditor.helper.findProductDef(matsGroup.productId);
  24. if (!targetPro) return;
  25. const targetCom = findCompDef(targetPro, matsGroup.name);
  26. if (!targetCom) return;
  27. const mat = queditor.helper.findMatDef(matsGroup.matIds[matsGroup.index]);
  28. if (!mat) return;
  29. queditor.actions.updatePackProductCompMat(targetCom, mat, isCreate);
  30. }
  31. function clearCompMat(matsGroup: MatsMatchComp) {
  32. const targetPro = queditor.helper.findProductDef(matsGroup.productId);
  33. if (!targetPro) return;
  34. const targetCom = findCompDef(targetPro, matsGroup.name);
  35. if (!targetCom) return;
  36. queditor.actions.updatePackProductCompMat(targetCom, PackMat.create());
  37. }
  38. ctrl.matItemAction = (
  39. key: string,
  40. matsGroup: MatsMatchComp,
  41. index: number,
  42. currentMats: PackMat
  43. ) => {
  44. switch (key) {
  45. case "delete":
  46. match.actions.deleteGroupMat(matsGroup, index);
  47. break;
  48. case "rename":
  49. ctrl.renameGroupMat(currentMats);
  50. break;
  51. }
  52. };
  53. ctrl.matGroupAction = (key: string, matsGroup: MatsMatchComp) => {
  54. switch (key) {
  55. case "rename":
  56. ctrl.renameMatGroup(matsGroup);
  57. break;
  58. case "lock":
  59. ctrl.lockMatGroup();
  60. break;
  61. case "clear":
  62. ctrl.clearMatGroup(matsGroup);
  63. // removePackMat? 是否删除面料列表数据
  64. switchComp(matsGroup.name);
  65. clearCompMat(matsGroup);
  66. break;
  67. }
  68. };
  69. ctrl.switchGroupMatIndex = (matsGroup: any, index: number) => {
  70. matsGroup.index = index;
  71. renderGroupMat(matsGroup, false);
  72. };
  73. ctrl.saveMatch = () => {
  74. match.store.designDetail.scenePack.source = queditor.store.pack;
  75. match.actions.saveDesign();
  76. };
  77. ctrl.findMatById = (matId: string) => {
  78. const mats = queditor.store.pack.mats;
  79. return mats?.find((element) => element.id == matId);
  80. };
  81. ctrl.findProductById = (productId: string) => {
  82. const products = queditor.store.pack.products;
  83. return products?.find((element) => element.id == productId);
  84. };
  85. ctrl.isGroupActive = (matsGroup: MatsMatchComp) => {
  86. return queditor.store.currActiveProdComp?.name == matsGroup.name;
  87. };
  88. ctrl.switchGroupIndex = (matsGroup: MatsMatchComp) => {
  89. switchComp(matsGroup.name || "");
  90. };
  91. ctrl.unbindScroll = () => {
  92. const app = queditor.controls.queen3dCtrl.queen3d.getAppInstance();
  93. app.unbind("tap:click");
  94. ctrl.scrollEl = undefined;
  95. };
  96. ctrl.initScroll = (el) => {
  97. const app = queditor.controls.queen3dCtrl.queen3d.getAppInstance();
  98. app.on("tap:click", (geom: any, clicked: boolean) => {
  99. if (!clicked) return;
  100. const scrollEl = el.$el.querySelector(".content");
  101. ctrl.scrollEl = scrollEl;
  102. scrollToElement();
  103. });
  104. };
  105. function scrollToElement() {
  106. if (!ctrl.scrollEl) return;
  107. const doms = ctrl.scrollEl.querySelectorAll(".JSDrop");
  108. if (!doms.length) return;
  109. const index = match.store.menuOptions.sourceData.mat.findIndex(
  110. (d: any) => d.name == queditor.store.currActiveProdComp?.name
  111. );
  112. ctrl.scrollEl.scrollTo({
  113. top: doms[index].offsetTop - doms[0].offsetTop,
  114. behavior: "smooth",
  115. });
  116. }
  117. ctrl.initEvent = () => {
  118. // drag to mesh
  119. // queditor.actions.on("updatePackProductCompMat:success", (...args) => {
  120. // console.error("updatePackProductCompMat:success*************");
  121. // scrollToElement();
  122. // });
  123. // drag to group
  124. queditor.controls.drager.on(
  125. "drop:selfDrop",
  126. async (event: DragEvent, { type, data }: any, extraData: any) => {
  127. const dropData = await data();
  128. if (type == "asset3d.mat") {
  129. dropMat(dropData, extraData);
  130. } else if (type == "asset3d.mesh") {
  131. dropMesh(dropData, extraData);
  132. }
  133. }
  134. );
  135. };
  136. ctrl.destroy = () => {
  137. queditor.controls.drager.unbind("drop:selfDrop");
  138. };
  139. function dropMesh(dropData: any, target: any) {
  140. console.log("dropData: ", dropData, target);
  141. //
  142. }
  143. // 拖拽面料
  144. function dropMat(mat: PackMat, extraData: any) {
  145. const currGroup = findmatsGroup(extraData);
  146. if (!currGroup.matIds) currGroup.matIds = [];
  147. if (currGroup.matIds.includes(mat.id)) {
  148. queenApi.messageError("不能重复添加色卡");
  149. return;
  150. }
  151. // update mat
  152. const targetPro = queditor.helper.findProductDef(extraData.productId);
  153. const targetCom = findCompDef(targetPro, extraData.name);
  154. if (!targetCom) return;
  155. queditor.actions.updatePackProductCompMat(targetCom, mat, true);
  156. currGroup.matIds.push(mat.id);
  157. currGroup.index = currGroup.matIds.length - 1;
  158. }
  159. function findmatsGroup(target: MatsMatchComp) {
  160. const currGroup = match.store.menuOptions.sourceData.mat.find(
  161. (r: MatsMatchComp) =>
  162. r.name == target.name && r.productId == target.productId
  163. );
  164. return currGroup;
  165. }
  166. return ctrl;
  167. }