!1337 修复:窗选选择错误的问题

pull/1337/MERGE
ChenX 4 years ago
parent db17ac037c
commit 5c1508dc20

@ -54,16 +54,76 @@ export class SelectBox extends SelectSetBase
}
//重载
protected CheckSelect(obj: Object3D): boolean
CheckSelectTraverse(obj: Object3D): boolean
{
if (!obj.visible) return false;
if (this._SelectType === SelectType.C)
{
let isSelect = false;
const traverse = (o: Object3D) =>
{
if (!o.visible) return;
isSelect = this.CheckSelectC(o);
if (isSelect) return;
for (let c of o.children)
{
traverse(c);
if (isSelect) return;
}
};
traverse(obj);
return isSelect;
}
else
{
//对于窗选,需要所有的实体都被包含才能被选中,所以这里区分了三个状态,0,-1,1,必须要有1,并且没有-1才行
let isSelect = 0;//0表示没有被选中 1表示有被选中 -1表示选不重 某些东西没有几何体,返回0
const traverse = (o: Object3D) =>
{
if (!o.visible) return;
let isSelectObject = this.CheckSelectW(o);
if (isSelectObject === 1)
isSelect = isSelectObject;
else if (isSelectObject === -1)
{
isSelect = isSelectObject;
return;
}
for (let c of o.children)
{
traverse(c);
if (isSelect === -1) return;
}
};
traverse(obj);
return isSelect === 1;
}
}
private CheckSelectC(obj: Object3D): boolean
{
//@ts-ignore
if (!obj.geometry || !this.FrustomIntersectObject(obj))
return false;
if (this._SelectType === SelectType.C)
return this.IntersectObject(obj);
else
return this.ContainerObject(obj);
return this.IntersectObject(obj);
}
private CheckSelectW(obj: Object3D): 0 | -1 | 1
{
//@ts-ignore
if (!obj.geometry || !this.FrustomIntersectObject(obj))
return 0;
return this.ContainerObject(obj);
}
//重载
@ -74,17 +134,17 @@ export class SelectBox extends SelectSetBase
/**
* .
*/
ContainerObject(obj: Object3D): boolean
ContainerObject(obj: Object3D): 1 | -1
{
let { pts, } = this.GetObjectVertices(obj);
if (pts.length === 0)
return false;
return -1;
for (let p of pts)
{
if (!this.ContainsPoint(p))
return false;
return -1;
}
return true;
return 1;
}
//选择框包含该顶点
ContainsPoint(ptWcs: Vector3): boolean

Loading…
Cancel
Save