优化:放置模型允许吸附被冻结的实体

pull/2220/head
ChenX 1 year ago
parent 85b6b8bf31
commit e6ea7ebff4

@ -1,14 +1,15 @@
import hotkeys from 'hotkeys-js-ext'; 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 * as xaop from 'xaop';
import { end } from 'xaop'; import { end } from 'xaop';
import { app } from '../ApplicationServices/Application'; import { app } from '../ApplicationServices/Application';
import { HostApplicationServices } from '../ApplicationServices/HostApplicationServices'; import { HostApplicationServices } from '../ApplicationServices/HostApplicationServices';
import { ColorMaterial } from '../Common/ColorPalette'; import { ColorMaterial } from '../Common/ColorPalette';
import { DisposeThreeObj } from '../Common/Dispose'; import { DisposeThreeObj } from '../Common/Dispose';
import { safeEval } from '../Common/eval';
import { InputState, KeyWord, MenuDividerKWD } from '../Common/InputState'; import { InputState, KeyWord, MenuDividerKWD } from '../Common/InputState';
import { KeyBoard, MouseKey } from '../Common/KeyEnum'; import { KeyBoard, MouseKey } from '../Common/KeyEnum';
import { safeEval } from '../Common/eval'; import { Entity } from '../DatabaseServices/Entity/Entity';
import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils'; import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils';
import { isParallelTo } from '../Geometry/GeUtils'; import { isParallelTo } from '../Geometry/GeUtils';
import { CursorMode } from '../GraphicsSystem/Cursor'; import { CursorMode } from '../GraphicsSystem/Cursor';
@ -23,7 +24,8 @@ import { ObjectSnapMode } from './ObjectSnapMode';
import { GenerateRaycaster, Raycast } from './PointPick'; import { GenerateRaycaster, Raycast } from './PointPick';
import { GetPointPrompt } from "./PromptOptions"; import { GetPointPrompt } from "./PromptOptions";
import { PromptPointResult, PromptStatus } from './PromptResult'; import { PromptPointResult, PromptStatus } from './PromptResult';
import { SNAPMODE, SnapMenuKW } from './ShowSnapMenu'; import { Filter } from './SelectFilter';
import { SnapMenuKW, SNAPMODE } from './ShowSnapMenu';
import { SnapServices } from './SnapServices'; import { SnapServices } from './SnapServices';
const MinP = new Vector3(-2e6, -2e6, -2e6); const MinP = new Vector3(-2e6, -2e6, -2e6);
@ -175,7 +177,20 @@ export class GetPointServices implements EditorService
if (this._prompt.RaycastPreExecFunc) this._prompt.RaycastPreExecFunc(); if (this._prompt.RaycastPreExecFunc) this._prompt.RaycastPreExecFunc();
let raycaster = GenerateRaycaster(app.Editor.MouseCtrl._CurMousePointVCS, app.Viewer); 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) if (this.intersection?.point)
app.Editor.MouseCtrl._CurMousePointWCS.copy(this.intersection.point); app.Editor.MouseCtrl._CurMousePointWCS.copy(this.intersection.point);
} }

@ -44,6 +44,7 @@ export interface GetPointPrompt extends PromptOptions
DisabledSnap?: boolean; DisabledSnap?: boolean;
DisabledBasePointSupportSnap?: boolean; DisabledBasePointSupportSnap?: boolean;
Raycast?: boolean; Raycast?: boolean;
RaycastFilter?: Filter;
RaycastPreExecFunc?: Function; RaycastPreExecFunc?: Function;
DisableAngleDynInput?: boolean; DisableAngleDynInput?: boolean;

@ -270,7 +270,7 @@ function RayDistance(pts: Vector3[], dir: Vector3, objs: Object3D[])
for (let p of pts) for (let p of pts)
{ {
let r = new Raycaster(p, dir); let r = new Raycaster(p, dir);
let i = Raycast(r, objs); let i = Raycast(r, objs, { selectFreeze: true });
if (i) if (i)
{ {
minDist = Math.min(i.distance, minDist); minDist = Math.min(i.distance, minDist);

@ -453,6 +453,7 @@ export class TransformServicess implements EditorService
let ptRes = await app.Editor.GetPoint({ let ptRes = await app.Editor.GetPoint({
Msg: "请点击放置位置(按住Ctrl强制穿透):", Msg: "请点击放置位置(按住Ctrl强制穿透):",
Raycast: true, Raycast: true,
RaycastFilter: { selectFreeze: true },
Callback: (p, i) => Callback: (p, i) =>
{ {
if (i?.face?.normal) if (i?.face?.normal)

Loading…
Cancel
Save