Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

29 linhas
2.4 KiB

  1. import fs from 'node:fs/promises';
  2. import {chromium,expect} from '@playwright/test';
  3. import {login} from './role-permissions-live.mjs';
  4. const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  5. const page=await browser.newPage();
  6. await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);sessionStorage.setItem('unreal-tran:web:refresh-token:v1',s.refreshToken);},await login('root'));
  7. await page.route(/\/src\/features\/virtual-training-legacy\/upstream\/views\/training\.js(?:\?|$)/,async route=>{
  8. const response=await route.fetch();await route.fulfill({response,body:await response.text()+`
  9. globalThis.__accessSurvey=()=>{
  10. const e=activeTraining,result=[];
  11. for(const id of ['front-pump-hydraulic-pump','front-pump-pto-switch','front-pump-ball-valve-switch','front-pump-aux-control-box-cover']){
  12. const o=e.parts.get(id),box=physicalBounds(o),center=box.getCenter(new THREE.Vector3()),size=box.getSize(new THREE.Vector3()),views=[];
  13. const meshes=[];e.publishedContentRoot.traverse(n=>{if(n.isMesh&&!n.userData.trainingPickProxy&&effectivelyVisible(n))meshes.push(n);});
  14. for(const elevation of [0,.2,.5])for(let angle=0;angle<360;angle+=45){
  15. const a=angle*Math.PI/180,direction=new THREE.Vector3(Math.sin(a),elevation,Math.cos(a)).normalize(),camera=center.clone().addScaledVector(direction,2.5322),ray=new THREE.Raycaster(),blockers=[];let hits=0;
  16. for(const offset of [[0,0,0],[.3,0,0],[-.3,0,0],[0,.3,0],[0,-.3,0]]){
  17. const target=center.clone().add(new THREE.Vector3(...offset).multiply(size));ray.set(camera,target.sub(camera).normalize());
  18. const hit=ray.intersectObjects(meshes,false)[0];if(hit&&e.isObjectInsideTarget(hit.object,o))hits++;else if(hit)blockers.push(hit.object.name);
  19. }
  20. views.push({angle,elevation,direction:direction.toArray(),hits,blockers:[...new Set(blockers)]});
  21. }result.push({id,views});}return result;
  22. };`});
  23. });
  24. try{
  25. await page.goto('http://127.0.0.1:6180/teaching/virtual-training/preview/86');await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});
  26. const result=await page.evaluate(()=>__accessSurvey());await fs.writeFile('reports/bridge-solid-view-20260915/access-survey.json',JSON.stringify(result,null,2));
  27. for(const item of result)console.log(JSON.stringify({id:item.id,best:item.views.sort((a,b)=>b.hits-a.hits).slice(0,5)}));
  28. }finally{await browser.close();}