|
|
@ -146,39 +146,60 @@ export class Database
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 将来自不同数据库的对象列表拷贝到本数据库中.
|
|
|
|
* 将来自不同数据库的对象列表拷贝到本数据库中.
|
|
|
|
|
|
|
|
* 当前支持使用HardId模式来硬关联某个对象,使该对象能够在WblockClone时一起被带过来.
|
|
|
|
|
|
|
|
* 当前不支持硬关联对象的Owner不是默认的容器.
|
|
|
|
|
|
|
|
* 如果需要这么做,请将该对象的Owner设置为Hard关联
|
|
|
|
* @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()
|
|
|
|