|
|
@ -153,21 +153,53 @@ export function escByKeyboard() { |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
viewport.state.cursorMode = 'normal' |
|
|
viewport.interactionManager.exitInteraction() |
|
|
system.msg('操作已取消') |
|
|
system.msg('操作已取消') |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 查找指定点附近指定距离内的所有 stateManager 下的 item 对象 |
|
|
|
|
|
* 如果要修改数据做提交, 执行此方法之前必须执行 beginStateUpdate |
|
|
|
|
|
* @param viewport 视窗 |
|
|
|
|
|
* @param point 点位 x,z 坐标 |
|
|
|
|
|
* @param distance 距离 |
|
|
|
|
|
*/ |
|
|
|
|
|
export function findStateItemsByDistance(viewport: Viewport, point: Vector2, distance: number): ItemJson[] { |
|
|
|
|
|
const result: ItemJson[] = [] |
|
|
|
|
|
|
|
|
|
|
|
for (const item of viewport.stateManager.vdata.items) { |
|
|
|
|
|
// 安全校验 tf 结构
|
|
|
|
|
|
if (!item.tf || !Array.isArray(item.tf) || item.tf[0].length < 3) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const [x, , z] = item.tf[0] |
|
|
|
|
|
const itemPoint = new Vector2(x, z) |
|
|
|
|
|
const dist = itemPoint.distanceTo(point) |
|
|
|
|
|
|
|
|
|
|
|
if (dist <= distance) { |
|
|
|
|
|
result.push(item) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 按距离升序排序(近距离优先)
|
|
|
|
|
|
return result.sort((a, b) => { |
|
|
|
|
|
const aPos = new Vector2(a.tf[0][0], a.tf[0][2]) |
|
|
|
|
|
const bPos = new Vector2(b.tf[0][0], b.tf[0][2]) |
|
|
|
|
|
return aPos.distanceTo(point) - bPos.distanceTo(point) |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
export function quickCopyByMouse() { |
|
|
export function quickCopyByMouse() { |
|
|
// 获取鼠标位置,查看鼠标是否在某个 viewport 的画布上,并取得该 viewport
|
|
|
// 获取鼠标位置,查看鼠标是否在某个 viewport 的画布上,并取得该 viewport
|
|
|
const currentMouseInfo = window['CurrentMouseInfo'] |
|
|
if (!CurrentMouseInfo?.viewport || !CurrentMouseInfo.x || !CurrentMouseInfo.z) { |
|
|
if (!currentMouseInfo?.viewport || !currentMouseInfo.x || !currentMouseInfo.z) { |
|
|
|
|
|
system.msg('无法获取鼠标位置') |
|
|
system.msg('无法获取鼠标位置') |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const x = currentMouseInfo.x |
|
|
const x = CurrentMouseInfo.x |
|
|
const z = currentMouseInfo.z |
|
|
const z = CurrentMouseInfo.z |
|
|
const viewport: Viewport = currentMouseInfo.viewport |
|
|
const viewport: Viewport = CurrentMouseInfo.viewport |
|
|
// const point: THREE.Vector2 = currentMouseInfo.mouse
|
|
|
// const point: THREE.Vector2 = currentMouseInfo.mouse
|
|
|
//
|
|
|
//
|
|
|
// const ray = new THREE.Raycaster()
|
|
|
// const ray = new THREE.Raycaster()
|
|
|
@ -181,26 +213,34 @@ export function quickCopyByMouse() { |
|
|
// console.log('intersections:', intersections)
|
|
|
// console.log('intersections:', intersections)
|
|
|
|
|
|
|
|
|
// 如果不在线上,查找0.2米内的有效点 Object3D, 如果有,则以这个点为起点, 延伸同类型的点,并让他们相连
|
|
|
// 如果不在线上,查找0.2米内的有效点 Object3D, 如果有,则以这个点为起点, 延伸同类型的点,并让他们相连
|
|
|
const r = findObject3DByCondition(viewport.scene, object => { |
|
|
const items = findStateItemsByDistance(viewport, new Vector2(x, z), 0.2) |
|
|
// 判断 object 是否是有效的 Object3D, 并且是当前 viewport 的对象
|
|
|
if (items[0]) { |
|
|
if (object instanceof THREE.Object3D && object.visible && |
|
|
|
|
|
object.userData.type && viewport.toolbox[object.userData.type]) { |
|
|
|
|
|
|
|
|
|
|
|
const toolbox: Toolbox = viewport.toolbox[object.userData.type] |
|
|
|
|
|
|
|
|
|
|
|
// 检查是否在 0.2 米内
|
|
|
|
|
|
const distance = object.position.distanceTo(new THREE.Vector3(x, 0, z)) |
|
|
|
|
|
if (distance < 0.2) { |
|
|
|
|
|
// 找到一个有效点,执行复制操作
|
|
|
// 找到一个有效点,执行复制操作
|
|
|
viewport.toolStartObject = object |
|
|
viewport.interactionManager.startInteraction(items[0].t, { startPoint: items[0].id }) |
|
|
viewport.state.cursorMode = object.userData.type |
|
|
|
|
|
// toolbox.start(object)
|
|
|
|
|
|
system.msg('连线成功') |
|
|
system.msg('连线成功') |
|
|
return true |
|
|
return |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
return false |
|
|
|
|
|
}) |
|
|
// const r = findObject3DByCondition(viewport.scene, object => {
|
|
|
|
|
|
// // 判断 object 是否是有效的 Object3D, 并且是当前 viewport 的对象
|
|
|
|
|
|
// if (object instanceof THREE.Object3D && object.visible &&
|
|
|
|
|
|
// object.userData.type && viewport.toolbox[object.userData.type]) {
|
|
|
|
|
|
//
|
|
|
|
|
|
// const toolbox: Toolbox = viewport.toolbox[object.userData.type]
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 检查是否在 0.2 米内
|
|
|
|
|
|
// const distance = object.position.distanceTo(new THREE.Vector3(x, 0, z))
|
|
|
|
|
|
// if (distance < 0.2) {
|
|
|
|
|
|
// // 找到一个有效点,执行复制操作
|
|
|
|
|
|
// viewport.toolStartObject = object
|
|
|
|
|
|
// viewport.state.cursorMode = object.userData.type
|
|
|
|
|
|
// // toolbox.start(object)
|
|
|
|
|
|
// system.msg('连线成功')
|
|
|
|
|
|
// return true
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return false
|
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
if (!r || r.length === 0) { |
|
|
if (!r || r.length === 0) { |
|
|
system.msg('鼠标所在位置,没有可复制的对象') |
|
|
system.msg('鼠标所在位置,没有可复制的对象') |
|
|
|