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

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

@ -54,15 +54,75 @@ 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 //@ts-ignore
if (!obj.geometry || !this.FrustomIntersectObject(obj)) if (!obj.geometry || !this.FrustomIntersectObject(obj))
return false; return false;
if (this._SelectType === SelectType.C)
return this.IntersectObject(obj); return this.IntersectObject(obj);
else }
private CheckSelectW(obj: Object3D): 0 | -1 | 1
{
//@ts-ignore
if (!obj.geometry || !this.FrustomIntersectObject(obj))
return 0;
return this.ContainerObject(obj); 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); let { pts, } = this.GetObjectVertices(obj);
if (pts.length === 0) if (pts.length === 0)
return false; return -1;
for (let p of pts) for (let p of pts)
{ {
if (!this.ContainsPoint(p)) if (!this.ContainsPoint(p))
return false; return -1;
} }
return true; return 1;
} }
//选择框包含该顶点 //选择框包含该顶点
ContainsPoint(ptWcs: Vector3): boolean ContainsPoint(ptWcs: Vector3): boolean

Loading…
Cancel
Save