From 033498db2ec2e5c93f6b45a96e55020cefebb5f9 Mon Sep 17 00:00:00 2001 From: ChenX Date: Tue, 16 Jan 2018 15:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E5=A4=B9=E7=82=B9=E6=8B=89=E4=BC=B8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=A7=BB=E5=87=BA=20SelectControl,=20?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E5=87=BA=E4=B8=80=E4=B8=AA=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?.=20=20=E5=B9=B6=E4=B8=94=E6=9B=B4=E6=96=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=82=B9=E5=90=8C=E6=97=B6=E6=8B=89=E4=BC=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ApplicationServices/Application.ts | 3 - src/DatabaseServices/Line.ts | 1 - src/Editor/Editor.ts | 6 +- src/Editor/SelectControls.ts | 99 +-------------- src/Editor/SnapDrag.ts | 14 --- src/Editor/SnapDragServices.ts | 166 +++++++++++++++++++++++++ src/GraphicsSystem/GripScene.ts | 12 +- src/GraphicsSystem/PreViewer.ts | 3 - 8 files changed, 179 insertions(+), 125 deletions(-) delete mode 100644 src/Editor/SnapDrag.ts create mode 100644 src/Editor/SnapDragServices.ts diff --git a/src/ApplicationServices/Application.ts b/src/ApplicationServices/Application.ts index c9ef5e77e..b739edfcf 100644 --- a/src/ApplicationServices/Application.ts +++ b/src/ApplicationServices/Application.ts @@ -8,7 +8,6 @@ import { commandMachine } from '../Editor/CommandMachine'; import { DatGUI } from '../Editor/DebugDatUi'; import { Editor } from '../Editor/Editor'; import { SelectSetBase } from '../Editor/SelectSet'; -import { SnapDrag } from '../Editor/SnapDrag'; import { Viewer } from '../GraphicsSystem/Viewer'; import { layoutOnsizeEvent } from '../UI/Layout/LayoutOnSizeEventManage'; @@ -81,8 +80,6 @@ export class ApplicationService }) regGripEvent(); - new SnapDrag(this); - xaop.begin(commandMachine, commandMachine.ExecCommand, () => { this.m_Viewer.m_GripScene.visible = false; diff --git a/src/DatabaseServices/Line.ts b/src/DatabaseServices/Line.ts index 800c06fb4..51182c33f 100644 --- a/src/DatabaseServices/Line.ts +++ b/src/DatabaseServices/Line.ts @@ -35,7 +35,6 @@ export class Line extends Entity Update() { - super.Update(); for (let [, obj] of this.m_DrawEntity) { let lineObj = (obj); diff --git a/src/Editor/Editor.ts b/src/Editor/Editor.ts index defcf748b..661858305 100644 --- a/src/Editor/Editor.ts +++ b/src/Editor/Editor.ts @@ -1,6 +1,6 @@ //用户交互编辑工具 -import { Vector3 } from 'three'; import * as THREE from 'three'; +import { Vector3 } from 'three'; import * as xaop from 'xaop'; import { app, ApplicationService } from '../ApplicationServices/Application'; @@ -12,6 +12,7 @@ import { KeyBoardControls } from './KeyBoardControls'; import { MouseControls } from './MouseControls'; import { PromptDistendResult, PromptPointResult } from './PromptResult'; import { SelectControls } from './SelectControls'; +import { SnapDragServices } from './SnapDragServices'; //TODO: 增加鼠标状态. 鼠标位置. export class Editor @@ -25,6 +26,7 @@ export class Editor private m_GetpointServices: GetPointServices; private m_GetDistanceServices: GetDistanceServices; + m_SnapDragServices: SnapDragServices; constructor(app: ApplicationService) { @@ -36,6 +38,8 @@ export class Editor this.m_GetpointServices = new GetPointServices(); this.m_GetDistanceServices = new GetDistanceServices(); + this.m_SnapDragServices = new SnapDragServices(this); + xaop.end(this.m_MouseCtrl, this.m_MouseCtrl.onMouseMove, () => { app.m_Viewer.m_PreViewer.SerCursorPostion(this.m_MouseCtrl.m_CurMousePointVCS); diff --git a/src/Editor/SelectControls.ts b/src/Editor/SelectControls.ts index b5172a62b..dcf8b7dd7 100644 --- a/src/Editor/SelectControls.ts +++ b/src/Editor/SelectControls.ts @@ -44,13 +44,7 @@ export class SelectControls { this.m_Viewer.m_OutlinePass.selectedObjects = this.m_SelectSet.SelectObjectList; this.m_Viewer.m_bNeedUpdate = true; - - if (this.m_Viewer.m_OutlinePass.selectedObjects.length > 0) - { - this.SnapGrip(); - } } - PointPick(pt: THREE.Vector3): THREE.Object3D { let raycaster = new THREE.Raycaster(); @@ -81,103 +75,15 @@ export class SelectControls return selectBox.m_SelectList[0]; } } - - removeSnapCall; - SnapGrip() - { - this.removeSnap(); - let mouseCtrl = app.m_Editor.m_MouseCtrl; - - let snapEvent = () => - { - if (commandMachine.m_CommandIng) - { - return; - } - for (let ptsObj of app.m_Viewer.m_GripScene.children) - { - if (ptsObj instanceof THREE.Points) - { - let en = ptsObj.userData.userData as Entity; - let pts = en.GetStretchPoints(); - for (let i = 0; i < pts.length; i++) - { - let ptC = pts[i]; - app.m_Viewer.WorldToScreen(ptC); - - if (ptC.distanceToSquared(mouseCtrl.m_CurMousePointVCS) < 100) - { - app.m_Viewer.m_PreViewer.m_LastSnapPoint = ptC; - - app.m_Viewer.m_PreViewer.m_LastEntity = ptsObj.userData; - app.m_Viewer.m_PreViewer.m_LastIndex = i; - - return; - } - } - } - } - }; - snapEvent(); - this.removeSnapCall = end(mouseCtrl, mouseCtrl.onMouseMove, snapEvent); - } - removeSnap() - { - if (this.removeSnapCall) - this.removeSnapCall(); - } - async GridDrag() - { - this.removeSnap(); - - app.m_Database.hm.StartCmd("drag"); - - app.m_Viewer.m_GripScene.Clear(); - app.m_Viewer.m_bNeedUpdate = true; - app.m_Editor.m_CommandStore.Prompt("拽拖开始:"); - app.m_Editor.m_CommandStore.isCmdIng = true; - - - let obj = app.m_Viewer.m_PreViewer.m_LastEntity; - let en = obj.userData as Entity; - - app.m_Editor.AddNoSnapEntity(obj); - - let lastP = app.m_Viewer.m_PreViewer.m_LastSnapPoint.clone(); - app.m_Viewer.ScreenToWorld(lastP); - - let index = app.m_Viewer.m_PreViewer.m_LastIndex; - let pt = await app.m_Editor.GetPoint({ - Msg: "指定下一个点:", - BasePoint: lastP.clone(), - AllowDrawRubberBand: true, - Callback: (callPt: THREE.Vector3) => - { - let p = en.GetStretchPoints()[index]; - en.MoveStretchPoints([index], callPt.sub(en.GetStretchPoints()[index])); - } - }) - - app.m_Editor.RemoveNoSnapEntity(obj); - - app.m_Viewer.m_GripScene.Update(obj); - - app.m_Editor.m_CommandStore.isCmdIng = false; - - this.SnapGrip(); - } onMouseDown(e: MouseEvent) { if (e.button === MouseKey.Left) { if (this.m_Editor.m_InputState <= 1) { - if (app.m_Viewer.m_GripScene.children.length > 0 && app.m_Viewer.m_PreViewer.m_LastSnapPoint && app.m_Editor.m_InputState == 0 && !this.m_SelectIng) - { - this.GridDrag(); + //这里判断是否存在夹点拉伸的点,如果存在,则交给夹点拉伸 + if (this.m_Editor.m_SnapDragServices.lastSnapPoint) return; - } - let pt = this.m_Editor.m_MouseCtrl.m_CurMousePointVCS; let isRemove = app.m_Editor.m_KeyCtrl.KeyIsDown(KeyBoard.Shift); @@ -251,7 +157,6 @@ export class SelectControls this.m_SelectCss.Hide(); app.m_Viewer.m_PreViewer.ToSelect(); this.m_SelectIng = false; - this.removeSnap(); } Cancel() { diff --git a/src/Editor/SnapDrag.ts b/src/Editor/SnapDrag.ts deleted file mode 100644 index 27ad673d6..000000000 --- a/src/Editor/SnapDrag.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApplicationService } from '../ApplicationServices/Application'; - -export class SnapDrag -{ - constructor(app: ApplicationService) - { - - } - - async drag() - { - - } -} diff --git a/src/Editor/SnapDragServices.ts b/src/Editor/SnapDragServices.ts new file mode 100644 index 000000000..ba18b45a5 --- /dev/null +++ b/src/Editor/SnapDragServices.ts @@ -0,0 +1,166 @@ +import { Vector3 } from 'three'; +import * as THREE from 'three'; +import { end } from 'xaop'; + +import { app } from '../ApplicationServices/Application'; +import { InputState } from '../Common/InputState'; +import { Entity } from '../DatabaseServices/Entity'; +import { MouseControls } from './MouseControls'; +import { Move } from '../Geometry/GeUtils'; +import { Editor } from './Editor'; +import { MouseKey } from '../Common/KeyEnum'; + + +export class SnapDragServices +{ + preViewLines: THREE.Line[] = []; + lastSnapPoint: Vector3;//Wcs + + private mouseCtrl: MouseControls; + constructor(ed: Editor) + { + this.mouseCtrl = ed.m_MouseCtrl; + end(this.mouseCtrl, this.mouseCtrl.onMouseMove, () => this.GripSnap()); + end(this.mouseCtrl, this.mouseCtrl.onMouseDown, (e) => this.StartSnap(e)); + } + + GripSnap() + { + if (app.m_Editor.m_InputState > InputState.None) + return; + if (this.lastSnapPoint) + { + let lastVcs = this.lastSnapPoint.clone(); + app.m_Viewer.WorldToScreen(lastVcs); + + if (this.mouseCtrl.m_CurMousePointVCS.distanceToSquared(lastVcs) < 100) + return; + } + + this.UpdateLastPoint(); + + this.DestroyPreLine(); + //更新光标 + this.UpdatePreLine(); + } + + async StartSnap(e: MouseEvent) + { + if (e.button !== MouseKey.Left) + return; + if (app.m_Editor.m_InputState > InputState.None) + return; + if (!this.lastSnapPoint) + return; + + this.DestroyPreLine(); + + app.m_Viewer.m_bNeedUpdate = true; + app.m_Editor.m_CommandStore.Prompt("拽拖开始:"); + app.m_Editor.m_CommandStore.isCmdIng = true; + + let snapIndexMap: { ent: Entity, indexArr: number[] }[] = []; + for (let ptsObj of app.m_Viewer.m_GripScene.children) + { + if (ptsObj instanceof THREE.Points) + { + let en = ptsObj.userData.userData as Entity; + let pts = en.GetStretchPoints(); + + let arr: number[] = []; + for (let i = 0; i < pts.length; i++) + { + let ptW = pts[i]; + let ptV = ptW.clone(); + app.m_Viewer.WorldToScreen(ptV); + + if (ptV.distanceToSquared(this.mouseCtrl.m_CurMousePointVCS) < 100) + { + arr.push(i); + } + } + if (arr.length > 0) + { + snapIndexMap.push({ ent: en, indexArr: arr }); + app.m_Editor.AddNoSnapEntity(ptsObj.userData); + } + } + } + app.m_Viewer.m_GripScene.visible = false; + + let lastP = this.lastSnapPoint.clone(); + let pt = await app.m_Editor.GetPoint({ + Msg: "指定下一个点:", + BasePoint: this.lastSnapPoint.clone(), + AllowDrawRubberBand: true, + Callback: (callPt: THREE.Vector3) => + { + let vec = callPt.clone().sub(lastP); + lastP.copy(callPt); + for (let data of snapIndexMap) + { + data.ent.MoveStretchPoints(data.indexArr, vec); + } + } + }) + + app.m_Editor.ClearSnapEntity(); + app.m_Viewer.m_GripScene.UpdateAll(); + app.m_Viewer.m_GripScene.visible = true; + app.m_Editor.m_CommandStore.isCmdIng = false; + } + + private UpdateLastPoint() + { + this.lastSnapPoint = undefined; + for (let ptsObj of app.m_Viewer.m_GripScene.children) + { + if (ptsObj instanceof THREE.Points) + { + let en = ptsObj.userData.userData as Entity; + let pts = en.GetStretchPoints(); + for (let i = 0; i < pts.length; i++) + { + let ptW = pts[i]; + let ptV = ptW.clone(); + app.m_Viewer.WorldToScreen(ptV); + + if (ptV.distanceToSquared(this.mouseCtrl.m_CurMousePointVCS) < 100) + { + this.lastSnapPoint = ptW; + break; + } + } + } + } + } + + private UpdatePreLine() + { + if (this.lastSnapPoint) + { + this.preViewLines = app.m_Viewer.m_PreViewer.DrawCross(10); + let ptV = this.lastSnapPoint.clone(); + app.m_Viewer.WorldToScreen(ptV); + app.m_Viewer.m_PreViewer.ScreenPointToViewerPoint(ptV); + let move = Move(ptV); + this.preViewLines.forEach(l => + { + l.applyMatrix(move); + }); + app.m_Viewer.m_PreViewer.Scene.add(...this.preViewLines); + app.m_Viewer.m_PreViewer.render(); + } + } + + private DestroyPreLine() + { + this.preViewLines.forEach(o => + { + o.parent.remove(o); + o.geometry.dispose(); + }); + this.preViewLines.length = 0; + app.m_Viewer.m_PreViewer.render(); + } +} diff --git a/src/GraphicsSystem/GripScene.ts b/src/GraphicsSystem/GripScene.ts index 645db31ce..c0bcd0120 100644 --- a/src/GraphicsSystem/GripScene.ts +++ b/src/GraphicsSystem/GripScene.ts @@ -20,22 +20,22 @@ export class GripScene extends THREE.Object3D }); } //增加 - Append(en: THREE.Object3D) + Append(obj: THREE.Object3D) { - if (this.m_GripMap.has(en)) + if (this.m_GripMap.has(obj)) { return; } - if (en.userData instanceof Entity) + if (obj.userData instanceof Entity) { - let pts = en.userData.GetStretchPoints(); + let pts = obj.userData.GetStretchPoints(); let geom = new THREE.Geometry(); geom.setFromPoints(pts); let ptsObj = new THREE.Points(geom, this.m_GripMaterial); - ptsObj.userData = en; + ptsObj.userData = obj; this.add(ptsObj); - this.m_GripMap.set(en, ptsObj); + this.m_GripMap.set(obj, ptsObj); } } Remove(obj: THREE.Object3D) diff --git a/src/GraphicsSystem/PreViewer.ts b/src/GraphicsSystem/PreViewer.ts index 60fd5f66d..bba08c544 100644 --- a/src/GraphicsSystem/PreViewer.ts +++ b/src/GraphicsSystem/PreViewer.ts @@ -31,9 +31,6 @@ export class PreViewer //光标对象 private m_CursorObject: THREE.Group; m_LastSnapPoint: THREE.Vector3; - m_LastEntity: THREE.Object3D; - m_LastIndex: number; - private m_Width: number; private m_Height: number;