screen-bounds
本文回答:取当前屏幕"看得见的图纸范围"
Engine.getScreenBoundsWcs(expandFactor?),返回 WCSBoundingBox;取屏幕内实体Engine.getScreenEntities(expandFactor?)。expandFactor默认 1.0,>1 会包含部分超出屏幕的实体(适合"预读"场景)。
一、最小用法
const bb = Engine.getScreenBoundsWcs();
console.log('WCS:', bb.minX, bb.minY, bb.maxX, bb.maxY);
console.log('size:', bb.width, bb.height);
const ents = Engine.getScreenEntities();
console.log('屏幕内实体数:', ents.length);
MCP 参考:vjcad/example/view/07screenbounds.js、vjcad/doc/view/index.md。
二、expandFactor
const ents1 = Engine.getScreenEntities(1.0); // 默认(精确屏幕内)
const ents15 = Engine.getScreenEntities(1.5); // 1.5 倍(含部分超出)
const ents2 = Engine.getScreenEntities(2.0); // 2 倍
实战:
| 场景 | expandFactor |
|---|---|
| 视口外不需要查询 | 1.0 |
| 想为下一帧预先做准备 | 1.5 ~ 2.0 |
| 大批量背景计算(不抖动) | 2.0 ~ 3.0 |
MCP 参考:vjcad/example/view/07screenbounds.js。
三、按颜色 / 类型 / 图层分桶
const ents = Engine.getScreenEntities();
const colorCounts = {};
ents.forEach(e => {
const c = e.color || 7;
colorCounts[c] = (colorCounts[c] || 0) + 1;
});
const layerEnts = ents.filter(e => e.layer === '墙体');
MCP 参考:vjcad/example/view/07screenbounds.js。
四、配合 SpatialIndex
如果还要做"在屏幕外,但即将进入"的范围查询,用 SpatialIndex.search(bounds) + 自己 expand bbox。详见 geometry/spatial-index。
反例
- 想取当前选中实体的范围:直接
Engine.getBoundsByEntities(Engine.ssGetFirst())(返回BoundingBox),不要先getScreenEntities再 filter(会漏掉 viewport 外但被选中的)。e.boundingBox()返回的就是BoundingBox实例(含pt1/pt2/minX/maxX/minY/maxY+minPoint/maxPoint访问器),可直接喂给mergeBoundingBoxes;只有GLine等几何计算内部的同名方法才返回{minX,minY,maxX,maxY}普通对象。 expandFactor设很大但不限制业务量:会拿到全图,性能没意义。
参考(官方文档 MCP)
- 文档:
vjcad/doc/view/index.md - 示例:
vjcad/example/view/07screenbounds.js