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