|
|
|
@ -1,36 +1,30 @@
|
|
|
|
|
import { Matrix4, Vector3 } from "three";
|
|
|
|
|
import { app } from "../../ApplicationServices/Application";
|
|
|
|
|
import { arrayLast } from "../../Common/ArrayExt";
|
|
|
|
|
import { Singleton } from "../../Common/Singleton";
|
|
|
|
|
import { operationExpReg } from "../../Common/Utils";
|
|
|
|
|
import { GangDrill } from "../../DatabaseServices/3DSolid/GangDrill";
|
|
|
|
|
import { Board } from "../../DatabaseServices/Board";
|
|
|
|
|
import { ObjectId } from "../../DatabaseServices/ObjectId";
|
|
|
|
|
import { CollisionDetection } from "../../Geometry/DrillParse/CollisionDetection";
|
|
|
|
|
import { Face } from "../../Geometry/DrillParse/Face";
|
|
|
|
|
import { cZAxis, MoveMatrix, equaln } from "../../Geometry/GeUtils";
|
|
|
|
|
import { cZAxis, equaln, MoveMatrix } from "../../Geometry/GeUtils";
|
|
|
|
|
import { DrillingOption, SpacingType } from "../../UI/Components/Board/drillInterface";
|
|
|
|
|
import { Singleton } from "../../Common/Singleton";
|
|
|
|
|
import { DrillStore } from "../../UI/Store/DrillStore";
|
|
|
|
|
import { PXLFaceType } from "../../UI/Store/BoardInterface";
|
|
|
|
|
import { operationExpReg } from "../../Common/Utils";
|
|
|
|
|
|
|
|
|
|
interface DrillEnts
|
|
|
|
|
{
|
|
|
|
|
pxl?: GangDrill;
|
|
|
|
|
ljg?: GangDrill;
|
|
|
|
|
ymj?: GangDrill;
|
|
|
|
|
}
|
|
|
|
|
import { DrillStore } from "../../UI/Store/DrillStore";
|
|
|
|
|
|
|
|
|
|
export class DrawDrillingTool
|
|
|
|
|
{
|
|
|
|
|
private m_MoveDistList: number[] = [];
|
|
|
|
|
private m_Face: Face;
|
|
|
|
|
private m_Option: DrillingOption;
|
|
|
|
|
private drillEnts: DrillEnts = {};
|
|
|
|
|
private drillMap: Map<Board, DrillEnts[]> = new Map();
|
|
|
|
|
GetDrillingConfig()
|
|
|
|
|
private drillEnts: GangDrill[] = [];
|
|
|
|
|
private GetDrillingConfig()
|
|
|
|
|
{
|
|
|
|
|
//TODO:完善用户配置类,暂用store得数据进行测试
|
|
|
|
|
return Singleton.GetInstance(DrillStore).rules;
|
|
|
|
|
}
|
|
|
|
|
GetRuleByFace(f: Face): DrillingOption
|
|
|
|
|
private GetRuleByFace(f: Face): DrillingOption
|
|
|
|
|
{
|
|
|
|
|
const rules = this.GetDrillingConfig();
|
|
|
|
|
let length = f.m_Length;
|
|
|
|
@ -42,8 +36,8 @@ export class DrawDrillingTool
|
|
|
|
|
return rule;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//初始化排钻实体,排钻数组中偏心轮优先push;
|
|
|
|
|
InitDrill()
|
|
|
|
|
//初始化排钻实体
|
|
|
|
|
private InitDrill()
|
|
|
|
|
{
|
|
|
|
|
//绘制排钻实体,在WCS0点上.
|
|
|
|
|
let pxlDepth = parseFloat(this.m_Option.pxlDepth);
|
|
|
|
@ -52,30 +46,25 @@ export class DrawDrillingTool
|
|
|
|
|
|
|
|
|
|
let pxlEnt = GangDrill.CreateCylDrill(parseFloat(this.m_Option.pxlRad), pxlDepth);
|
|
|
|
|
|
|
|
|
|
this.drillEnts.pxl = pxlEnt;
|
|
|
|
|
|
|
|
|
|
this.drillEnts.push(pxlEnt);
|
|
|
|
|
//将三个实体移动到相应的位置
|
|
|
|
|
pxlEnt.ApplyMatrix(new Matrix4().makeRotationX(Math.PI / 2));
|
|
|
|
|
|
|
|
|
|
let ljgEnt = GangDrill.CreateCylDrill(ljgRad, ljgLength);
|
|
|
|
|
this.drillEnts.push(ljgEnt);
|
|
|
|
|
|
|
|
|
|
//如果都是侧面,不要预埋件
|
|
|
|
|
if (!this.m_Face.isEqualType)
|
|
|
|
|
{
|
|
|
|
|
let ymjEnt = GangDrill.CreateCylDrill(parseFloat(this.m_Option.ymjRad), parseFloat(this.m_Option.ymjDepth));
|
|
|
|
|
ymjEnt.ApplyMatrix(new Matrix4().setPosition(new Vector3(0, 0, ljgLength)));
|
|
|
|
|
this.drillEnts.ymj = ymjEnt;
|
|
|
|
|
this.drillEnts.push(ymjEnt);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ljgEnt.Height = ljgLength * 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.drillEnts.ljg = ljgEnt;
|
|
|
|
|
|
|
|
|
|
for (let i in this.drillEnts)
|
|
|
|
|
for (let d of this.drillEnts)
|
|
|
|
|
{
|
|
|
|
|
let d = this.drillEnts[i];
|
|
|
|
|
d.ApplyMatrix(MoveMatrix(cZAxis.clone().multiplyScalar(-ljgLength)));
|
|
|
|
|
if (d === pxlEnt)
|
|
|
|
|
{
|
|
|
|
@ -110,14 +99,13 @@ export class DrawDrillingTool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//间距等分
|
|
|
|
|
EqulalSpacing()
|
|
|
|
|
private EqulalSpacing()
|
|
|
|
|
{
|
|
|
|
|
let startDist = parseFloat(this.m_Option.originDist);
|
|
|
|
|
let endDist = parseFloat(this.m_Option.retDist);
|
|
|
|
|
|
|
|
|
|
let count = parseInt(this.m_Option.count);
|
|
|
|
|
let length = this.m_Face.m_Length;
|
|
|
|
|
let ljgRad = parseFloat(this.m_Option.ljgRad);
|
|
|
|
|
let spacingSize: number;
|
|
|
|
|
let caclDist: Function;
|
|
|
|
|
|
|
|
|
@ -149,7 +137,7 @@ export class DrawDrillingTool
|
|
|
|
|
this.m_MoveDistList[i - 1] = caclDist(i) + this.m_MoveDistList[0];
|
|
|
|
|
}
|
|
|
|
|
//32倍数
|
|
|
|
|
Multiple32()
|
|
|
|
|
private Multiple32()
|
|
|
|
|
{
|
|
|
|
|
let startDist = parseFloat(this.m_Option.originDist);
|
|
|
|
|
let endDist = parseFloat(this.m_Option.retDist);
|
|
|
|
@ -192,64 +180,111 @@ export class DrawDrillingTool
|
|
|
|
|
this.m_MoveDistList[i - 1] = caclDist(i) + this.m_MoveDistList[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
GetMoveDist()
|
|
|
|
|
private GetMoveDist()
|
|
|
|
|
{
|
|
|
|
|
if (this.m_Option.spacing === SpacingType.Multiple32)
|
|
|
|
|
this.Multiple32();
|
|
|
|
|
else
|
|
|
|
|
this.EqulalSpacing();
|
|
|
|
|
}
|
|
|
|
|
BuildDrill()
|
|
|
|
|
private BuildDrill()
|
|
|
|
|
{
|
|
|
|
|
let newDrillentList: DrillEnts[] = [];
|
|
|
|
|
let newDrillentList: ObjectId[][] = [];
|
|
|
|
|
|
|
|
|
|
for (let dist of this.m_MoveDistList)
|
|
|
|
|
{
|
|
|
|
|
//新的排钻列表
|
|
|
|
|
let newDrillEnt: DrillEnts = {};
|
|
|
|
|
for (let i in this.drillEnts)
|
|
|
|
|
let newDrillEnts: ObjectId[] = []
|
|
|
|
|
for (let d of this.drillEnts)
|
|
|
|
|
{
|
|
|
|
|
let d = this.drillEnts[i] as GangDrill;
|
|
|
|
|
let cloneD = d.Clone();
|
|
|
|
|
cloneD.ApplyMatrix(MoveMatrix(new Vector3(dist)))
|
|
|
|
|
.ApplyMatrix(this.m_Face.OCS);
|
|
|
|
|
newDrillEnt[i] = cloneD;
|
|
|
|
|
app.m_Database.ModelSpace.Append(cloneD);
|
|
|
|
|
newDrillEnts.push(cloneD.Id);
|
|
|
|
|
}
|
|
|
|
|
newDrillentList.push(newDrillEnt);
|
|
|
|
|
newDrillentList.push(newDrillEnts);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.ParseThroughHole(newDrillentList);
|
|
|
|
|
this.ParseDrillList(newDrillentList);
|
|
|
|
|
}
|
|
|
|
|
ParseThroughHole(newDrillentList: DrillEnts[])
|
|
|
|
|
// 分析当前排钻
|
|
|
|
|
private ParseDrillList(drills: ObjectId[][])
|
|
|
|
|
{
|
|
|
|
|
//获得板件上存在的排钻
|
|
|
|
|
let localBoard = this.m_Face.m_LocalBoard;
|
|
|
|
|
let drillList = this.drillMap.get(localBoard);
|
|
|
|
|
if (!drillList)
|
|
|
|
|
let locaBoard = this.m_Face.m_LocalBoard;
|
|
|
|
|
let intBoard = this.m_Face.m_InterBoard;
|
|
|
|
|
|
|
|
|
|
//如果都是侧面,直接加入
|
|
|
|
|
if (this.m_Face.isEqualType)
|
|
|
|
|
{
|
|
|
|
|
this.SaveDrillToBoard(locaBoard, intBoard, drills);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let oldLcDrIdList = locaBoard.DrillList.get(intBoard.Id);
|
|
|
|
|
|
|
|
|
|
//面已经排钻了,去掉旧的添加新的
|
|
|
|
|
if (oldLcDrIdList)
|
|
|
|
|
{
|
|
|
|
|
locaBoard.ClearDrillList(intBoard.Id);
|
|
|
|
|
intBoard.ClearDrillList(locaBoard.Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let refDrillList: ObjectId[][] = [];
|
|
|
|
|
|
|
|
|
|
//加入本地的板件排钻测试通孔
|
|
|
|
|
for (let [, v] of locaBoard.DrillList)
|
|
|
|
|
{
|
|
|
|
|
refDrillList.push(...v);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (refDrillList.length > 0)
|
|
|
|
|
{
|
|
|
|
|
this.ParseThroughHole(drills, refDrillList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//加入相交板件测试碰撞
|
|
|
|
|
for (let [, v] of intBoard.DrillList)
|
|
|
|
|
{
|
|
|
|
|
drillList = [];
|
|
|
|
|
this.drillMap.set(localBoard, drillList);
|
|
|
|
|
refDrillList.push(...v);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//碰撞检测
|
|
|
|
|
this.CheckCollision(drills, refDrillList);
|
|
|
|
|
|
|
|
|
|
//分析结束,排钻存入板件
|
|
|
|
|
this.SaveDrillToBoard(locaBoard, intBoard, drills);
|
|
|
|
|
}
|
|
|
|
|
//保存排钻到板件
|
|
|
|
|
private SaveDrillToBoard(lBr: Board, iBr: Board, drs: ObjectId[][])
|
|
|
|
|
{
|
|
|
|
|
//分析结束,排钻存入板件
|
|
|
|
|
lBr.AppendDrillList(iBr.Id, drs);
|
|
|
|
|
iBr.AppendDrillList(lBr.Id, drs);
|
|
|
|
|
}
|
|
|
|
|
private ParseThroughHole(drills: ObjectId[][], refDrillList: ObjectId[][])
|
|
|
|
|
{
|
|
|
|
|
//分析通孔
|
|
|
|
|
if (!this.m_Face.isEqualType && drillList.length > 0)
|
|
|
|
|
if (!this.m_Face.isEqualType)
|
|
|
|
|
{
|
|
|
|
|
for (let drillent of newDrillentList)
|
|
|
|
|
for (let drillent of drills)
|
|
|
|
|
{
|
|
|
|
|
let isThought = false;
|
|
|
|
|
let p1 = drillent.ymj.Position;
|
|
|
|
|
for (let refDrill of drillList)
|
|
|
|
|
let ymjEnt = (arrayLast(drillent).Object as GangDrill);
|
|
|
|
|
let p1 = ymjEnt.Position;
|
|
|
|
|
for (let refDrill of refDrillList)
|
|
|
|
|
{
|
|
|
|
|
let p2 = refDrill.ymj.Position;
|
|
|
|
|
let refYmjEnt = (arrayLast(refDrill).Object as GangDrill);
|
|
|
|
|
let p2 = refYmjEnt.Position;
|
|
|
|
|
let vec = p2.sub(p1);
|
|
|
|
|
if (equaln(vec.length(), localBoard.Thickness))
|
|
|
|
|
if (equaln(vec.length(), this.m_Face.m_LocalBoard.Thickness))
|
|
|
|
|
{
|
|
|
|
|
isThought = true;
|
|
|
|
|
//通孔偏移
|
|
|
|
|
if (!this.m_Option.tIsOffset)
|
|
|
|
|
{
|
|
|
|
|
drillent.ymj.Radian = parseFloat(this.m_Option.tYmjRad)
|
|
|
|
|
refDrill.ymj.Radian = parseFloat(this.m_Option.tYmjRad)
|
|
|
|
|
ymjEnt.Radian = parseFloat(this.m_Option.tYmjRad)
|
|
|
|
|
refYmjEnt.Radian = parseFloat(this.m_Option.tYmjRad)
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -259,39 +294,60 @@ export class DrawDrillingTool
|
|
|
|
|
if (isThought && this.m_Option.tIsOffset)
|
|
|
|
|
{
|
|
|
|
|
let offdist = parseFloat(this.m_Option.tHoleOffset);
|
|
|
|
|
let offVec = new Vector3(offdist);
|
|
|
|
|
|
|
|
|
|
for (let i in drillent)
|
|
|
|
|
{
|
|
|
|
|
let d = drillent[i] as GangDrill;
|
|
|
|
|
d.ApplyMatrix(this.m_Face.OCSInv)
|
|
|
|
|
.ApplyMatrix(MoveMatrix(offVec))
|
|
|
|
|
.ApplyMatrix(this.m_Face.OCS);
|
|
|
|
|
}
|
|
|
|
|
this.MoveDrillEnts(drillent, offdist);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
private MoveDrillEnts(drillent: ObjectId[], dist: number, dir = 1)
|
|
|
|
|
{
|
|
|
|
|
let offVec = new Vector3(dist * dir);
|
|
|
|
|
|
|
|
|
|
for (let objId of drillent)
|
|
|
|
|
{
|
|
|
|
|
let d = objId.Object as GangDrill;
|
|
|
|
|
d.ApplyMatrix(this.m_Face.OCSInv)
|
|
|
|
|
.ApplyMatrix(MoveMatrix(offVec))
|
|
|
|
|
.ApplyMatrix(this.m_Face.OCS);
|
|
|
|
|
}
|
|
|
|
|
drillList.push(...newDrillentList);
|
|
|
|
|
}
|
|
|
|
|
InitTool(f: Face, opt: DrillingOption)
|
|
|
|
|
private CheckCollision(drills: ObjectId[][], refDrillList: ObjectId[][])
|
|
|
|
|
{
|
|
|
|
|
this.m_Face = f;
|
|
|
|
|
this.m_Option = opt;
|
|
|
|
|
this.m_MoveDistList.length = 0;
|
|
|
|
|
this.drillEnts = {};
|
|
|
|
|
for (let ds of drills)
|
|
|
|
|
{
|
|
|
|
|
for (let refDr of refDrillList)
|
|
|
|
|
{
|
|
|
|
|
if (this.IsCollision(ds, refDr))
|
|
|
|
|
{
|
|
|
|
|
let offsetDist = parseFloat(this.m_Option.collsionDist);
|
|
|
|
|
this.MoveDrillEnts(ds, offsetDist, this.m_Face.IsPositiveFace ? 1 : -1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
RendDrill()
|
|
|
|
|
private IsCollision(drs1: ObjectId[], drs2: ObjectId[])
|
|
|
|
|
{
|
|
|
|
|
for (let [k, v] of this.drillMap)
|
|
|
|
|
for (let objId of drs1)
|
|
|
|
|
{
|
|
|
|
|
k = null;
|
|
|
|
|
for (let drillent of v)
|
|
|
|
|
let d1 = objId.Object as GangDrill;
|
|
|
|
|
for (let objId1 of drs2)
|
|
|
|
|
{
|
|
|
|
|
(Object.values(drillent) as GangDrill[]).forEach(d => app.m_Database.ModelSpace.Append(d));
|
|
|
|
|
let d2 = objId1.Object as GangDrill;
|
|
|
|
|
if (d1.Collise(d2))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.drillMap.clear();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
private InitTool(f: Face, opt: DrillingOption)
|
|
|
|
|
{
|
|
|
|
|
this.m_Face = f;
|
|
|
|
|
this.m_Option = opt;
|
|
|
|
|
this.m_MoveDistList.length = 0;
|
|
|
|
|
this.drillEnts.length = 0;
|
|
|
|
|
}
|
|
|
|
|
StartGangDrill(brs: Board[])
|
|
|
|
|
{
|
|
|
|
@ -328,15 +384,13 @@ export class DrawDrillingTool
|
|
|
|
|
if (f.isEqualType)
|
|
|
|
|
{
|
|
|
|
|
//只需旋转偏心轮
|
|
|
|
|
delete this.drillEnts.ljg;
|
|
|
|
|
this.drillEnts.pop();
|
|
|
|
|
|
|
|
|
|
this.drillEnts.pxl.ApplyMatrix(new Matrix4().makeRotationY(Math.PI));
|
|
|
|
|
this.drillEnts[0].ApplyMatrix(new Matrix4().makeRotationY(Math.PI));
|
|
|
|
|
|
|
|
|
|
this.BuildDrill();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.RendDrill();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|