|
|
|
@ -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
|
|
|
|
|