|
|
@ -7,7 +7,6 @@ import { Factory } from './CADFactory';
|
|
|
|
import { CADFiler } from './CADFiler';
|
|
|
|
import { CADFiler } from './CADFiler';
|
|
|
|
import { CADObject } from './CADObject';
|
|
|
|
import { CADObject } from './CADObject';
|
|
|
|
import { DeepCloneFiler } from './DeepCloneFiler';
|
|
|
|
import { DeepCloneFiler } from './DeepCloneFiler';
|
|
|
|
import { Entity } from './Entity/Entity';
|
|
|
|
|
|
|
|
import { GroupTable } from './GroupTable';
|
|
|
|
import { GroupTable } from './GroupTable';
|
|
|
|
import { HistoricManage } from './HistoricManage';
|
|
|
|
import { HistoricManage } from './HistoricManage';
|
|
|
|
import { IdMaping } from './IdMaping';
|
|
|
|
import { IdMaping } from './IdMaping';
|
|
|
@ -15,7 +14,7 @@ import { AmbientLight } from './Lights/AmbientLight';
|
|
|
|
import { DirectionalLight } from './Lights/DirectionalLight';
|
|
|
|
import { DirectionalLight } from './Lights/DirectionalLight';
|
|
|
|
import { HemisphereLight } from './Lights/HemisphereLight';
|
|
|
|
import { HemisphereLight } from './Lights/HemisphereLight';
|
|
|
|
import { MaterialTable } from './MaterialTable';
|
|
|
|
import { MaterialTable } from './MaterialTable';
|
|
|
|
import { ObjectId } from './ObjectId';
|
|
|
|
import { ObjectId, RelevancyType } from './ObjectId';
|
|
|
|
import { PhysicalMaterialRecord } from './PhysicalMaterialRecord';
|
|
|
|
import { PhysicalMaterialRecord } from './PhysicalMaterialRecord';
|
|
|
|
import { SymbolTable } from './SymbolTable';
|
|
|
|
import { SymbolTable } from './SymbolTable';
|
|
|
|
import { SymbolTableRecord } from './SymbolTableRecord';
|
|
|
|
import { SymbolTableRecord } from './SymbolTableRecord';
|
|
|
@ -24,7 +23,10 @@ import { TextureTableRecord } from './Texture';
|
|
|
|
import { TextureTable } from './TextureTable';
|
|
|
|
import { TextureTable } from './TextureTable';
|
|
|
|
import { WblockCloneFiler } from './WblockCloneFiler';
|
|
|
|
import { WblockCloneFiler } from './WblockCloneFiler';
|
|
|
|
|
|
|
|
|
|
|
|
type OwnerContainer = SymbolTable | SymbolTableRecord;
|
|
|
|
interface OwnerContainer
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Add(object: any, isCheckObjectCleanly?: boolean): void;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Factory
|
|
|
|
@Factory
|
|
|
|
export class Database
|
|
|
|
export class Database
|
|
|
@ -205,43 +207,22 @@ export class Database
|
|
|
|
objects: CADObject[],
|
|
|
|
objects: CADObject[],
|
|
|
|
owner: OwnerContainer,
|
|
|
|
owner: OwnerContainer,
|
|
|
|
idMap: IdMaping = new Map(),
|
|
|
|
idMap: IdMaping = new Map(),
|
|
|
|
clonedObjects: CADObject[] = [],
|
|
|
|
|
|
|
|
deferXlation = false
|
|
|
|
deferXlation = false
|
|
|
|
): CADObject[]
|
|
|
|
): CADObject[]
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let f = new DeepCloneFiler();
|
|
|
|
let f = new DeepCloneFiler();
|
|
|
|
f.CloneObjects(objects, clonedObjects);
|
|
|
|
let newObjects: CADObject[] = [];
|
|
|
|
this.CheapClone(f, idMap, owner);
|
|
|
|
for (let e of objects)
|
|
|
|
return clonedObjects;
|
|
|
|
{
|
|
|
|
}
|
|
|
|
let newE = this.DeepCloneObject(f, e, owner, idMap);
|
|
|
|
|
|
|
|
if (newE)
|
|
|
|
|
|
|
|
newObjects.push(newE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CheapClone(f: DeepCloneFiler, idMap: Map<ObjectId, ObjectId>, owner: OwnerContainer)
|
|
|
|
//对于无法新拷贝的实体,指向原先的对象(需要是软拷贝才行)
|
|
|
|
{
|
|
|
|
|
|
|
|
for (let [index, objectId] of f.idMaping)
|
|
|
|
for (let [index, objectId] of f.idMaping)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (objectId.Object)
|
|
|
|
if (!objectId.Object && objectId._RelevancyType === RelevancyType.Soft)
|
|
|
|
{
|
|
|
|
|
|
|
|
objectId.Index = this.idIndex++;
|
|
|
|
|
|
|
|
this.idMap.set(objectId.Index, objectId);
|
|
|
|
|
|
|
|
idMap.set(this.GetObjectId(index), objectId);
|
|
|
|
|
|
|
|
if (owner instanceof BlockTableRecord)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let ent = objectId.Object as Entity;
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let oldId = this.GetObjectId(index);
|
|
|
|
let oldId = this.GetObjectId(index);
|
|
|
|
if (oldId)
|
|
|
|
if (oldId)
|
|
|
@ -251,6 +232,71 @@ export class Database
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.ClearEmptyAssoc(f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return newObjects;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 清理拷贝后的实体空引用
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private ClearEmptyAssoc(f: DeepCloneFiler)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let tempF = new CADFiler();
|
|
|
|
|
|
|
|
tempF.database = this;
|
|
|
|
|
|
|
|
for (let [index, objectId] of f.idMaping)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (objectId.Object && objectId.Index !== index)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
tempF.Clear();
|
|
|
|
|
|
|
|
objectId.Object.WriteFile(tempF);
|
|
|
|
|
|
|
|
tempF.Reset();
|
|
|
|
|
|
|
|
objectId.Object.ReadFile(tempF);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DeepCloneObject(
|
|
|
|
|
|
|
|
filer: DeepCloneFiler,
|
|
|
|
|
|
|
|
object: CADObject,
|
|
|
|
|
|
|
|
owner: OwnerContainer,
|
|
|
|
|
|
|
|
idMap: IdMaping = new Map(),
|
|
|
|
|
|
|
|
): CADObject | undefined
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (idMap.has(object.Id))
|
|
|
|
|
|
|
|
return idMap.get(object.Id).Object;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (owner instanceof SymbolTable)//应该不能直接拷贝这类型的实体,因为会直接名称重复
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
filer.Data.length = 0;
|
|
|
|
|
|
|
|
filer.Reset();
|
|
|
|
|
|
|
|
filer.WriteObject(object);
|
|
|
|
|
|
|
|
let newObject = filer.ReadObject();
|
|
|
|
|
|
|
|
this.AllocationObjectId(newObject);
|
|
|
|
|
|
|
|
owner.Add(newObject, false);
|
|
|
|
|
|
|
|
idMap.set(object.Id, newObject.Id);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//拷贝硬绑定对象
|
|
|
|
|
|
|
|
while (filer.hardObjectIds.size > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let hardObjectIds = filer.hardObjectIds;
|
|
|
|
|
|
|
|
filer.hardObjectIds = new Set();
|
|
|
|
|
|
|
|
for (let idIndex of hardObjectIds)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let objectId = this.GetObjectId(idIndex, false);
|
|
|
|
|
|
|
|
let object = objectId.Object;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!object.Owner)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
console.error("无主?");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(object.Owner instanceof SymbolTable))//指向这个对象的时候,通常是命名的块表记录,所以不拷贝它.
|
|
|
|
|
|
|
|
this.DeepCloneObject(filer, object, object.Owner.Object as unknown as OwnerContainer, idMap);//指向新对象
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return newObject;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -267,19 +313,25 @@ export class Database
|
|
|
|
owner: OwnerContainer,
|
|
|
|
owner: OwnerContainer,
|
|
|
|
idMap: IdMaping,
|
|
|
|
idMap: IdMaping,
|
|
|
|
drc: DuplicateRecordCloning
|
|
|
|
drc: DuplicateRecordCloning
|
|
|
|
)
|
|
|
|
): CADObject[]
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let f = new WblockCloneFiler();
|
|
|
|
let f = new WblockCloneFiler();
|
|
|
|
for (let obj of objects)
|
|
|
|
for (let obj of objects)
|
|
|
|
this.WblockCloneObject(obj, owner, idMap, drc, f);
|
|
|
|
this.WblockCloneObject(obj, owner, idMap, drc, f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.ClearEmptyAssoc(f);
|
|
|
|
|
|
|
|
|
|
|
|
return objects.map(o => idMap.get(o.Id).Object);
|
|
|
|
return objects.map(o => idMap.get(o.Id).Object);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 克隆引用对象 WriteHardObjectId
|
|
|
|
* 克隆引用对象 WriteHardObjectId
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private WblockCloneReferenceObject(object: CADObject, f: WblockCloneFiler, idMap: Map<ObjectId, ObjectId>, drc: DuplicateRecordCloning)
|
|
|
|
private WblockCloneReferenceObject(
|
|
|
|
|
|
|
|
object: CADObject,
|
|
|
|
|
|
|
|
f: WblockCloneFiler,
|
|
|
|
|
|
|
|
idMap: Map<ObjectId, ObjectId>,
|
|
|
|
|
|
|
|
drc: DuplicateRecordCloning)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let oldData = f.Data;
|
|
|
|
let oldData = f.Data;
|
|
|
|
f.Data = [];
|
|
|
|
f.Data = [];
|
|
|
|