/
counterbugtech
/
KontrBugCAD
Обзор
Документация
Войти
/
counterbugtech
/
KontrBugCAD
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/core/parametric/executors/RepairExecutor.js
1 строка
2 KB
counterbugtech
версия 0.9.37
17 май 2026, 13:43
Верифицирован
17 май 2026, 13:43
31de57b
Код
Авторство
О чём код?
import*as THREE from"three";import{ParametricExecutor}from"./ParametricExecutor.js";import{GeometryRepair}from"utils/geometry-repair.js";export class RepairExecutor extends ParametricExecutor{constructor(e){super(),this.editor=e,this.geometryRepair=new GeometryRepair(e.manifoldWrapper)}execute(e,t){const{targets:o,fillHolesSmart:i=!1,fillHolesSimple:r=!1,maxHoleSize:s=500,cutByPlane:a=!1,planeNormal:n=[0,0,1],planeConstant:l=0,planeSide:p="positive",forceManifold:c=!0,forceConvexHull:m=!1,splitComponents:u=!1,verbose:d=!0}=e.parameters,f=e.outputs||[],h=[];for(const e of o){const o=t.objectMap.get(e);if(!o||!o.isMesh)continue;const y=o.geometry.clone(),g={fillHolesSmart:i,fillHolesSimple:r,maxHoleSize:s,cutByPlane:a,planeNormal:n,planeConstant:l,planeSide:p,forceManifold:c,forceConvexHull:m,verbose:d};let b=this.geometryRepair.repair(y,g);b.attributes.position&&0!==b.attributes.position.count||(console.warn("Ремонт дал пустую геометрию, используем исходную"),b=y.clone());let x=[];u?(x=this.geometryRepair.splitIntoComponents(b),x&&0!==x.length||(x=[b])):x=[b],t.objectMap.delete(e),t.sceneGroup.remove(o),this.disposeObject(o);for(let e=0;e<x.length;e++){const t=x[e];if(!t.attributes.position||0===t.attributes.position.count){t!==y&&t.dispose();continue}const i=o.material.clone(),r=new THREE.Mesh(t,i);r.position.copy(o.position),r.rotation.copy(o.rotation),r.scale.copy(o.scale),r.castShadow=o.castShadow,r.receiveShadow=o.receiveShadow,r.visible=o.visible;const s=x.length>1?`_comp${e+1}`:"";if(r.name=`repaired_${o.name||o.uuid}${s}`,r.userData={...o.userData,repaired:!0,componentIndex:e,totalComponents:x.length},0===e)r.uuid=o.uuid;else{const e=h.length;e<f.length&&(r.uuid=f[e])}h.push(r)}y===b||x.includes(y)||y.dispose(),b&&!x.includes(b)&&b.dispose()}return h}disposeObject(e){e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>e.dispose()):e.material.dispose())}}