新增WblockClone的替换,重命名,忽略功能,并添加测试

pull/261/head
ChenX 6 years ago
parent 6c00538b39
commit 013ae11506

@ -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,
]
`;

@ -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

@ -20,3 +20,13 @@ export enum UpdateDraw
Material = 4, Material = 4,
All = ~(~0 << 6) All = ~(~0 << 6)
} }
/**
* WblockClne,
*/
export enum DuplicateRecordCloning
{
Ignore = 1,
Replace = 2,
Rename = 3,
}

@ -14,6 +14,7 @@ import { TextureTable } from './TextureTable';
import { SymbolTable } from './SymbolTable'; import { SymbolTable } from './SymbolTable';
import { SymbolTableRecord } from './SymbolTableRecord'; import { SymbolTableRecord } from './SymbolTableRecord';
import { WblockCloneFiler } from './WblockCloneFiler'; import { WblockCloneFiler } from './WblockCloneFiler';
import { DuplicateRecordCloning } from '../Common/Status';
type OwnerContainer = SymbolTable | SymbolTableRecord; type OwnerContainer = SymbolTable | SymbolTableRecord;
@ -148,19 +149,91 @@ export class Database
* @param objects * @param objects
* @param owner * @param owner
* @param idMap id * @param idMap id
* @param cloning DuplicateRecordCloning
* @param deferXlation ID
*/ */
WblockCloneObejcts( async WblockCloneObejcts(
objects: CADObject[], objects: CADObject[],
owner: OwnerContainer, owner: OwnerContainer,
idMap: IdMaping, idMap: IdMaping,
drc: DuplicateRecordCloning,
drcf?: (name: string) => DuplicateRecordCloning
) )
{ {
let f = new WblockCloneFiler(); let f = new WblockCloneFiler();
let clonedObjects: CADObject[] = []; 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; let oldDb = objects[0].Db;

Loading…
Cancel
Save