重构单选和trim

pull/59/head
ChenX 7 years ago
parent 1bc879bde1
commit 50a87fd8a8

@ -66,7 +66,7 @@ export class Command_Extend implements Command
}
else if (set instanceof SelectPick)
{
selectCenterPt = set.m_PickPoint.clone();
selectCenterPt = set.m_PickPointVcs.clone();
}
app.m_Viewer.ScreenToWorld(selectCenterPt);

@ -10,6 +10,7 @@ import { SelectPick } from '../Editor/SelectPick';
import { SelectSet, SelectType } from '../Editor/SelectSet';
import { RenderType } from '../GraphicsSystem/Enum';
import { IntersectOption } from '../GraphicsSystem/IntersectWith';
import { PathPlugin } from 'awesome-typescript-loader/dist/paths-plugin';
//TODO: 需要全部计算完成后在打断.
@ -71,76 +72,21 @@ export class Command_Trim implements Command
}
else
{
//测试代码 绘制出被打断的曲线
// for (let cu of splitCus)
// {
// app.m_Database.ModelSpace.Append(cu)
// }
}
let needBreakCus: Curve[];
if (s instanceof SelectPick)
{
let pickPoint = s.m_PickPoint.clone();
app.m_Viewer.ScreenToWorld(pickPoint);
splitCus.sort((c1, c2) =>
{
return c1.GetClosestPointTo(pickPoint, false).distanceToSquared(pickPoint)
- c2.GetClosestPointTo(pickPoint, false).distanceToSquared(pickPoint);
});
needBreakCus = [splitCus[0]];
}
else if (s instanceof SelectBox)
{
let sbox = s;
if (s.m_SelectType === SelectType.W)
continue;
needBreakCus = splitCus.filter(c =>
if (s instanceof SelectBox)
{
return sbox.IntersectObject(c.Draw(RenderType.Wireframe));
})
let set = s;
splitCus = splitCus.filter(cu => { return !set.IntersectObject(cu.Draw(RenderType.Wireframe)) });
splitCus.forEach(cu => app.m_Database.ModelSpace.Append(cu));
}
//打断原先的曲线
let lastCu = cu;
for (let breakCu of needBreakCus)
{
let breakParams = [breakCu.StartPoint, breakCu.EndPoint].map(p => lastCu.GetParamAtPoint(p));
let breakCus = lastCu.GetSplitCurves(breakParams);
if (breakCus.length === 2)
{
let mindP = breakCu.GetPointAtParam(0.5);
if (breakCus[0].PtOnCurve(mindP))
lastCu = breakCus[1];
else
lastCu = breakCus[0];
}
else if (breakCus.length === 3)
{
app.m_Database.ModelSpace.Append(breakCus[0]);
lastCu = breakCus[breakCus.length - 1];
}
else// 可能造成的错误.
{
console.warn("未预料到的.")
cu.Erase();
continue;
}
}
// if (cu.constructor.name === lastCu.constructor.name)
// {
// if (cu instanceof Polyline)
// cu.CloseMark = false;
// cu.CopyFrom(lastCu);
// }
// else
// {
cu.Erase();
app.m_Database.ModelSpace.Append(lastCu);
// }
}
}

@ -1,20 +1,107 @@
import { SelectSetBase } from './SelectSet';
import { Object3D, Raycaster, Vector2, Vector3, Line } from 'three';
import { Vec3DTo2D } from '../Common/CurveUtils';
import { Viewer } from '../GraphicsSystem/Viewer';
import { Vector3 } from 'three';
import { SelectBox } from './SelectBox';
import { GripScene } from '../GraphicsSystem/GripScene';
import { SelectType } from './SelectSet';
/**
*
*
* @export
* @class SelectPick
* @extends {SelectSetBase}
* @extends {SelectBox}
*/
export class SelectPick extends SelectSetBase
export class SelectPick extends SelectBox
{
m_PickPoint: Vector3;
//用户点击选择时,点击的鼠标点(屏幕坐标系)
m_PickPointVcs: Vector3;
m_Raycaster: Raycaster = new Raycaster();
constructor(view: Viewer, ptVcs: Vector3)
{
super(view);
this.m_PickPoint = ptVcs.clone();
super(view,
Vec3DTo2D(ptVcs).add(new Vector2(-5, -5)),
Vec3DTo2D(ptVcs).add(new Vector2(5, 5))
);
this.m_SelectType = SelectType.C;
this.m_PickPointVcs = ptVcs.clone();
this.m_Raycaster.setFromCamera({
x: (ptVcs.x / view.Width) * 2 - 1, //-1 到 1 所以 (x-(w/2))/(w/2) =>
y: - (ptVcs.y / view.Height) * 2 + 1 //y轴相反
}, view.Camera);
this.m_Raycaster.ray.origin.sub(this.m_Raycaster.ray.direction.clone().multiplyScalar(1e3));
}
Select(selectList?: Object3D[], onlyOne = true)
{
selectList = selectList || this.m_Viewer.Scene.children;
//1.射线检测
let pickObj: Object3D;
let minDistance: number = 1e300;
for (let obj of selectList)
{
if (this.IsNotRayCaster(obj)) continue;
let intersects = [];
obj.traverse(o =>
{
if (intersects.length === 0 && !this.IsNotRayCaster(o))
o.raycast(this.m_Raycaster, intersects)
})
if (intersects.length > 0)
if (minDistance > intersects[0].distance)
{
pickObj = obj;
minDistance = intersects[0].distance;
}
}
if (pickObj)
{
this.m_SelectList.push(pickObj);
return;
}
//2. 交点检测
this.Select(selectList);
}
/**
* ,
*
* @param {Object3D} obj
* @returns {Boolean}
* @memberof SelectPick
*/
IntersectObject(obj: Object3D): Boolean
{
if (!this.FrustomIntersectObject(obj))
return false;
//1.射线检测
if (!this.IsNotRayCaster(obj))
{
let intersects = [];
obj.traverse(o =>
{
if (!this.IsNotRayCaster(obj))
{
o.raycast(this.m_Raycaster, intersects)
if (intersects.length > 0)
return true;
}
})
}
//2.相交检测
return super.IntersectObject(obj);
}
IsNotRayCaster(obj: Object3D)
{
return (!obj.visible || obj instanceof Line || obj instanceof GripScene);
}
}

Loading…
Cancel
Save