mirror of https://gitee.com/cf-fz/WebCAD.git
!606 层板钉跟随模块变化
parent
9b7cb7d890
commit
eb9df81e47
@ -0,0 +1,284 @@
|
|||||||
|
import { Board, BoardType } from "../../DatabaseServices/Entity/Board";
|
||||||
|
import { GangDrill, GangDrillType } from "../../DatabaseServices/3DSolid/GangDrill";
|
||||||
|
import { LayerBoardOption, LayerNailOption } from "../../UI/Store/BoardInterface";
|
||||||
|
import { Matrix4, Vector3 } from "three";
|
||||||
|
import { MoveMatrix } from "../../Geometry/GeUtils";
|
||||||
|
import { ObjectId } from "../../DatabaseServices/ObjectId";
|
||||||
|
import { arrayLast } from "../../Common/ArrayExt";
|
||||||
|
import { ISpaceParse } from "../../Geometry/SpaceParse/ISpaceParse";
|
||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
enum NailPos
|
||||||
|
{
|
||||||
|
Left = 0,
|
||||||
|
Right = 1,
|
||||||
|
Back = 2,
|
||||||
|
}
|
||||||
|
interface INailProps
|
||||||
|
{
|
||||||
|
pos: NailPos;
|
||||||
|
nail: GangDrill;
|
||||||
|
}
|
||||||
|
|
||||||
|
class BuildLayerNailsTool
|
||||||
|
{
|
||||||
|
private leftBoard: Board;
|
||||||
|
private rightBoard: Board;
|
||||||
|
private backBoard: Board;
|
||||||
|
private option: LayerBoardOption;
|
||||||
|
private nailOption: LayerNailOption;
|
||||||
|
private space: ISpaceParse;
|
||||||
|
private InitTool(option: LayerBoardOption, nailOption: LayerNailOption, space: ISpaceParse)
|
||||||
|
{
|
||||||
|
this.option = option;
|
||||||
|
this.nailOption = nailOption;
|
||||||
|
this.space = space;
|
||||||
|
}
|
||||||
|
//初始化层板钉
|
||||||
|
private InitBuildNails(br: Board): INailProps[]
|
||||||
|
{
|
||||||
|
const nailOpt = this.nailOption;
|
||||||
|
const layerOpt = this.option;
|
||||||
|
|
||||||
|
let rad = nailOpt.rad;
|
||||||
|
let leftShrink = layerOpt.leftShrink;
|
||||||
|
let rightShrink = layerOpt.rightShrink;
|
||||||
|
let depth = nailOpt.depth;
|
||||||
|
let frontDist = nailOpt.front;
|
||||||
|
|
||||||
|
//左右2侧初始层板钉
|
||||||
|
let initNails: INailProps[] = [];
|
||||||
|
|
||||||
|
if (this.leftBoard)
|
||||||
|
{
|
||||||
|
let lNail = GangDrill.CreateCylDrill(rad, nailOpt.length, GangDrillType.Nail);
|
||||||
|
lNail.ApplyMatrix(new Matrix4().makeRotationX(Math.PI / 2))
|
||||||
|
.ApplyMatrix(MoveMatrix(new Vector3(frontDist, br.Height + depth + leftShrink, -rad)));
|
||||||
|
initNails.push({
|
||||||
|
pos: NailPos.Left,
|
||||||
|
nail: lNail
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.rightBoard)
|
||||||
|
{
|
||||||
|
let rNail = GangDrill.CreateCylDrill(rad, nailOpt.length, GangDrillType.Nail);
|
||||||
|
rNail.ApplyMatrix(new Matrix4().makeRotationX(-Math.PI / 2))
|
||||||
|
.ApplyMatrix(MoveMatrix(new Vector3(frontDist, -depth - rightShrink, -rad)));
|
||||||
|
initNails.push({
|
||||||
|
pos: NailPos.Right,
|
||||||
|
nail: rNail
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (this.backBoard)
|
||||||
|
{
|
||||||
|
let backShrink = (this.space.Size.y - layerOpt.frontShrink) - br.Width;
|
||||||
|
|
||||||
|
let bNail = GangDrill.CreateCylDrill(rad, nailOpt.length, GangDrillType.Nail);
|
||||||
|
bNail.ApplyMatrix(new Matrix4().makeRotationY(-Math.PI / 2))
|
||||||
|
.ApplyMatrix(MoveMatrix(new Vector3(br.Width + depth + backShrink, frontDist, -rad)));
|
||||||
|
initNails.push({
|
||||||
|
pos: NailPos.Back,
|
||||||
|
nail: bNail
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return initNails;
|
||||||
|
}
|
||||||
|
private ParseHasLRBoard()
|
||||||
|
{
|
||||||
|
this.leftBoard = null;
|
||||||
|
this.rightBoard = null;
|
||||||
|
this.backBoard = null;
|
||||||
|
|
||||||
|
let minX = this.space.SpaceBox.min.x;
|
||||||
|
let maxX = this.space.SpaceBox.max.x;
|
||||||
|
const nailOpt = this.nailOption;
|
||||||
|
//如果层板和左右板得距离大于这个值,则这边不绘制层板钉
|
||||||
|
let refDist = nailOpt.length - nailOpt.depth;
|
||||||
|
|
||||||
|
let vertBrs: Board[] = this.space.BoardMap.get(BoardType.Vertical);
|
||||||
|
if (vertBrs && vertBrs.length > 0)
|
||||||
|
{
|
||||||
|
if (vertBrs.length === 1)
|
||||||
|
{
|
||||||
|
let center = this.space.SpaceBox.getCenter(new Vector3);
|
||||||
|
let pos = vertBrs[0].Position.applyMatrix4(this.space.SpaceOCSInv);
|
||||||
|
if (pos.x < center.x)
|
||||||
|
this.leftBoard = vertBrs[0];
|
||||||
|
else
|
||||||
|
this.rightBoard = vertBrs[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vertBrs.sort((br1, br2) =>
|
||||||
|
{
|
||||||
|
return br1.MinPoint.applyMatrix4(this.space.SpaceOCSInv).x - br2.MinPoint.applyMatrix4(this.space.SpaceOCSInv).x;
|
||||||
|
});
|
||||||
|
|
||||||
|
let lBr = vertBrs[0];
|
||||||
|
let rBr = arrayLast(vertBrs);
|
||||||
|
let pos1 = lBr.Position.applyMatrix4(this.space.SpaceOCSInv);
|
||||||
|
let pos2 = rBr.Position.applyMatrix4(this.space.SpaceOCSInv);
|
||||||
|
|
||||||
|
if (Math.abs(pos1.x - minX + lBr.Thickness) < refDist)
|
||||||
|
this.leftBoard = lBr;
|
||||||
|
|
||||||
|
if (Math.abs(pos2.x - maxX) < refDist)
|
||||||
|
this.rightBoard = rBr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//允许在背板绘制层板钉
|
||||||
|
if (nailOpt.isInBack)
|
||||||
|
{
|
||||||
|
let backBrs = this.space.BoardMap.get(BoardType.Behind);
|
||||||
|
let maxY = this.space.SpaceBox.max.y;
|
||||||
|
|
||||||
|
if (backBrs && backBrs.length === 1)
|
||||||
|
{
|
||||||
|
let backBr = backBrs[0];
|
||||||
|
let backPos = backBr.Position.applyMatrix4(this.space.SpaceOCSInv);
|
||||||
|
if (Math.abs(backPos.y - maxY - backBr.Thickness) < refDist)
|
||||||
|
this.backBoard = backBr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//绘制层板钉
|
||||||
|
private GetNails(br: Board, initNails: INailProps[])
|
||||||
|
{
|
||||||
|
const nailOpt = this.nailOption;
|
||||||
|
let addCount = nailOpt.addCount;
|
||||||
|
let count = nailOpt.count;
|
||||||
|
let dist = nailOpt.dist;
|
||||||
|
let frontDist = nailOpt.front;
|
||||||
|
let backDist = nailOpt.behind;
|
||||||
|
let singleDist: number;
|
||||||
|
//绘制数量为1时,层板钉在中间位置
|
||||||
|
if (count === 1)
|
||||||
|
singleDist = (br.Width - frontDist - backDist) / 2;
|
||||||
|
else
|
||||||
|
singleDist = (br.Width - frontDist - backDist) / (count - 1);
|
||||||
|
|
||||||
|
let backSingleDist = (br.Height - frontDist - backDist) / (count === 1 ? 2 : (count - 1));
|
||||||
|
let buildNails: INailProps[] = [];
|
||||||
|
|
||||||
|
//构建层板钉
|
||||||
|
for (let i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
let nailProps = initNails.map(n =>
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
pos: n.pos,
|
||||||
|
nail: n.nail.Clone()
|
||||||
|
};
|
||||||
|
});
|
||||||
|
for (let nailProp of nailProps)
|
||||||
|
{
|
||||||
|
let dist = nailProp.pos === NailPos.Back ? backSingleDist : singleDist;
|
||||||
|
let vec = new Vector3(count === 1 ? dist : dist * (i - 1));
|
||||||
|
if (nailProp.pos === NailPos.Back)
|
||||||
|
vec = new Vector3(0, vec.x);
|
||||||
|
|
||||||
|
nailProp.nail.ApplyMatrix(MoveMatrix(vec));
|
||||||
|
}
|
||||||
|
|
||||||
|
buildNails.push(...nailProps);
|
||||||
|
}
|
||||||
|
|
||||||
|
//增加的层板钉
|
||||||
|
let addNails = [];
|
||||||
|
for (let i = 1; i <= addCount; i++)
|
||||||
|
{
|
||||||
|
let nails = buildNails.map(n =>
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
pos: n.pos,
|
||||||
|
nail: n.nail.Clone()
|
||||||
|
};
|
||||||
|
});
|
||||||
|
nails.forEach(n =>
|
||||||
|
{
|
||||||
|
n.nail.ApplyMatrix(MoveMatrix(new Vector3(0, 0, dist * i)));
|
||||||
|
addNails.push(n);
|
||||||
|
});
|
||||||
|
nails = buildNails.map(n =>
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
pos: n.pos,
|
||||||
|
nail: n.nail.Clone()
|
||||||
|
};
|
||||||
|
});
|
||||||
|
nails.forEach(n =>
|
||||||
|
{
|
||||||
|
n.nail.ApplyMatrix(MoveMatrix(new Vector3(0, 0, -dist * i)));
|
||||||
|
addNails.push(n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
buildNails.push(...addNails);
|
||||||
|
for (let nailProps of buildNails)
|
||||||
|
nailProps.nail.ApplyMatrix(br.OCS);
|
||||||
|
|
||||||
|
return buildNails;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Start(brs: Board[], option: LayerBoardOption, nailOption: LayerNailOption, space: ISpaceParse)
|
||||||
|
{
|
||||||
|
this.InitTool(option, nailOption, space);
|
||||||
|
this.ParseHasLRBoard();
|
||||||
|
if (!option.isActive || !nailOption.isDraw)
|
||||||
|
{
|
||||||
|
for (let br of brs)
|
||||||
|
{
|
||||||
|
br.ClearLayerNails();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let br of brs)
|
||||||
|
{
|
||||||
|
let nailProps = this.GetNails(br, this.InitBuildNails(br));
|
||||||
|
|
||||||
|
let oldNailIds = br.LayerNails;
|
||||||
|
for (let i = nailProps.length; i < oldNailIds.length; i++)
|
||||||
|
oldNailIds[i].Object.Erase();
|
||||||
|
|
||||||
|
for (let i = 0; i < nailProps.length; i++)
|
||||||
|
{
|
||||||
|
let nId: ObjectId;
|
||||||
|
if (i < oldNailIds.length)
|
||||||
|
{
|
||||||
|
let nail = oldNailIds[i].Object as GangDrill;
|
||||||
|
nail.Radius = nailProps[i].nail.Radius;
|
||||||
|
nail.Height = nailProps[i].nail.Height;
|
||||||
|
nail.Position = nailProps[i].nail.Position;
|
||||||
|
nId = nail.Id;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.Database.ModelSpace.Append(nailProps[i].nail);
|
||||||
|
nId = nailProps[i].nail.Id;
|
||||||
|
br.AppendNails([nId]);
|
||||||
|
if (nailProps[i].pos === NailPos.Left)
|
||||||
|
{
|
||||||
|
if (this.leftBoard)
|
||||||
|
this.leftBoard.AppendNails([nId]);
|
||||||
|
}
|
||||||
|
else if (nailProps[i].pos === NailPos.Right)
|
||||||
|
{
|
||||||
|
if (this.rightBoard)
|
||||||
|
this.rightBoard.AppendNails([nId]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (this.backBoard)
|
||||||
|
this.backBoard.AppendNails([nId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const buildLayerNailTool = new BuildLayerNailsTool();
|
Loading…
Reference in new issue