/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2023, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// import { Viewer } from "../Viewer"; import { commands } from "../Commands"; import { Model } from "../../Api/Model"; import { Assembly } from "../../Api/Assembly"; export const composeMatrixFromTransform = (translate, rotate, scale, modelCenter, matrix) => { const translateMatrix = matrix.setTranslation([translate.x, translate.y, translate.z]); const rotateMatrix = matrix.setToRotation(rotate.angle, [rotate.x, rotate.y, rotate.z], modelCenter); const scaleMatrix = matrix.setToScaling(scale, modelCenter); return translateMatrix.postMultBy(rotateMatrix).postMultBy(scaleMatrix); }; function applyModelTransform(viewer: Viewer, model: Model | File | Assembly) { if (!viewer.visualizeJs) return; const assembly = model instanceof Model ? model.assembly : model; if (!(assembly instanceof Assembly)) return; const visLib = viewer.visLib(); const visViewer = visLib.getViewer(); const modelItr = visViewer.getModelIterator(); for (; !modelItr.done(); modelItr.step()) { const modelPtr = modelItr.getModel(); const transform = assembly.getModelTransformMatrix(modelPtr.getDatabaseHandle()); if (transform) { const extents = modelPtr.getExtents(); const matrix = composeMatrixFromTransform( transform.translate, transform.rotation, transform.scale, extents.center(), new visLib.Matrix3d() ); modelPtr.setModelingMatrix(matrix, true); } } modelItr.delete(); visViewer.clearViewExtentsCache?.(); viewer.update(); } commands("VisualizeJS").registerCommand("applyModelTransform", applyModelTransform);