From 013ae11506bf6e4e3822e5432535583a64375827 Mon Sep 17 00:00:00 2001 From: ChenX Date: Thu, 21 Feb 2019 17:54:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EWblockClone=E7=9A=84=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2,=E9=87=8D=E5=91=BD=E5=90=8D,=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD,=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/wblockClone.test.ts.snap | 233 ++++++++++++++++++ __test__/FileSystem/wblockClone.test.ts | 39 +++ src/Common/Status.ts | 10 + src/DatabaseServices/Database.ts | 83 ++++++- 4 files changed, 360 insertions(+), 5 deletions(-) create mode 100644 __test__/FileSystem/__snapshots__/wblockClone.test.ts.snap create mode 100644 __test__/FileSystem/wblockClone.test.ts diff --git a/__test__/FileSystem/__snapshots__/wblockClone.test.ts.snap b/__test__/FileSystem/__snapshots__/wblockClone.test.ts.snap new file mode 100644 index 000000000..537078a69 --- /dev/null +++ b/__test__/FileSystem/__snapshots__/wblockClone.test.ts.snap @@ -0,0 +1,233 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`wblockClone 1`] = ` +Array [ + 1, + 102, + 1, + 2, + 1, + false, + 0, + 1, + "", + 2, + 2, + false, + 0, + 0, + 2, + 4, + false, + 0, + 2, + 1, + "TextureTableRecord", + 2, + 101, + false, + 4, + 1, + "贴图1", + 1, + 1000, + 1002, + 1, + 1, + 0, + "CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png", + 2, + 3, + false, + 0, + 2, + 1, + "PhysicalMaterialRecord", + 2, + 100, + false, + 3, + 1, + "材质1", + 2, + "#ffffff", + false, + 0.2, + 1, + true, + 101, + 101, + 0.1, + 101, + 0.2, + true, + true, + true, + "", + 1, + -1, + 0, +] +`; + +exports[`wblockClone 2`] = ` +Array [ + 1, + 104, + 1, + 2, + 1, + false, + 0, + 1, + "", + 2, + 2, + false, + 0, + 0, + 2, + 4, + false, + 0, + 2, + 1, + "TextureTableRecord", + 2, + 101, + false, + 4, + 1, + "贴图1", + 1, + 1000, + 1002, + 1, + 1, + 0, + "CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png", + 2, + 3, + false, + 0, + 2, + 2, + "PhysicalMaterialRecord", + 2, + 100, + false, + 3, + 1, + "材质1", + 2, + "#ffffff", + false, + 0.2, + 1, + true, + 101, + 101, + 0.1, + 101, + 0.2, + true, + true, + true, + "", + "PhysicalMaterialRecord", + 2, + 102, + false, + 3, + 1, + "材质1(1)", + 2, + "#ffffff", + false, + 0.2, + 1, + true, + 103, + 103, + 0.1, + 103, + 0.2, + true, + true, + true, + "", + 1, + -1, + 0, +] +`; + +exports[`wblockClone 3`] = ` +Array [ + 1, + 102, + 1, + 2, + 1, + false, + 0, + 1, + "", + 2, + 2, + false, + 0, + 0, + 2, + 4, + false, + 0, + 2, + 1, + "TextureTableRecord", + 2, + 101, + false, + 4, + 1, + "贴图1", + 1, + 1000, + 1002, + 1, + 1, + 0, + "CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png", + 2, + 3, + false, + 0, + 2, + 1, + "PhysicalMaterialRecord", + 2, + 100, + false, + 3, + 1, + "材质1", + 2, + "#ffffff", + false, + 0.2, + 1, + true, + 0, + 0, + 0.1, + 0, + 0.2, + true, + true, + true, + "", + 1, + -1, + 0, +] +`; diff --git a/__test__/FileSystem/wblockClone.test.ts b/__test__/FileSystem/wblockClone.test.ts new file mode 100644 index 000000000..8987a4a41 --- /dev/null +++ b/__test__/FileSystem/wblockClone.test.ts @@ -0,0 +1,39 @@ +import { CADFiler } from '../../src/DatabaseServices/CADFiler'; +import { Database } from '../../src/DatabaseServices/Database'; +import { DuplicateRecordCloning } from '../../src/Common/Status'; +import { PhysicalMaterialRecord } from '../../src/DatabaseServices/PhysicalMaterialRecord'; +import { TextureTableRecord } from '../../src/DatabaseServices/Texture'; +import { Factory } from '../../src/DatabaseServices/CADFactory'; + +new CADFiler(); + +Factory(TextureTableRecord); + +test('wblockClone', () => +{ + let f = new CADFiler( + [1, 102, 1, 2, 1, false, 0, 1, "", 2, 2, false, 0, 0, 2, 4, false, 0, 2, 1, "TextureTableRecord", 2, 101, false, 4, 1, "贴图1", 1, 1000, 1002, 1, 1, 0, "CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png", 2, 3, false, 0, 2, 1, "PhysicalMaterialRecord", 2, 100, false, 3, 1, "材质1", 2, "#ffffff", false, 0.2, 1, true, 101, 101, 0.1, 101, 0.2, true, true, true, "", 1, -1, 0] + ); + let db = new Database(); + + db.FileRead(f); + + //空db导入. + let emptyDb = new Database(); + emptyDb.WblockCloneObejcts([db.MaterialTable.GetAt("材质1")], emptyDb.MaterialTable, new Map(), DuplicateRecordCloning.Ignore); + expect(emptyDb.FileWrite().Data).toMatchSnapshot(); + + //重命名 + emptyDb.WblockCloneObejcts([db.MaterialTable.GetAt("材质1")], emptyDb.MaterialTable, new Map(), DuplicateRecordCloning.Rename); + expect(emptyDb.FileWrite().Data).toMatchSnapshot(); + + //替换. + let replaceDb = new Database(); + let material = new PhysicalMaterialRecord(); + material.Name = "材质1"; + replaceDb.MaterialTable.Add(material); + replaceDb.WblockCloneObejcts([db.MaterialTable.GetAt("材质1")], emptyDb.MaterialTable, new Map(), DuplicateRecordCloning.Replace); + expect(replaceDb.FileWrite().Data).toMatchSnapshot(); +}); + +//file.only diff --git a/src/Common/Status.ts b/src/Common/Status.ts index d0c2b674e..48ef092a9 100644 --- a/src/Common/Status.ts +++ b/src/Common/Status.ts @@ -20,3 +20,13 @@ export enum UpdateDraw Material = 4, All = ~(~0 << 6) } + +/** + * WblockClne时,遇到重复记录的操作方式 + */ +export enum DuplicateRecordCloning +{ + Ignore = 1, + Replace = 2, + Rename = 3, +} diff --git a/src/DatabaseServices/Database.ts b/src/DatabaseServices/Database.ts index 77e3f120a..51c73ca91 100644 --- a/src/DatabaseServices/Database.ts +++ b/src/DatabaseServices/Database.ts @@ -14,6 +14,7 @@ import { TextureTable } from './TextureTable'; import { SymbolTable } from './SymbolTable'; import { SymbolTableRecord } from './SymbolTableRecord'; import { WblockCloneFiler } from './WblockCloneFiler'; +import { DuplicateRecordCloning } from '../Common/Status'; type OwnerContainer = SymbolTable | SymbolTableRecord; @@ -148,19 +149,91 @@ export class Database * @param objects 对象不能属于本数据库 * @param owner 克隆对象的新容器 * @param idMap id映射 - * @param cloning DuplicateRecordCloning 重复记录的执行操作 - * @param deferXlation 指示是否应该进行ID转换 */ - WblockCloneObejcts( + async WblockCloneObejcts( objects: CADObject[], owner: OwnerContainer, idMap: IdMaping, + drc: DuplicateRecordCloning, + drcf?: (name: string) => DuplicateRecordCloning ) { + let f = new WblockCloneFiler(); let clonedObjects: CADObject[] = []; - f.CloneObjects(objects, clonedObjects); - this.CheapClone(f, idMap, owner); + + if (owner instanceof SymbolTable) + { + for (let obj of objects) + { + let record = obj as SymbolTableRecord; + let name = record.Name; + if (owner.Has(name))//名称重复 + { + let status = drc; + if (drcf) + status = await drcf(name); + + if (status === DuplicateRecordCloning.Ignore) + continue; + + if (status === DuplicateRecordCloning.Rename) + { + for (let i = 1; ; i++) + { + let nname = `${name}(${i})`; + if (!owner.Has(nname)) + { + name = nname; + break; + } + } + + f.Data.length = 0; + f.WriteObject(record); + let newRecord = f.ReadObject() as SymbolTableRecord; + newRecord.Owner = undefined; + newRecord.Name = name; + owner.Add(newRecord, false); + + newRecord.Id.Index = this.idIndex++; + this.idMap.set(newRecord.Id.Index, newRecord.Id); + idMap.set(obj.Id, newRecord.Id); + } + else if (status === DuplicateRecordCloning.Replace) + { + let oldRecord = owner.GetAt(name); + //将f的id映射设置为旧的id + f.idMaping.set(obj.Id.Index, oldRecord.Id); + + f.Data.length = 0; + record.WriteFile(f); + f.Reset(); + + //此时重新读取的话,将会得到原先的id,实现id不变 + oldRecord.ReadFile(f); + oldRecord.Owner = owner.Id; + } + } + else + { + f.Data.length = 0; + f.WriteObject(record); + let newRecord = f.ReadObject() as SymbolTableRecord; + owner.Add(newRecord, false); + + newRecord.Id.Index = this.idIndex++; + this.idMap.set(newRecord.Id.Index, newRecord.Id); + idMap.set(obj.Id, newRecord.Id); + break; + } + } + } + else + { + f.CloneObjects(objects, clonedObjects); + this.CheapClone(f, idMap, owner); + } let oldDb = objects[0].Db;