!2371 嘉居:使用TypeId解析板

pull/2311/MERGE
ChenX 1 year ago
parent 9d065cb5e0
commit 6ecbff8c60

@ -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);
//排钻

@ -46,7 +46,7 @@ namespace JiaJu
ChannelID: string;//求导编码
PID: string;//模型实例ID
OrderID: string;
TypeID: "" | "XianTiao" | "GuiTi";//类型识别码 太复杂了
TypeID: "BanJian" | "XianTiao" | "ABKU" | "GuiTi";//类型识别码 太复杂了
ObjType: "CabinetDoor" | "Cabinet" | "Group" | "Union" |
"Board" | "Decoration" | "TopLine" | "SweepLine";
TypeLabel: string;
@ -125,6 +125,11 @@ namespace JiaJu
OutLines?: OutLine[];
}
export interface ABKUProduct extends ProductBase
{
ParamTable: EntityParamTable[];
}
export interface OutLine
{
Path: Path[];
@ -194,6 +199,7 @@ namespace JiaJu
MTL_DIR: string;
NAME: string;
OPEN_STATUS: string;
OPEN_TYPE: string;//0 1左 2右 3上 4下
PRO_NOTES: string;
QUOTE_CODE: string;
RD: string;

@ -0,0 +1,57 @@
import { ShopUrls } from "../../../Common/HostUrl";
import { PostJson, RequestStatus } from "../../../Common/Request";
export interface MaterialInfo
{
brName: string;
material: string;
color: string;
}
export class JiaJuLoader
{
constructor() { }
//编码->材质信息
Code_MaterialInfo: Map<string, MaterialInfo> = new Map();
async LoaderMaterialInfo()
{
let allCount = 0;
const page_count = 50;
const getQuery = (curr_page: number) =>
{
return {
curr_page: curr_page,
bind_type: 1,
goods_type: 1,
page_count: page_count,
};
};
const SetMaterialMapByGoods = (goods) =>
{
for (const good of goods)
{
const brName = good.goods_name;
const material = good.goods_param.find(p => p.name === "材料").value;
const color = good.goods_param.find(p => p.name === "颜色").value;
this.Code_MaterialInfo.set(good.goods_sn, { brName, material, color });
}
};
const data = await PostJson(ShopUrls.get, getQuery(1));
if (data.err_code === RequestStatus.Ok)
{
const { count, goods } = data;
allCount = count;
SetMaterialMapByGoods(goods);
}
if (allCount > 0)
{
const pageNumbers = Array.from({ length: Math.ceil(allCount / page_count) - 1 }, (_, i) => i + 2);
const otherGoodsPromise = pageNumbers.map(curr_page => { return PostJson(ShopUrls.get, getQuery(curr_page)); });
const otherGoodsRes = await Promise.all(otherGoodsPromise);
otherGoodsRes.map((data => SetMaterialMapByGoods(data.goods)));
}
}
}
Loading…
Cancel
Save