diff --git a/src/Editor/GetPointServices.ts b/src/Editor/GetPointServices.ts index 42ebe8210..b844cd70a 100644 --- a/src/Editor/GetPointServices.ts +++ b/src/Editor/GetPointServices.ts @@ -1,14 +1,15 @@ import hotkeys from 'hotkeys-js-ext'; -import { BufferGeometry, Intersection, Light, Line, Vector3 } from 'three'; +import { BufferGeometry, Intersection, Light, Line, Object3D, Vector3 } from 'three'; import * as xaop from 'xaop'; import { end } from 'xaop'; import { app } from '../ApplicationServices/Application'; import { HostApplicationServices } from '../ApplicationServices/HostApplicationServices'; import { ColorMaterial } from '../Common/ColorPalette'; import { DisposeThreeObj } from '../Common/Dispose'; +import { safeEval } from '../Common/eval'; import { InputState, KeyWord, MenuDividerKWD } from '../Common/InputState'; import { KeyBoard, MouseKey } from '../Common/KeyEnum'; -import { safeEval } from '../Common/eval'; +import { Entity } from '../DatabaseServices/Entity/Entity'; import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils'; import { isParallelTo } from '../Geometry/GeUtils'; import { CursorMode } from '../GraphicsSystem/Cursor'; @@ -23,7 +24,8 @@ import { ObjectSnapMode } from './ObjectSnapMode'; import { GenerateRaycaster, Raycast } from './PointPick'; import { GetPointPrompt } from "./PromptOptions"; import { PromptPointResult, PromptStatus } from './PromptResult'; -import { SNAPMODE, SnapMenuKW } from './ShowSnapMenu'; +import { Filter } from './SelectFilter'; +import { SnapMenuKW, SNAPMODE } from './ShowSnapMenu'; import { SnapServices } from './SnapServices'; const MinP = new Vector3(-2e6, -2e6, -2e6); @@ -175,7 +177,20 @@ export class GetPointServices implements EditorService if (this._prompt.RaycastPreExecFunc) this._prompt.RaycastPreExecFunc(); let raycaster = GenerateRaycaster(app.Editor.MouseCtrl._CurMousePointVCS, app.Viewer); - this.intersection = Raycast(raycaster, app.Viewer.VisibleObjects, { filterFunction: (obj, ent) => { return obj.visible && ent && ent.Id && !ent.Id.IsErase && !(ent instanceof Light); } }); + let filterFunction = (obj: Object3D, ent: Entity) => obj.visible && ent && ent.Id && !ent.Id.IsErase && !(ent instanceof Light); + let filter: Filter = { filterFunction }; + if (this._prompt.RaycastFilter) + filter = { + ...this._prompt.RaycastFilter, + filterFunction: (obj, ent) => + { + if (this._prompt.RaycastFilter.filterFunction) + return this._prompt.RaycastFilter.filterFunction(obj, ent) && filterFunction(obj, ent); + return filterFunction(obj, ent); + } + }; + + this.intersection = Raycast(raycaster, app.Viewer.VisibleObjects, filter); if (this.intersection?.point) app.Editor.MouseCtrl._CurMousePointWCS.copy(this.intersection.point); } diff --git a/src/Editor/PromptOptions.ts b/src/Editor/PromptOptions.ts index 60c095556..b457047eb 100644 --- a/src/Editor/PromptOptions.ts +++ b/src/Editor/PromptOptions.ts @@ -44,6 +44,7 @@ export interface GetPointPrompt extends PromptOptions DisabledSnap?: boolean; DisabledBasePointSupportSnap?: boolean; Raycast?: boolean; + RaycastFilter?: Filter; RaycastPreExecFunc?: Function; DisableAngleDynInput?: boolean; diff --git a/src/Editor/TranstrolControl/ParsePlacePos.ts b/src/Editor/TranstrolControl/ParsePlacePos.ts index 485b7639e..2491fc757 100644 --- a/src/Editor/TranstrolControl/ParsePlacePos.ts +++ b/src/Editor/TranstrolControl/ParsePlacePos.ts @@ -270,7 +270,7 @@ function RayDistance(pts: Vector3[], dir: Vector3, objs: Object3D[]) for (let p of pts) { let r = new Raycaster(p, dir); - let i = Raycast(r, objs); + let i = Raycast(r, objs, { selectFreeze: true }); if (i) { minDist = Math.min(i.distance, minDist); diff --git a/src/Editor/TranstrolControl/TransformServices.ts b/src/Editor/TranstrolControl/TransformServices.ts index 37409f012..456a04d2c 100644 --- a/src/Editor/TranstrolControl/TransformServices.ts +++ b/src/Editor/TranstrolControl/TransformServices.ts @@ -453,6 +453,7 @@ export class TransformServicess implements EditorService let ptRes = await app.Editor.GetPoint({ Msg: "请点击放置位置(按住Ctrl强制穿透):", Raycast: true, + RaycastFilter: { selectFreeze: true }, Callback: (p, i) => { if (i?.face?.normal)