From 62573bea7a738dc4329437a1ef7c20ba621ef196 Mon Sep 17 00:00:00 2001 From: ChenX Date: Fri, 15 Feb 2019 17:32:40 +0800 Subject: [PATCH] =?UTF-8?q?WblockClone=20=E6=9D=90=E8=B4=A8=E7=90=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DatabaseServices/CADFiler.ts | 6 ++- src/DatabaseServices/CADObject.ts | 4 ++ src/DatabaseServices/Database.ts | 40 ++++++++++++++++++- src/DatabaseServices/ObjectId.ts | 12 ++---- .../PhysicalMaterialRecord.ts | 6 +-- src/DatabaseServices/SymbolTable.ts | 4 +- src/DatabaseServices/WblockCloneFiler.ts | 23 +++++++++++ 7 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 src/DatabaseServices/WblockCloneFiler.ts diff --git a/src/DatabaseServices/CADFiler.ts b/src/DatabaseServices/CADFiler.ts index ee3d8391c..395dcdf87 100644 --- a/src/DatabaseServices/CADFiler.ts +++ b/src/DatabaseServices/CADFiler.ts @@ -78,7 +78,7 @@ export class CADFiler } } - CloneObjects(objects: ISerialize[], clonedObjects: ISerialize[] = []) + CloneObjects(objects: CADObject[], clonedObjects: CADObject[] = []) { for (let o of objects) this.WriteObject(o); @@ -121,6 +121,10 @@ export class CADFiler if (this.database) return this.database.GetObjectId(index, true); } + ReadHardId() + { + return this.ReadObjectId(); + } ToString() { diff --git a/src/DatabaseServices/CADObject.ts b/src/DatabaseServices/CADObject.ts index 59beddf0b..83b16dc29 100644 --- a/src/DatabaseServices/CADObject.ts +++ b/src/DatabaseServices/CADObject.ts @@ -14,6 +14,10 @@ export abstract class CADObject { this.m_Owner = owner; } + get Owner() + { + return this.m_Owner; + } //对象被彻底遗弃 GoodBye(): any diff --git a/src/DatabaseServices/Database.ts b/src/DatabaseServices/Database.ts index 3af4b779d..35358de51 100644 --- a/src/DatabaseServices/Database.ts +++ b/src/DatabaseServices/Database.ts @@ -11,6 +11,9 @@ import { IdMaping } from './IdMaping'; import { MaterialTable } from './MaterialTable'; import { ObjectId } from './ObjectId'; import { TextureTable } from './TextureTable'; +import { SymbolTable } from './SymbolTable'; +import { SymbolTableRecord } from './SymbolTableRecord'; +import { WblockCloneFiler } from './WblockCloneFiler'; @Factory export class Database @@ -114,6 +117,16 @@ export class Database ent.SetDefaultDb(this); owner.Append(ent, false); } + else if (owner instanceof SymbolTable) + { + let record = objectId.Object as SymbolTableRecord; + if (owner.Has(record.Name)) + { + console.log("重复的记录名称!"); + continue; + } + owner.Add(record, false); + } } } } @@ -121,7 +134,7 @@ export class Database /** * 将来自不同数据库的对象列表拷贝到本数据库中. * @param objects 对象不能属于本数据库 - * @param owner 克隆对象的容器 + * @param owner 克隆对象的新容器 * @param idMap id映射 * @param cloning DuplicateRecordCloning 重复记录的执行操作 * @param deferXlation 指示是否应该进行ID转换 @@ -134,7 +147,32 @@ export class Database deferXlation = false ) { + let f = new WblockCloneFiler(); + let clonedObjects: CADObject[] = []; + 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 = owner.Db.GetObjectId(oldId.Object.Owner.Index); + let newOwner = newOwnerId.Object as SymbolTable; + + newOwner.Add(clonedObjects[0] as SymbolTableRecord, false); + + id.Index = this.idIndex++; + this.idMap.set(id.Index, id); + + idMap.set(oldId, id); + } + return clonedObjects; } Insert() diff --git a/src/DatabaseServices/ObjectId.ts b/src/DatabaseServices/ObjectId.ts index 50b78ca83..393f59093 100644 --- a/src/DatabaseServices/ObjectId.ts +++ b/src/DatabaseServices/ObjectId.ts @@ -10,14 +10,8 @@ ObjectId必须使用 Database分配(db里面会存id的列表,以便同时更新 */ export class ObjectId { - private id: number; - private obj: CADObject; - - //对外隐藏构造函数,如果需要构造一个id,请使用 Create 静态方法. - constructor(index: number = 0, obj?: CADObject) + constructor(private index = 0, private obj?: CADObject) { - this.id = index; - this.obj = obj; } get IsErase(): boolean @@ -34,11 +28,11 @@ export class ObjectId } get Index(): number { - return this.id; + return this.index; } set Index(index: number) { - this.id = index; + this.index = index; } } diff --git a/src/DatabaseServices/PhysicalMaterialRecord.ts b/src/DatabaseServices/PhysicalMaterialRecord.ts index f647ce456..139fd1806 100644 --- a/src/DatabaseServices/PhysicalMaterialRecord.ts +++ b/src/DatabaseServices/PhysicalMaterialRecord.ts @@ -61,10 +61,10 @@ export class PhysicalMaterialRecord extends MaterialTableRecord this.matalness = file.Read(); this.opacity = file.Read(); this.depthTest = file.Read(); - this.map = file.ReadObjectId(); - this.bumpMap = file.ReadObjectId(); + this.map = file.ReadHardId(); + this.bumpMap = file.ReadHardId(); this.bumpScale = file.Read(); - this.roughnessMap = file.ReadObjectId(); + this.roughnessMap = file.ReadHardId(); this.roughness = file.Read(); this.useMap = file.Read(); this.useBumpMap = file.Read(); diff --git a/src/DatabaseServices/SymbolTable.ts b/src/DatabaseServices/SymbolTable.ts index 23c91eda3..61c4156e3 100644 --- a/src/DatabaseServices/SymbolTable.ts +++ b/src/DatabaseServices/SymbolTable.ts @@ -13,12 +13,12 @@ export class SymbolTable extends CADObject */ @observable Symbols = new Map(); - Add(record: SymbolTableRecord): Status + Add(record: SymbolTableRecord, isCheckObjectCleanly = true): Status { if (this.Symbols.has(record.Name)) return Status.DuplicateRecordName; - if (this._db && !record.Id) + if (this._db && (!isCheckObjectCleanly || !record.Id)) record.SetOwnerDatabase(this._db); record.Owner = this.objectId; diff --git a/src/DatabaseServices/WblockCloneFiler.ts b/src/DatabaseServices/WblockCloneFiler.ts new file mode 100644 index 000000000..4e387229a --- /dev/null +++ b/src/DatabaseServices/WblockCloneFiler.ts @@ -0,0 +1,23 @@ +import { DeepCloneFiler } from "./DeepCloneFiler"; +import { ObjectId } from "./ObjectId"; + +export class WblockCloneFiler extends DeepCloneFiler +{ + hardMaping = new Map(); + ReadHardId() + { + let index = this.Read(); + if (index <= 0) return; + + let id = this.idMaping.get(index); + if (id) return id; + + id = new ObjectId(); + this.idMaping.set(index, id); + + if (index > 100) + this.hardMaping.set(index, id); + + return id; + } +}