优化WblockClone代码.

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

@ -91,7 +91,7 @@ Array [
false,
0,
2,
1,
2,
"TextureTableRecord",
2,
101,
@ -106,6 +106,20 @@ Array [
1,
0,
"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,
3,
false,

@ -146,39 +146,60 @@ export class Database
/**
* .
* 使HardId,使WblockClone.
* Owner.
* ,OwnerHard
* @param objects
* @param owner
* @param idMap id
*/
async WblockCloneObejcts(
WblockCloneObejcts(
objects: CADObject[],
owner: OwnerContainer,
idMap: IdMaping,
drc: DuplicateRecordCloning,
drcf?: (name: string) => DuplicateRecordCloning
drc: DuplicateRecordCloning
)
{
let f = new WblockCloneFiler();
let clonedObjects: CADObject[] = [];
if (owner instanceof SymbolTable)
{
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;
if (owner.Has(name))//名称重复
{
let status = drc;
if (drcf)
status = await drcf(name);
if (status === DuplicateRecordCloning.Ignore)
continue;
if (status === DuplicateRecordCloning.Rename)
{
//new name
for (let i = 1; ; i++)
{
let nname = `${name}(${i})`;
@ -189,73 +210,50 @@ export class Database
}
}
f.Data.length = 0;
f.WriteObject(record);
let newRecord = f.ReadObject() as SymbolTableRecord;
filer.WriteObject(record);
filer.Reset();
let newRecord = filer.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);
this.AllocationObjectId(newRecord);
idMap.set(object.Id, newRecord.Id);
}
else if (status === DuplicateRecordCloning.Replace)
{
let oldRecord = owner.GetAt(name);
//将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(f);
f.Reset();
record.WriteFile(filer);
filer.Reset();
//此时重新读取的话,将会得到原先的id,实现id不变
oldRecord.ReadFile(f);
oldRecord.ReadFile(filer);
oldRecord.Owner = owner.Id;
idMap.set(object.Id, oldRecord.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;
}
return;
}
}
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++;
this.idMap.set(id.Index, id);
filer.WriteObject(object);
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()

Loading…
Cancel
Save