|
|
|
@ -99,8 +99,8 @@ export class ArrayStore extends Singleton
|
|
|
|
|
}
|
|
|
|
|
_Return(state: number)
|
|
|
|
|
{
|
|
|
|
|
app.m_Editor.m_ModalManage.m_PromisRes({ Status: state });
|
|
|
|
|
app.m_Editor.m_ModalManage.Clear();
|
|
|
|
|
app.Editor.ModalManage.m_PromisRes({ Status: state });
|
|
|
|
|
app.Editor.ModalManage.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
export class Command_Array implements Command
|
|
|
|
@ -111,7 +111,7 @@ export class Command_Array implements Command
|
|
|
|
|
{
|
|
|
|
|
let option = this.arrayStore.m_Option;
|
|
|
|
|
|
|
|
|
|
let ssRes = await app.m_Editor.GetSelection({ Msg: "请选择阵列对象:", UseSelect: true });
|
|
|
|
|
let ssRes = await app.Editor.GetSelection({ Msg: "请选择阵列对象:", UseSelect: true });
|
|
|
|
|
if (ssRes.Status !== PromptStatus.OK)
|
|
|
|
|
return;
|
|
|
|
|
let ss = ssRes.SelectSet;
|
|
|
|
@ -121,25 +121,25 @@ export class Command_Array implements Command
|
|
|
|
|
unionBoxs.union(selectEnt.BoundingBox);
|
|
|
|
|
|
|
|
|
|
//渲染模态框
|
|
|
|
|
app.m_Editor.m_ModalManage.RenderModal(ArrayModal, ModalPosition.Right, { store: this.arrayStore });
|
|
|
|
|
app.Editor.ModalManage.RenderModal(ArrayModal, ModalPosition.Right, { store: this.arrayStore });
|
|
|
|
|
//鼠标点选
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
app.m_Database.hm.StartMark();
|
|
|
|
|
app.Database.hm.StartMark();
|
|
|
|
|
|
|
|
|
|
let res = await app.m_Editor.m_ModalManage.Wait();
|
|
|
|
|
let res = await app.Editor.ModalManage.Wait();
|
|
|
|
|
if (res.Status === ModalState.Cancel)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
//数据准备
|
|
|
|
|
let item_total = option.itemTotal;
|
|
|
|
|
let fill_angle = option.fillAngle;
|
|
|
|
|
let between_angle = option.betweenAngle;
|
|
|
|
|
let ucsInv = app.m_Editor.UCSMatrixInv;
|
|
|
|
|
let itemTotal = option.itemTotal;
|
|
|
|
|
let fillAngle = option.fillAngle;
|
|
|
|
|
let betweenAngle = option.betweenAngle;
|
|
|
|
|
let ucsInv = app.Editor.UCSMatrixInv;
|
|
|
|
|
switch (res.Status)
|
|
|
|
|
{
|
|
|
|
|
case Pick.centerPoint:
|
|
|
|
|
let ptRes1 = await app.m_Editor.GetPoint({ Msg: "请选择中心点:" });
|
|
|
|
|
let ptRes1 = await app.Editor.GetPoint({ Msg: "请选择中心点:" });
|
|
|
|
|
if (ptRes1.Status === PromptStatus.OK)
|
|
|
|
|
{
|
|
|
|
|
let pt1Ucs = ptRes1.Point.applyMatrix4(ucsInv);
|
|
|
|
@ -149,7 +149,7 @@ export class Command_Array implements Command
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.rowOffset:
|
|
|
|
|
let disRes1 = await app.m_Editor.GetDistance({
|
|
|
|
|
let disRes1 = await app.Editor.GetDistance({
|
|
|
|
|
Msg: "请指定行偏移:",
|
|
|
|
|
CalcDistance: (baseP, p: Vector3) =>
|
|
|
|
|
{
|
|
|
|
@ -161,7 +161,7 @@ export class Command_Array implements Command
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.colOffset:
|
|
|
|
|
let disRes2 = await app.m_Editor.GetDistance({
|
|
|
|
|
let disRes2 = await app.Editor.GetDistance({
|
|
|
|
|
Msg: "请指定列偏移:",
|
|
|
|
|
CalcDistance: (baseP, p: Vector3) =>
|
|
|
|
|
{
|
|
|
|
@ -173,81 +173,81 @@ export class Command_Array implements Command
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.arrayAngle:
|
|
|
|
|
let ptRes4 = await app.m_Editor.GetAngle({ Msg: "请指定阵列角度:" });
|
|
|
|
|
let ptRes4 = await app.Editor.GetAngle({ Msg: "请指定阵列角度:" });
|
|
|
|
|
if (ptRes4.Status === PromptStatus.OK)
|
|
|
|
|
option.arrayAngle = Math.round(ptRes4.Distance);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.fillAngle:
|
|
|
|
|
let ptRes6 = await app.m_Editor.GetAngle({ Msg: "请指定填充角度:" });
|
|
|
|
|
let ptRes6 = await app.Editor.GetAngle({ Msg: "请指定填充角度:" });
|
|
|
|
|
if (ptRes6.Status === PromptStatus.OK)
|
|
|
|
|
{
|
|
|
|
|
fill_angle = Math.round(ptRes6.Distance);
|
|
|
|
|
if (fill_angle === 0 || between_angle === 0)
|
|
|
|
|
fillAngle = Math.round(ptRes6.Distance);
|
|
|
|
|
if (fillAngle === 0 || betweenAngle === 0)
|
|
|
|
|
{
|
|
|
|
|
app.m_Editor.Prompt("错误:填充角度或者项目间角度为0!");
|
|
|
|
|
app.Editor.Prompt("错误:填充角度或者项目间角度为0!");
|
|
|
|
|
}
|
|
|
|
|
else if (option.method === CirArrMethod.itemsAndAngle)
|
|
|
|
|
{
|
|
|
|
|
if (item_total === 1)
|
|
|
|
|
if (itemTotal === 1)
|
|
|
|
|
{
|
|
|
|
|
item_total = 2;
|
|
|
|
|
between_angle = fill_angle;
|
|
|
|
|
itemTotal = 2;
|
|
|
|
|
betweenAngle = fillAngle;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (fill_angle === 360)
|
|
|
|
|
between_angle = Math.round(fill_angle / (item_total));
|
|
|
|
|
if (fillAngle === 360)
|
|
|
|
|
betweenAngle = Math.round(fillAngle / (itemTotal));
|
|
|
|
|
else
|
|
|
|
|
between_angle = Math.round(fill_angle / (item_total - 1));
|
|
|
|
|
betweenAngle = Math.round(fillAngle / (itemTotal - 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (option.method === CirArrMethod.fillAngleAndBeAngle)
|
|
|
|
|
{
|
|
|
|
|
if (between_angle > fill_angle)
|
|
|
|
|
between_angle = fill_angle;
|
|
|
|
|
item_total = Math.ceil(fill_angle / between_angle);
|
|
|
|
|
if (betweenAngle > fillAngle)
|
|
|
|
|
betweenAngle = fillAngle;
|
|
|
|
|
itemTotal = Math.ceil(fillAngle / betweenAngle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.betweenAngle:
|
|
|
|
|
let ptRes8 = await app.m_Editor.GetAngle({ Msg: "请指定项目间角度:" });
|
|
|
|
|
let ptRes8 = await app.Editor.GetAngle({ Msg: "请指定项目间角度:" });
|
|
|
|
|
if (ptRes8.Status === PromptStatus.OK)
|
|
|
|
|
{
|
|
|
|
|
between_angle = Math.round(ptRes8.Distance);
|
|
|
|
|
betweenAngle = Math.round(ptRes8.Distance);
|
|
|
|
|
//关联计算
|
|
|
|
|
if (option.method === CirArrMethod.itemsAndBeAngle)
|
|
|
|
|
{
|
|
|
|
|
let biggest_Bangle = Math.round(360 / item_total);
|
|
|
|
|
if (between_angle > biggest_Bangle)
|
|
|
|
|
let biggestBAngle = Math.round(360 / itemTotal);
|
|
|
|
|
if (betweenAngle > biggestBAngle)
|
|
|
|
|
{
|
|
|
|
|
AppToaster.show({ message: `拾取角度超过当前允许最大值(${biggest_Bangle}),请减小项目总数或项目间角度`, timeout: 2000 });
|
|
|
|
|
between_angle = biggest_Bangle;
|
|
|
|
|
fill_angle = 360;
|
|
|
|
|
AppToaster.show({ message: `拾取角度超过当前允许最大值(${biggestBAngle}),请减小项目总数或项目间角度`, timeout: 2000 });
|
|
|
|
|
betweenAngle = biggestBAngle;
|
|
|
|
|
fillAngle = 360;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (item_total === 1)
|
|
|
|
|
fill_angle = 360;
|
|
|
|
|
if (itemTotal === 1)
|
|
|
|
|
fillAngle = 360;
|
|
|
|
|
else
|
|
|
|
|
fill_angle = between_angle * (item_total - 1);
|
|
|
|
|
fillAngle = betweenAngle * (itemTotal - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (option.method === CirArrMethod.fillAngleAndBeAngle)
|
|
|
|
|
{
|
|
|
|
|
if (between_angle !== 0 && fill_angle !== 0)
|
|
|
|
|
if (betweenAngle !== 0 && fillAngle !== 0)
|
|
|
|
|
{
|
|
|
|
|
if (between_angle > fill_angle)
|
|
|
|
|
between_angle = fill_angle;
|
|
|
|
|
item_total = Math.floor(fill_angle / between_angle);
|
|
|
|
|
if (betweenAngle > fillAngle)
|
|
|
|
|
betweenAngle = fillAngle;
|
|
|
|
|
itemTotal = Math.floor(fillAngle / betweenAngle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case Pick.rowAndColOffset:
|
|
|
|
|
let ptRes = await app.m_Editor.GetPoint({ Msg: "指定第一个角点:" });
|
|
|
|
|
let ptRes = await app.Editor.GetPoint({ Msg: "指定第一个角点:" });
|
|
|
|
|
if (ptRes.Status != PromptStatus.OK)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
@ -255,7 +255,7 @@ export class Command_Array implements Command
|
|
|
|
|
|
|
|
|
|
let rec = new Polyline();
|
|
|
|
|
rec.CloseMark = true;
|
|
|
|
|
rec.ApplyMatrix(app.m_Editor.UCSMatrix);
|
|
|
|
|
rec.ApplyMatrix(app.Editor.UCSMatrix);
|
|
|
|
|
JigUtils.Draw(rec);
|
|
|
|
|
|
|
|
|
|
let row: number;
|
|
|
|
@ -281,7 +281,7 @@ export class Command_Array implements Command
|
|
|
|
|
{ pt: px4, bul: 0 }];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ptRes = await app.m_Editor.GetPoint({
|
|
|
|
|
ptRes = await app.Editor.GetPoint({
|
|
|
|
|
Msg: "指定另一个角点:",
|
|
|
|
|
Callback: (p) => updateRect(p1, p),
|
|
|
|
|
RelativeBasePoint: p1
|
|
|
|
@ -301,11 +301,11 @@ export class Command_Array implements Command
|
|
|
|
|
if (res.Status === ModalState.Ok)
|
|
|
|
|
break;
|
|
|
|
|
//数据提交
|
|
|
|
|
option.itemTotal = item_total;
|
|
|
|
|
option.fillAngle = fill_angle;
|
|
|
|
|
option.betweenAngle = between_angle;
|
|
|
|
|
option.itemTotal = itemTotal;
|
|
|
|
|
option.fillAngle = fillAngle;
|
|
|
|
|
option.betweenAngle = betweenAngle;
|
|
|
|
|
//呼出模态框
|
|
|
|
|
app.m_Editor.m_ModalManage.RenderModal(ArrayModal, ModalPosition.Old, { store: this.arrayStore });
|
|
|
|
|
app.Editor.ModalManage.RenderModal(ArrayModal, ModalPosition.Old, { store: this.arrayStore });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据模态框tab的选择,构造阵列
|
|
|
|
@ -336,14 +336,14 @@ export class Command_Array implements Command
|
|
|
|
|
betweenAngle = -betweenAngle;
|
|
|
|
|
CirArray(ss, ptRes, ArrayNum, THREE.Math.degToRad(betweenAngle));
|
|
|
|
|
}
|
|
|
|
|
app.m_Editor.UpdateScreen();
|
|
|
|
|
app.Editor.UpdateScreen();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//构造矩形阵列
|
|
|
|
|
function recArray(ss: SelectSet, rowNum: number, colNum: number, rowOffset: number, colOffset: number, arrayAngle: number = 0)
|
|
|
|
|
{
|
|
|
|
|
let mat = new Matrix4().extractRotation(app.m_Editor.UCSMatrix)
|
|
|
|
|
let mat = new Matrix4().extractRotation(app.Editor.UCSMatrix)
|
|
|
|
|
let xVec = rotatePoint(new Vector3(colOffset), arrayAngle).applyMatrix4(mat);
|
|
|
|
|
let yVec = rotatePoint(new Vector3(0, rowOffset), arrayAngle).applyMatrix4(mat);
|
|
|
|
|
|
|
|
|
@ -361,7 +361,7 @@ function recArray(ss: SelectSet, rowNum: number, colNum: number, rowOffset: numb
|
|
|
|
|
{
|
|
|
|
|
let e = en.Clone();
|
|
|
|
|
e.ApplyMatrix(moveMat);
|
|
|
|
|
app.m_Database.ModelSpace.Append(e);
|
|
|
|
|
app.Database.ModelSpace.Append(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -370,7 +370,7 @@ function recArray(ss: SelectSet, rowNum: number, colNum: number, rowOffset: numb
|
|
|
|
|
//构造环形阵列
|
|
|
|
|
function CirArray(ss: SelectSet, ptRes: Vector3, itemTotal: number, betweenAngle: number)
|
|
|
|
|
{
|
|
|
|
|
let mat = new Matrix4().extractRotation(app.m_Editor.UCSMatrix);
|
|
|
|
|
let mat = new Matrix4().extractRotation(app.Editor.UCSMatrix);
|
|
|
|
|
let pt = ptRes.clone().applyMatrix4(mat);
|
|
|
|
|
//平移变换矩阵
|
|
|
|
|
let moveMat = MoveMatrix(pt);
|
|
|
|
@ -388,7 +388,7 @@ function CirArray(ss: SelectSet, ptRes: Vector3, itemTotal: number, betweenAngle
|
|
|
|
|
newEnt.ApplyMatrix(moveMatInv);
|
|
|
|
|
newEnt.ApplyMatrix(roMat);
|
|
|
|
|
newEnt.ApplyMatrix(moveMat);
|
|
|
|
|
app.m_Database.ModelSpace.Append(newEnt);
|
|
|
|
|
app.Database.ModelSpace.Append(newEnt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|