|
|
|
@ -3,20 +3,23 @@ import { app } from "../../../ApplicationServices/Application";
|
|
|
|
|
import { EBoardKeyList } from "../../../Common/BoardKeyList";
|
|
|
|
|
import { FS } from "../../../Common/FileSystem";
|
|
|
|
|
import { JigMoveEntity } from "../../../Common/JigMove";
|
|
|
|
|
import { MakeMirrorMtx } from "../../../Common/Matrix4Utils";
|
|
|
|
|
import { Log, LogType } from "../../../Common/Log";
|
|
|
|
|
import { MakeMirrorMtx, NormalMatrix } from "../../../Common/Matrix4Utils";
|
|
|
|
|
import { DuplicateRecordCloning } from "../../../Common/Status";
|
|
|
|
|
import { Intent, ToasterShowEntityMsg } from "../../../Common/Toaster";
|
|
|
|
|
import { FixDigits } from "../../../Common/Utils";
|
|
|
|
|
import { Contour } from "../../../DatabaseServices/Contour";
|
|
|
|
|
import { Database } from "../../../DatabaseServices/Database";
|
|
|
|
|
import { Arc } from "../../../DatabaseServices/Entity/Arc";
|
|
|
|
|
import { Board } from "../../../DatabaseServices/Entity/Board";
|
|
|
|
|
import { BoardType, LinesType } from "../../../DatabaseServices/Entity/BoardInterface";
|
|
|
|
|
import { BoardOpenDir, BoardType, LinesType } from "../../../DatabaseServices/Entity/BoardInterface";
|
|
|
|
|
import { Entity } from "../../../DatabaseServices/Entity/Entity";
|
|
|
|
|
import { Line } from "../../../DatabaseServices/Entity/Line";
|
|
|
|
|
import { Polyline } from "../../../DatabaseServices/Entity/Polyline";
|
|
|
|
|
import { HardwareCompositeEntity } from "../../../DatabaseServices/Hardware/HardwareCompositeEntity";
|
|
|
|
|
import { ObjectId } from "../../../DatabaseServices/ObjectId";
|
|
|
|
|
import { Shape } from "../../../DatabaseServices/Shape";
|
|
|
|
|
import { GetOnlineTemplate } from "../../../DatabaseServices/Template/TempateUtils";
|
|
|
|
|
import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecord";
|
|
|
|
|
import { Command, CommandWrap } from "../../../Editor/CommandMachine";
|
|
|
|
|
import { XAxis, YAxis, ZAxis, ZeroVec, equaln } from "../../../Geometry/GeUtils";
|
|
|
|
@ -25,6 +28,7 @@ import { AppToaster } from "../../../UI/Components/Toaster";
|
|
|
|
|
import { CuttingBoardByBoard } from "../../BoardCutting/CuttingUtils2";
|
|
|
|
|
import { FaceDirection } from "../../DrawDrilling/DrillType";
|
|
|
|
|
import { IBoardRectHoleType, SetBrHighHoleTypeFromRectHoleType } from "../../DrawDrilling/HoleUtils";
|
|
|
|
|
import { JiaJuLoader, MaterialInfo } from "./JiaJuLoader";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let _xmlParse: DOMParser;
|
|
|
|
@ -97,7 +101,7 @@ export async function ImportJiaJuData(bom: JiaJu.Bom)
|
|
|
|
|
{
|
|
|
|
|
CommandWrap(async () =>
|
|
|
|
|
{
|
|
|
|
|
new JiaJuParse(bom, app.Database).Do();
|
|
|
|
|
await new JiaJuParse(bom, app.Database).Do();
|
|
|
|
|
|
|
|
|
|
let ents = app.CommandReactor._createObejcts.filter(obj => obj instanceof Entity) as Entity[];
|
|
|
|
|
|
|
|
|
@ -146,6 +150,7 @@ export async function ImportJiaJuData(bom: JiaJu.Bom)
|
|
|
|
|
class JiaJuParse
|
|
|
|
|
{
|
|
|
|
|
RoomIdNameMap = new Map<string, string>();
|
|
|
|
|
Code_MaterialInfo = new Map<string, MaterialInfo>();
|
|
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
|
public bom: JiaJu.Bom,
|
|
|
|
@ -155,11 +160,14 @@ class JiaJuParse
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Do()
|
|
|
|
|
async Do()
|
|
|
|
|
{
|
|
|
|
|
this.ParseRoomNameMap();
|
|
|
|
|
const jiaJuLoader = new JiaJuLoader();
|
|
|
|
|
await jiaJuLoader.LoaderMaterialInfo();
|
|
|
|
|
this.Code_MaterialInfo = jiaJuLoader.Code_MaterialInfo;
|
|
|
|
|
for (let ps of this.bom.Products[0].Product)
|
|
|
|
|
this.ParseProduct(ps);//第一层
|
|
|
|
|
await this.ParseProduct(ps);//第一层
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ParseRoomNameMap()
|
|
|
|
@ -172,47 +180,189 @@ class JiaJuParse
|
|
|
|
|
this.RoomIdNameMap.set(room.ID, room.Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ParseProduct(product: JiaJu.ProductBase, guiName: string = undefined, parentRoomName: string = ""): TemplateRecord | Entity
|
|
|
|
|
async ParseProduct(product: JiaJu.ProductBase, guiName: string = undefined, parentRoomName: string = ""): Promise<TemplateRecord | Entity>
|
|
|
|
|
{
|
|
|
|
|
if (product.ObjType === "Board")//(product as JiaJu.EntityProduct).BoardMode
|
|
|
|
|
let entity: Entity;
|
|
|
|
|
let template: TemplateRecord;
|
|
|
|
|
if (product.TypeID === "BanJian")//(product as JiaJu.EntityProduct).BoardMode
|
|
|
|
|
entity = await this.ParseBoardParseBoard(product as JiaJu.EntityProduct, parentRoomName, guiName);
|
|
|
|
|
else if (product.TypeID === "ABKU")
|
|
|
|
|
{
|
|
|
|
|
return this.ParseBoardParseBoard(product as JiaJu.EntityProduct, parentRoomName, guiName);
|
|
|
|
|
let paramTable = (product as JiaJu.ABKUProduct).ParamTable[0];
|
|
|
|
|
let template_out = await GetOnlineTemplate(paramTable.ID);
|
|
|
|
|
if (template_out)
|
|
|
|
|
{
|
|
|
|
|
template_out = template_out.Root;
|
|
|
|
|
|
|
|
|
|
template_out.LParam.expr = paramTable.W;
|
|
|
|
|
template_out.WParam.expr = paramTable.D;
|
|
|
|
|
template_out.HParam.expr = paramTable.H;
|
|
|
|
|
|
|
|
|
|
for (let paramName in paramTable)
|
|
|
|
|
{
|
|
|
|
|
if (paramName.startsWith("MK_"))
|
|
|
|
|
{
|
|
|
|
|
let param = template_out.GetParam(paramName);
|
|
|
|
|
if (param)
|
|
|
|
|
param.expr = paramTable[paramName];
|
|
|
|
|
else
|
|
|
|
|
Log(`AB库应用参数失败,参数:${paramName}`, LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let ens = template_out.AllEntitys as Entity[];
|
|
|
|
|
for (const en of ens)
|
|
|
|
|
{
|
|
|
|
|
if (en instanceof Board)
|
|
|
|
|
{
|
|
|
|
|
if (paramTable.MTL)
|
|
|
|
|
{
|
|
|
|
|
const materialParam = this.Code_MaterialInfo.get(paramTable.MTL);
|
|
|
|
|
if (materialParam)
|
|
|
|
|
{
|
|
|
|
|
en.BoardProcessOption[EBoardKeyList.BrMat] = materialParam.brName;
|
|
|
|
|
en.BoardProcessOption[EBoardKeyList.Mat] = materialParam.material;
|
|
|
|
|
en.BoardProcessOption[EBoardKeyList.Color] = materialParam.color;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (en instanceof HardwareCompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
let parsMap = new Map([["CFDW", "unit"], ["CFJG", "actualExpr"], ["CFXH", "model"], ["CFCJ", "factory"], ["CFPP", "brand"],
|
|
|
|
|
["CFGG", "spec"], ["CFSL", "count"], ["CFCZ", "material"], ["CFYS", "color"]]);
|
|
|
|
|
|
|
|
|
|
for (const paramName in paramTable)
|
|
|
|
|
{
|
|
|
|
|
if (parsMap.has(paramName))
|
|
|
|
|
{
|
|
|
|
|
let key = parsMap.get(paramName);
|
|
|
|
|
if (key)
|
|
|
|
|
en.HardwareOption[key] = paramTable[paramName];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//开门方向
|
|
|
|
|
if (paramTable.OPEN_TYPE !== undefined)
|
|
|
|
|
{
|
|
|
|
|
function GetHardwareOpenDir(dir: BoardOpenDir): string
|
|
|
|
|
{
|
|
|
|
|
switch (dir)
|
|
|
|
|
{
|
|
|
|
|
case BoardOpenDir.Left:
|
|
|
|
|
return "左开门板";
|
|
|
|
|
case BoardOpenDir.Right:
|
|
|
|
|
return "右开门板";
|
|
|
|
|
case BoardOpenDir.Up:
|
|
|
|
|
return "上开门板";
|
|
|
|
|
case BoardOpenDir.Down:
|
|
|
|
|
return "下开门板";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let openType = parseInt(paramTable.OPEN_TYPE);
|
|
|
|
|
let openDoorString = GetHardwareOpenDir(openType);
|
|
|
|
|
for (let e of template_out.AllEntitys)
|
|
|
|
|
{
|
|
|
|
|
if (e instanceof Board)
|
|
|
|
|
e.OpenDir = openType;
|
|
|
|
|
else if (e instanceof HardwareCompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
if (openDoorString)
|
|
|
|
|
e.HardwareOption.model = openDoorString;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await template_out.UpdateTemplateTree();
|
|
|
|
|
|
|
|
|
|
let mtx = new Matrix4().fromArray(product.Coordinate.split(",").map(parseFloat));
|
|
|
|
|
for (let ent of template_out.AllEntitys)
|
|
|
|
|
ent.ApplyMatrix(mtx);
|
|
|
|
|
|
|
|
|
|
template = this.curDb.WblockCloneObejcts([template_out], this.curDb.TemplateTable, new Map(), DuplicateRecordCloning.Ignore)[0] as TemplateRecord;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (product.ObjType === "Cabinet" || product.ObjType === "CabinetDoor" || product.ObjType === "Group" || product.ObjType === "Union")//组
|
|
|
|
|
// || product.TypeID === "" || product.TypeID === "GuiTi"
|
|
|
|
|
{
|
|
|
|
|
parentRoomName = this.RoomIdNameMap.get((product as JiaJu.ModelProduct).RoomID) ?? parentRoomName;
|
|
|
|
|
guiName = guiName ?? product.Name ?? "[未命名]";//柜名只能初始化一次
|
|
|
|
|
|
|
|
|
|
let template = new TemplateRecord().InitBaseParams();
|
|
|
|
|
template.Name = product.Name ?? "[未命名]";
|
|
|
|
|
this.curDb.TemplateTable.Add(template);
|
|
|
|
|
let childrenEntitys: Entity[] = [];
|
|
|
|
|
let childrenTemplate: TemplateRecord[] = [];
|
|
|
|
|
|
|
|
|
|
if ((product as JiaJu.ModelProduct).Products[0]?.Product?.length)
|
|
|
|
|
for (let p of (product as JiaJu.ModelProduct).Products[0].Product)
|
|
|
|
|
{
|
|
|
|
|
let obj = this.ParseProduct(p, guiName, parentRoomName);
|
|
|
|
|
let obj = await this.ParseProduct(p, guiName, parentRoomName);
|
|
|
|
|
if (obj instanceof Entity)
|
|
|
|
|
template.Objects.push(obj.Id);
|
|
|
|
|
childrenEntitys.push(obj);
|
|
|
|
|
else if (obj instanceof TemplateRecord)
|
|
|
|
|
template.Children.push(obj.Id);
|
|
|
|
|
childrenTemplate.push(obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return template;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else if (product.ObjType === "Decoration")//装饰品 五金(拉手 铰链?)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
else if (product.ObjType === "TopLine")//顶线
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
else if (product.ObjType === "SweepLine")//
|
|
|
|
|
if (childrenEntitys.length || childrenTemplate.length)
|
|
|
|
|
{
|
|
|
|
|
parentRoomName = this.RoomIdNameMap.get((product as JiaJu.ModelProduct).RoomID) ?? parentRoomName;
|
|
|
|
|
guiName = guiName ?? product.Name ?? "[未命名]";//柜名只能初始化一次
|
|
|
|
|
|
|
|
|
|
if (!template)
|
|
|
|
|
{
|
|
|
|
|
template = new TemplateRecord().InitBaseParams();
|
|
|
|
|
template.Name = product.Name ?? "[未命名]";
|
|
|
|
|
this.curDb.TemplateTable.Add(template);//加入到图纸
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//本层可能是实体
|
|
|
|
|
if (entity)
|
|
|
|
|
template.Objects.push(entity.Id);
|
|
|
|
|
|
|
|
|
|
//子实体
|
|
|
|
|
for (let entity of childrenEntitys)
|
|
|
|
|
template.Objects.push(entity.Id);
|
|
|
|
|
|
|
|
|
|
//子模块
|
|
|
|
|
for (let ct of childrenTemplate)
|
|
|
|
|
template.Children.push(ct.Id);
|
|
|
|
|
|
|
|
|
|
return template;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return entity ?? template;
|
|
|
|
|
|
|
|
|
|
// else if (product.ObjType === "Cabinet" || product.ObjType === "CabinetDoor" || product.ObjType === "Group" || product.ObjType === "Union")//组
|
|
|
|
|
// // || product.TypeID === "" || product.TypeID === "GuiTi"
|
|
|
|
|
// {
|
|
|
|
|
// parentRoomName = this.RoomIdNameMap.get((product as JiaJu.ModelProduct).RoomID) ?? parentRoomName;
|
|
|
|
|
// guiName = guiName ?? product.Name ?? "[未命名]";//柜名只能初始化一次
|
|
|
|
|
|
|
|
|
|
// let template = new TemplateRecord().InitBaseParams();
|
|
|
|
|
// template.Name = product.Name ?? "[未命名]";
|
|
|
|
|
// this.curDb.TemplateTable.Add(template);
|
|
|
|
|
|
|
|
|
|
// for (let p of (product as JiaJu.ModelProduct).Products[0].Product)
|
|
|
|
|
// {
|
|
|
|
|
// let obj = this.ParseProduct(p, guiName, parentRoomName);
|
|
|
|
|
// if (obj instanceof Entity)
|
|
|
|
|
// template.Objects.push(obj.Id);
|
|
|
|
|
// else if (obj instanceof TemplateRecord)
|
|
|
|
|
// template.Children.push(obj.Id);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// return template;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// else if (product.ObjType === "Decoration")//装饰品 五金(拉手 铰链?)
|
|
|
|
|
// {
|
|
|
|
|
// }
|
|
|
|
|
// else if (product.ObjType === "TopLine")//顶线
|
|
|
|
|
// {
|
|
|
|
|
// }
|
|
|
|
|
// else if (product.ObjType === "SweepLine")//
|
|
|
|
|
// {
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//解析板件实体
|
|
|
|
|
ParseBoardParseBoard(entityProduct: JiaJu.EntityProduct, roomName: string, cabName: string): Board
|
|
|
|
|
async ParseBoardParseBoard(entityProduct: JiaJu.EntityProduct, roomName: string, cabName: string): Promise<Board>
|
|
|
|
|
{
|
|
|
|
|
let paramTable = entityProduct.ParamTable[0];
|
|
|
|
|
|
|
|
|
@ -222,9 +372,20 @@ class JiaJuParse
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.BrMat] = paramTable.MTL_NAME ?? "";
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.RoomName] = roomName;
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.CabinetName] = cabName;
|
|
|
|
|
if (paramTable.TrepanningDirection && ["Zuo", "Xia", "Hou"].includes(paramTable.TrepanningDirection)) //每个板类型只会有其中两种
|
|
|
|
|
if (paramTable.TrepanningDirection && ["Zuo", "Xia", "Qian"].includes(paramTable.TrepanningDirection)) //每个板类型只会有其中两种
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.BigHole] = FaceDirection.Back;
|
|
|
|
|
|
|
|
|
|
if (paramTable.MTL)
|
|
|
|
|
{
|
|
|
|
|
const materialParam = this.Code_MaterialInfo.get(paramTable.MTL);
|
|
|
|
|
if (materialParam)
|
|
|
|
|
{
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.BrMat] = materialParam.brName;
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.Mat] = materialParam.material;
|
|
|
|
|
br.BoardProcessOption[EBoardKeyList.Color] = materialParam.color;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//outline
|
|
|
|
|
let outline = entityProduct.OutLines[0];
|
|
|
|
|
let path = outline.Path[0];
|
|
|
|
@ -234,6 +395,10 @@ class JiaJuParse
|
|
|
|
|
let modelPth = outline.ModelPath[0];
|
|
|
|
|
br.Thickness = FixDigits(parseFloat(modelPth.GeCurve[0].EndZ), 1);
|
|
|
|
|
|
|
|
|
|
//开门方向
|
|
|
|
|
if (paramTable.OPEN_TYPE !== undefined)
|
|
|
|
|
br.OpenDir = parseInt(paramTable.OPEN_TYPE);
|
|
|
|
|
|
|
|
|
|
//holes
|
|
|
|
|
if (outline.Hole)
|
|
|
|
|
{
|
|
|
|
@ -307,6 +472,7 @@ class JiaJuParse
|
|
|
|
|
|
|
|
|
|
//位置
|
|
|
|
|
let mtx = new Matrix4().fromArray(entityProduct.Coordinate.split(",").map(parseFloat));
|
|
|
|
|
mtx = NormalMatrix(mtx);
|
|
|
|
|
br.ApplyMatrix(mtx);
|
|
|
|
|
|
|
|
|
|
//排钻
|
|
|
|
|