优化WblockClone代码.

pull/259/MERGE
ChenX 6 years ago
parent da4c57729c
commit c750fd18c1

@ -91,7 +91,7 @@ Array [
false, false,
0, 0,
2, 2,
1, 2,
"TextureTableRecord", "TextureTableRecord",
2, 2,
101, 101,
@ -106,6 +106,20 @@ Array [
1, 1,
0, 0,
"CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png", "CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png",
"TextureTableRecord",
2,
103,
false,
4,
1,
"贴图1(1)",
1,
1000,
1002,
1,
1,
0,
"CAD/images/bd/bdfb0d6740912fc3217e3f9bfa4c53fd.png",
2, 2,
3, 3,
false, false,

@ -146,39 +146,60 @@ export class Database
/** /**
* . * .
* 使HardId,使WblockClone.
* Owner.
* ,OwnerHard
* @param objects * @param objects
* @param owner * @param owner
* @param idMap id * @param idMap id
*/ */
async WblockCloneObejcts( WblockCloneObejcts(
objects: CADObject[], objects: CADObject[],
owner: OwnerContainer, owner: OwnerContainer,
idMap: IdMaping, idMap: IdMaping,
drc: DuplicateRecordCloning, drc: DuplicateRecordCloning
drcf?: (name: string) => DuplicateRecordCloning
) )
{ {
let f = new WblockCloneFiler(); let f = new WblockCloneFiler();
let clonedObjects: CADObject[] = [];
if (owner instanceof SymbolTable)
{
for (let obj of objects) for (let obj of objects)
{ {
let record = obj as SymbolTableRecord; this.WblockCloneObject(obj, owner, idMap, drc, f);
}
let oldDb = objects[0].Db;
for (let [n, id] of f.hardMaping)
{
let oldId = oldDb.GetObjectId(n);
//使用旧的OwnerId得到新的OwnerId,假设所有者都是数据库默认存在的.
//TODO: 当OwnerId>100时,表示这个所有者不是数据库里面默认存在的,那么应该将Owner拷贝过来.
let newOwnerId = this.GetObjectId(oldId.Object.Owner.Index);//owner.Db === this
let newOwner = newOwnerId.Object as SymbolTable;
this.WblockCloneObject(oldId.Object, newOwner, idMap, drc, f);
}
}
private WblockCloneObject(
object: CADObject,
owner: OwnerContainer,
idMap: IdMaping,
drc: DuplicateRecordCloning,
filer: WblockCloneFiler
)
{
filer.Data.length = 0;
if (owner instanceof SymbolTable)
{
let record = object as SymbolTableRecord;
let name = record.Name; let name = record.Name;
if (owner.Has(name))//名称重复 if (owner.Has(name))//名称重复
{ {
let status = drc; let status = drc;
if (drcf)
status = await drcf(name);
if (status === DuplicateRecordCloning.Ignore)
continue;
if (status === DuplicateRecordCloning.Rename) if (status === DuplicateRecordCloning.Rename)
{ {
//new name
for (let i = 1; ; i++) for (let i = 1; ; i++)
{ {
let nname = `${name}(${i})`; let nname = `${name}(${i})`;
@ -189,73 +210,50 @@ export class Database
} }
} }
f.Data.length = 0; filer.WriteObject(record);
f.WriteObject(record); filer.Reset();
let newRecord = f.ReadObject() as SymbolTableRecord; let newRecord = filer.ReadObject() as SymbolTableRecord;
newRecord.Owner = undefined; newRecord.Owner = undefined;
newRecord.Name = name; newRecord.Name = name;
owner.Add(newRecord, false); owner.Add(newRecord, false);
newRecord.Id.Index = this.idIndex++; this.AllocationObjectId(newRecord);
this.idMap.set(newRecord.Id.Index, newRecord.Id); idMap.set(object.Id, newRecord.Id);
idMap.set(obj.Id, newRecord.Id);
} }
else if (status === DuplicateRecordCloning.Replace) else if (status === DuplicateRecordCloning.Replace)
{ {
let oldRecord = owner.GetAt(name); let oldRecord = owner.GetAt(name);
//将f的id映射设置为旧的id //将f的id映射设置为旧的id
f.idMaping.set(obj.Id.Index, oldRecord.Id); filer.idMaping.set(object.Id.Index, oldRecord.Id);
f.Data.length = 0; record.WriteFile(filer);
record.WriteFile(f); filer.Reset();
f.Reset();
//此时重新读取的话,将会得到原先的id,实现id不变 //此时重新读取的话,将会得到原先的id,实现id不变
oldRecord.ReadFile(f); oldRecord.ReadFile(filer);
oldRecord.Owner = owner.Id; oldRecord.Owner = owner.Id;
idMap.set(object.Id, oldRecord.Id);
} }
} return;
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;
for (let [n, id] of f.hardMaping)
{
clonedObjects = [];
let oldId = oldDb.GetObjectId(n);
f.CloneObjects([oldId.Object], clonedObjects);
//使用旧的OwnerId得到新的OwnerId,假设所有者都是数据库默认存在的.
//TODO: 当OwnerId>100时,表示这个所有者不是数据库里面默认存在的,那么应该将Owner拷贝过来.
let newOwnerId = this.GetObjectId(oldId.Object.Owner.Index);//owner.Db === this
let newOwner = newOwnerId.Object as SymbolTable;
newOwner.Add(clonedObjects[0] as SymbolTableRecord, false);
id.Index = this.idIndex++; filer.WriteObject(object);
this.idMap.set(id.Index, id); filer.Reset();
let newObject = filer.ReadObject() as SymbolTableRecord;
owner.Add(newObject, false);
idMap.set(oldId, id); this.AllocationObjectId(newObject);
idMap.set(object.Id, newObject.Id);
} }
return clonedObjects;
/**
* id,
*/
private AllocationObjectId(object: CADObject)
{
object.Id.Index = this.idIndex++;
this.idMap.set(object.Id.Index, object.Id);
} }
Insert() Insert()

Loading…
Cancel
Save