|
|
|
@ -2,8 +2,8 @@ import { Intent } from "@blueprintjs/core";
|
|
|
|
|
import { Curve, Intersection, Object3D, Raycaster } from "three";
|
|
|
|
|
import { app } from "../ApplicationServices/Application";
|
|
|
|
|
import { Board } from "../DatabaseServices/Entity/Board";
|
|
|
|
|
import { CompositeEntity } from "../DatabaseServices/Entity/CompositeEntity";
|
|
|
|
|
import { Entity } from "../DatabaseServices/Entity/Entity";
|
|
|
|
|
import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCompositeEntity";
|
|
|
|
|
import { PhysicalMaterialRecord } from "../DatabaseServices/PhysicalMaterialRecord";
|
|
|
|
|
import { BulkheadCeiling } from "../DatabaseServices/Room/Entity/Ceiling/BulkheadCeiling";
|
|
|
|
|
import { Text } from "../DatabaseServices/Text/Text";
|
|
|
|
@ -11,7 +11,6 @@ import { CommandWrap } from "../Editor/CommandMachine";
|
|
|
|
|
import { Raycast } from "../Editor/PointPick";
|
|
|
|
|
import { userConfig } from "../Editor/UserConfig";
|
|
|
|
|
import { VisualSpaceBox } from "../Editor/VisualSpaceBox";
|
|
|
|
|
import { RenderType } from "../GraphicsSystem/RenderType";
|
|
|
|
|
import { ApplyGoodInfo } from "../UI/Components/ApplyGoodInfo";
|
|
|
|
|
import { AppToaster } from "../UI/Components/Toaster";
|
|
|
|
|
import { CommandNames } from "./CommandNames";
|
|
|
|
@ -94,38 +93,38 @@ export function ApplyMtlToSelectEntityList(material: PhysicalMaterialRecord, can
|
|
|
|
|
app.Viewer.UpdateRender();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const GetEntFromComEntByRaycaster = (compositeEnt: CompositeEntity, raycaster: Raycaster, FilterTypes: any[] = []): Entity | undefined =>
|
|
|
|
|
{
|
|
|
|
|
let hwdEnts: Entity[] = [];
|
|
|
|
|
let en: Entity;
|
|
|
|
|
compositeEnt.Traverse((childrenEnt =>
|
|
|
|
|
{
|
|
|
|
|
if (childrenEnt && childrenEnt !== compositeEnt && !childrenEnt.IsErase && !FilterTypes.some(T => childrenEnt instanceof T))
|
|
|
|
|
hwdEnts.push(childrenEnt);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
let objects = hwdEnts.map(childrenEnt => childrenEnt.GetDrawObjectFromRenderType(userConfig.RenderType));
|
|
|
|
|
let intersection = Raycast(raycaster, objects, { filterErase: true });
|
|
|
|
|
|
|
|
|
|
let obj = intersection?.object;
|
|
|
|
|
if (obj)
|
|
|
|
|
{
|
|
|
|
|
let index = objects.findIndex(o => o === obj);
|
|
|
|
|
if (index !== -1 && hwdEnts[index])
|
|
|
|
|
en = hwdEnts[index];
|
|
|
|
|
}
|
|
|
|
|
return en;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 应用材质到射线相交处的面
|
|
|
|
|
* @param material 材质
|
|
|
|
|
* @param en 实体
|
|
|
|
|
* @param intersection 射线相交信息
|
|
|
|
|
* @param raycaster 射线
|
|
|
|
|
*/
|
|
|
|
|
export function ApplyPartMtlToInterFace(material: PhysicalMaterialRecord, en: Entity, intersection: Intersection, raycaster: Raycaster)
|
|
|
|
|
{
|
|
|
|
|
if (en instanceof HardwareCompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
let hwdEnts: Entity[] = [];
|
|
|
|
|
en.Traverse((childrenEnt =>
|
|
|
|
|
{
|
|
|
|
|
if (childrenEnt && childrenEnt !== en && !childrenEnt.IsErase && !FilterTypes.some(T => childrenEnt instanceof T))
|
|
|
|
|
hwdEnts.push(childrenEnt);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
let objects = hwdEnts.map(childrenEnt => childrenEnt.GetDrawObjectFromRenderType(RenderType.Physical));
|
|
|
|
|
let intersection = Raycast(raycaster, objects, { filterErase: true });
|
|
|
|
|
|
|
|
|
|
let obj = intersection?.object;
|
|
|
|
|
if (obj)
|
|
|
|
|
{
|
|
|
|
|
let index = objects.findIndex(o => o === obj);
|
|
|
|
|
if (index !== -1 && hwdEnts[index])
|
|
|
|
|
{
|
|
|
|
|
en.WriteAllObjectRecord();
|
|
|
|
|
en = hwdEnts[index];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (en.LockMaterial)
|
|
|
|
|
{
|
|
|
|
|
LockMtlToaster(1, true);
|
|
|
|
@ -134,6 +133,20 @@ export function ApplyPartMtlToInterFace(material: PhysicalMaterialRecord, en: En
|
|
|
|
|
|
|
|
|
|
if (IsMeshMaterialEntity(en))
|
|
|
|
|
{
|
|
|
|
|
if (en instanceof CompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
en = GetEntFromComEntByRaycaster(en, raycaster, FilterTypes);
|
|
|
|
|
if (!en)
|
|
|
|
|
{
|
|
|
|
|
console.log("发生未知错误,未能找到复合实体中的子实体");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (en.LockMaterial)
|
|
|
|
|
{
|
|
|
|
|
LockMtlToaster(1, true);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (en.IsMtlLockAtSlot(intersection.face.materialIndex))
|
|
|
|
|
LockMtlToaster(1, false, false, true);
|
|
|
|
|
else
|
|
|
|
@ -151,7 +164,7 @@ export function ApplyPartMtlToInterFace(material: PhysicalMaterialRecord, en: En
|
|
|
|
|
* @param {PhysicalMaterialRecord} material 材质
|
|
|
|
|
* @param {Object3D[]} selectedObj 选中的实体
|
|
|
|
|
*/
|
|
|
|
|
export function ApplyMtlToSelectedObjs(material: PhysicalMaterialRecord, selectedObj: Object3D[], raycaster: Raycaster)
|
|
|
|
|
export function ApplyMtlToSelectedObjs(material: PhysicalMaterialRecord, selectedObj: Object3D[])
|
|
|
|
|
{
|
|
|
|
|
let meshMaterialCount = 0;
|
|
|
|
|
const entMap = new Map();
|
|
|
|
@ -166,30 +179,6 @@ export function ApplyMtlToSelectedObjs(material: PhysicalMaterialRecord, selecte
|
|
|
|
|
if (entMap.get(en)) continue;
|
|
|
|
|
entMap.set(en, true);
|
|
|
|
|
|
|
|
|
|
if (en instanceof HardwareCompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
let hwdEnts: Entity[] = [];
|
|
|
|
|
en.Traverse((childrenEnt =>
|
|
|
|
|
{
|
|
|
|
|
if (childrenEnt && !childrenEnt.IsErase && !FilterTypes.some(T => childrenEnt instanceof T))
|
|
|
|
|
hwdEnts.push(childrenEnt);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
let objects = hwdEnts.map(childrenEnt => childrenEnt.GetDrawObjectFromRenderType(RenderType.Physical));
|
|
|
|
|
let intersection = Raycast(raycaster, objects, { filterErase: true });
|
|
|
|
|
|
|
|
|
|
let obj = intersection?.object;
|
|
|
|
|
if (obj)
|
|
|
|
|
{
|
|
|
|
|
let index = objects.findIndex(o => o === obj);
|
|
|
|
|
if (index !== -1 && hwdEnts[index])
|
|
|
|
|
{
|
|
|
|
|
en.WriteAllObjectRecord();
|
|
|
|
|
en = hwdEnts[index];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (en.LockMaterial)
|
|
|
|
|
{
|
|
|
|
|
hasEntMtlLocked = true;
|
|
|
|
|