diff --git a/src/Add-on/OpenCabinet/OpenCabinet.ts b/src/Add-on/OpenCabinet/OpenCabinet.ts index 34d116226..40001d5c4 100644 --- a/src/Add-on/OpenCabinet/OpenCabinet.ts +++ b/src/Add-on/OpenCabinet/OpenCabinet.ts @@ -22,7 +22,7 @@ import { AppToaster } from "../../UI/Components/Toaster"; import { IsDoor, IsDrawer, IsHandle, IsHinge, IsLattice } from "../HideSelect/HideSelectUtils"; const MOVECOUNT = 150; -const UNOPENRENDERTYPE = [RenderType.Edge, RenderType.PlaceFace, RenderType.BigHoleFace]; //不支持开门动作的视图类型 +const UNOPENRENDERTYPE = [RenderType.Edge, RenderType.PlaceFace, RenderType.BigHoleFace, RenderType.ModelGroove]; //不支持开门动作的视图类型 export class Command_OpenCabinet implements Command { diff --git a/src/Common/ColorPalette.ts b/src/Common/ColorPalette.ts index 2a3fae0de..a238558b1 100644 --- a/src/Common/ColorPalette.ts +++ b/src/Common/ColorPalette.ts @@ -321,7 +321,7 @@ export class ColorMaterial } private static _ConceptualMaterial: Map = new Map(); - static GetConceptualMaterial(color: number, side: Side = FrontSide, enableTransparent = false, freeze = false) + static GetConceptualMaterial(color: number, side: Side = FrontSide, enableTransparent = false, freeze = false, opacity?: number) { if (freeze) color = 257; let key = `${color},${side},${enableTransparent ? 1 : 0}`; @@ -336,7 +336,15 @@ export class ColorMaterial get: () => mtl.uniforms.opacity.value !== 1 }); Object.defineProperty(mtl.uniforms.opacity, "value", { - get: () => freeze ? 0.5 : HostApplicationServices.ConceptualOpacity + get: () => + { + let conceptualOpacity = HostApplicationServices.ConceptualOpacity; + if (freeze) + conceptualOpacity = 0.5; + else if (opacity) + conceptualOpacity = opacity; + return conceptualOpacity; + } }); } this._ConceptualMaterial.set(key, mtl); diff --git a/src/Common/CommandNames.ts b/src/Common/CommandNames.ts index 749c133ec..a00569881 100644 --- a/src/Common/CommandNames.ts +++ b/src/Common/CommandNames.ts @@ -293,6 +293,7 @@ export enum CommandNames DrawTempByImport = "DRAWTEMPBYIMPORT", CheckEdge = "CHECKEDGE",//封边检查 CheckPlaceFace = "CHECKPLACEFACE",//排版面视觉样式显示 + ModelGroove = "MODELGROOVE",//造型槽 VisualStyle_CustomNumber = "VSCUSTOMNUMBER",//自定义编号视觉样式 CustomNumber = "CUSTOMNUMBER",//自定义编号UI CleanCustomNumber = "CLEANCUSTOMNUMBER",//清除自定义编号 diff --git a/src/DatabaseServices/3DSolid/CylinderHole.ts b/src/DatabaseServices/3DSolid/CylinderHole.ts index fb7db9907..f3e320ed7 100644 --- a/src/DatabaseServices/3DSolid/CylinderHole.ts +++ b/src/DatabaseServices/3DSolid/CylinderHole.ts @@ -158,7 +158,7 @@ export class CylinderHole extends Hole { if (renderType === RenderType.Wireframe) return new LineSegments(this.EdgeGeometry, ColorMaterial.GetLineMaterial(this.ColorIndex)); - else if (renderType === RenderType.CustomNumber) + else if (renderType === RenderType.CustomNumber || renderType === RenderType.ModelGroove) return;//不绘制了 // return new Mesh(this.MeshGeometry, ColorMaterial.GetConceptualMaterial(this.ColorIndex, FrontSide, true)); else @@ -182,7 +182,7 @@ export class CylinderHole extends Hole else { let mesh = obj as Mesh; - if (type === RenderType.CustomNumber) + if (type === RenderType.CustomNumber || type === RenderType.ModelGroove) mesh.material = ColorMaterial.GetConceptualMaterial(this.ColorIndex, FrontSide, true); else mesh.material = ColorMaterial.GetConceptualMaterial(this.ColorIndex); diff --git a/src/DatabaseServices/Entity/Board.ts b/src/DatabaseServices/Entity/Board.ts index 718460686..7b8ed44ba 100644 --- a/src/DatabaseServices/Entity/Board.ts +++ b/src/DatabaseServices/Entity/Board.ts @@ -1835,6 +1835,7 @@ export class Board extends ExtrudeSolid || renderType === RenderType.BigHoleFace //大孔面检查 || renderType === RenderType.CustomNumber //自定义编号 || renderType === RenderType.CustomNumberPrint//自定义编号打印 + || renderType === RenderType.ModelGroove //造型槽 ) { obj = new Object3D(); @@ -1876,7 +1877,6 @@ export class Board extends ExtrudeSolid obj.add(this.GetBigHoleFace()); } - else if (renderType === RenderType.CustomNumber || renderType === RenderType.CustomNumberPrint) { if (renderType === RenderType.CustomNumberPrint) diff --git a/src/DatabaseServices/Entity/CompositeEntity.ts b/src/DatabaseServices/Entity/CompositeEntity.ts index f7a5098c3..283c1574d 100644 --- a/src/DatabaseServices/Entity/CompositeEntity.ts +++ b/src/DatabaseServices/Entity/CompositeEntity.ts @@ -110,6 +110,7 @@ export abstract class CompositeEntity extends Entity UpdateDrawObject(renderType: RenderType, obj: Object3D) { Object3DRemoveAll(obj); + if (renderType === RenderType.ModelGroove) return; for (let e of this.Entitys) { e.IsEmbedEntity = true; diff --git a/src/DatabaseServices/Entity/Extrude.ts b/src/DatabaseServices/Entity/Extrude.ts index c9ae8756e..5c0f73ab0 100644 --- a/src/DatabaseServices/Entity/Extrude.ts +++ b/src/DatabaseServices/Entity/Extrude.ts @@ -1,6 +1,6 @@ import { Geom3 } from '@jscad/modeling/src/geometries/types'; import Flatbush from 'flatbush'; -import { Box3, BoxGeometry, BufferGeometry, ExtrudeGeometry, ExtrudeGeometryOptions, Float32BufferAttribute, FrontSide, Frustum, Geometry, InstancedInterleavedBuffer, InterleavedBufferAttribute, LineSegments, Matrix3, Matrix4, Mesh, Object3D, Line as TLine, UVGenerator, Vector3 } from "three"; +import { Box3, BoxGeometry, BufferGeometry, ExtrudeGeometry, ExtrudeGeometryOptions, Float32BufferAttribute, FrontSide, Frustum, Geometry, Group, InstancedInterleavedBuffer, InterleavedBufferAttribute, LineSegments, Matrix3, Matrix4, Mesh, Object3D, Line as TLine, UVGenerator, Vector3 } from "three"; import { Line2 } from "three/examples/jsm/lines/Line2"; import { LineGeometry } from "three/examples/jsm/lines/LineGeometry"; import { arrayClone, arrayLast, arrayPushArray, arrayRemoveIf, arrayRemoveOnce, arraySortByNumber, arraySum } from "../../Common/ArrayExt"; @@ -2113,6 +2113,14 @@ export class ExtrudeSolid extends Entity new LineSegments(this.EdgeGeometry, ColorMaterial.GetConceptualEdgeMaterial()) ); } + else if (renderType === RenderType.ModelGroove) + { + obj.add( + // new Mesh(this.MeshGeometry, ColorMaterial.GetConceptualMaterial(9, FrontSide, true, this.Freeze)), + new LineSegments(this.EdgeGeometry, ColorMaterial.GetConceptualEdgeMaterial()) + ); + obj.add(this.GetModelGroove()); + } else if (renderType === RenderType.Physical) { let mesh = obj as Mesh; @@ -2169,7 +2177,31 @@ export class ExtrudeSolid extends Entity mesh.material = this.MeshMaterial; } } + private GetModelGroove() + { + const grooves: ExtrudeSolid[] = []; + for (const sp of this.__CacheSplitExtrudes ?? []) + { + grooves.push(...sp.grooves); + } + const group = new Group(); + for (const groove of grooves) + { + const grooveClone = groove.Clone(); + grooveClone.UpdateDrawGeometry(); + const mtx = new Matrix4().premultiply(grooveClone.OCSNoClone).premultiply(this.OCSInv); + + const edgeGeo = grooveClone.EdgeGeometry; + edgeGeo.applyMatrix4(mtx); + const line = new LineSegments(edgeGeo, ColorMaterial.GetLineMaterial(1, this.Freeze)); + const meshGeo = grooveClone.MeshGeometry; + meshGeo.applyMatrix4(mtx); + const mesh = new Mesh(meshGeo, ColorMaterial.GetConceptualMaterial(1, FrontSide, true, this.Freeze, 0.6)); + group.add(mesh, line); + } + return group; + } UpdateJigMaterial(color = 8) { diff --git a/src/Editor/CommandRegister.ts b/src/Editor/CommandRegister.ts index 7586716c9..3c45b8e27 100644 --- a/src/Editor/CommandRegister.ts +++ b/src/Editor/CommandRegister.ts @@ -643,6 +643,7 @@ export function registerCommand() commandMachine.RegisterCommand(CommandNames.CheckPlaceFace, new ChangeRenderType(RenderType.PlaceFace)); commandMachine.RegisterCommand(CommandNames.BigHoleFace, new ChangeRenderType(RenderType.BigHoleFace)); commandMachine.RegisterCommand(CommandNames.VisualStyle_CustomNumber, new ChangeRenderType(RenderType.CustomNumber, 0.2)); + commandMachine.RegisterCommand(CommandNames.ModelGroove, new ChangeRenderType(RenderType.ModelGroove, 0.2)); commandMachine.RegisterCommand(CommandNames.BackgroundSwitching, new BackgroundSwitching()); commandMachine.RegisterCommand(CommandNames.Renderer, new CMD_Renderer()); diff --git a/src/Editor/UserConfig.ts b/src/Editor/UserConfig.ts index bf9bdad34..2dfd52916 100644 --- a/src/Editor/UserConfig.ts +++ b/src/Editor/UserConfig.ts @@ -186,7 +186,7 @@ export class UserConfig implements IConfigStore Init() { let type = Number(globalThis.localStorage?.getItem(StoreageKeys.RenderType)); - if (type && type !== RenderType.Edge) + if (type && type !== RenderType.Edge && type !== RenderType.ModelGroove) this._renderType = type; globalThis.userconfig = this; diff --git a/src/GraphicsSystem/RenderType.ts b/src/GraphicsSystem/RenderType.ts index dc1f26c2f..0604813af 100644 --- a/src/GraphicsSystem/RenderType.ts +++ b/src/GraphicsSystem/RenderType.ts @@ -28,6 +28,7 @@ export enum RenderType PlaceFace = 8,//排版面 OpenCabinet.UNOPENRENDERTYPE 该视图下不支持开门动作 BigHoleFace = 81, //大孔面 OpenCabinet.UNOPENRENDERTYPE 该视图下不支持开门动作 CustomNumber = 9,//自定义编号 + ModelGroove = 10,//造型槽 OpenCabinet.UNOPENRENDERTYPE 该视图下不支持开门动作 /******************************************** 在视口时的渲染模式 */ /** diff --git a/src/UI/Components/AxisMode/AxisMode.tsx b/src/UI/Components/AxisMode/AxisMode.tsx index 9aa5128f5..e1b2687ab 100644 --- a/src/UI/Components/AxisMode/AxisMode.tsx +++ b/src/UI/Components/AxisMode/AxisMode.tsx @@ -108,7 +108,7 @@ export default class AxisMode extends Component return (
{ - this.innerWidth < 920 ? + this.innerWidth < 1040 ?
{ this.RenderControlsMenu() } - + { this.RenderViewMenu() } - + { - this.innerWidth < 850 ? + this.innerWidth < 950 ? @@ -201,7 +201,7 @@ export class CameraControlBtn extends React.Component<{}, {}> { this.RenderVisualStylesMenu() } - : + : <> {VisualStyleData.map( (data) => diff --git a/src/UI/Components/CameraControlButton/IVisualType.ts b/src/UI/Components/CameraControlButton/IVisualType.ts index 296543a4b..f88b73add 100644 --- a/src/UI/Components/CameraControlButton/IVisualType.ts +++ b/src/UI/Components/CameraControlButton/IVisualType.ts @@ -42,6 +42,10 @@ export const VisualStyleData2: IVisualStyle[] = [ title: "概念(透明)", cmd: CommandNames.ConceptualTransparent }, + { + title: "造型槽", + cmd: CommandNames.ModelGroove + }, { title: "板号", cmd: CommandNames.VisualStyle_CustomNumber