|
|
|
@ -137,6 +137,8 @@ class CADObject
|
|
|
|
|
{
|
|
|
|
|
return this._db;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//对象在加入数据库时,必须指定一个源数据库,否则无法读取引用id.
|
|
|
|
|
SetDefaultDb(db: Database)
|
|
|
|
|
{
|
|
|
|
|
if (!this._db)
|
|
|
|
@ -256,6 +258,10 @@ class ObjectId
|
|
|
|
|
this.obj = obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get IsErase(): boolean
|
|
|
|
|
{
|
|
|
|
|
return !this.obj || this.obj.IsErase;
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
创建一个id, 如果db中已经存在id,那么自动获得该id,如果不存在,new一个新的id,并且加入到db中
|
|
|
|
|
该方法的使用场景:
|
|
|
|
@ -264,12 +270,12 @@ class ObjectId
|
|
|
|
|
3.对象redo创建时
|
|
|
|
|
4.引用读取时
|
|
|
|
|
*/
|
|
|
|
|
static Create(db: Database, index: number): ObjectId
|
|
|
|
|
static Create(db: Database, index: number, obj: CADObject): ObjectId
|
|
|
|
|
{
|
|
|
|
|
let id = db.GetObjectId(index);
|
|
|
|
|
if (!id)
|
|
|
|
|
{
|
|
|
|
|
id = new ObjectId(index);
|
|
|
|
|
id = new ObjectId(index, obj);
|
|
|
|
|
db.SetObjectId(index, id);
|
|
|
|
|
}
|
|
|
|
|
return id;
|
|
|
|
@ -373,7 +379,7 @@ class AppendData extends CADObject
|
|
|
|
|
class RemoveData extends CADObject
|
|
|
|
|
{
|
|
|
|
|
private index: number;
|
|
|
|
|
constructor(index: number)
|
|
|
|
|
constructor(index?: number)
|
|
|
|
|
{
|
|
|
|
|
super();
|
|
|
|
|
this.index = index;
|
|
|
|
@ -426,10 +432,13 @@ class ObjectCollection<T> extends CADObject
|
|
|
|
|
|
|
|
|
|
this._db.hm.UndoData.WriteObjectHistoryPath(this, hisRec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return obj.Id;
|
|
|
|
|
}
|
|
|
|
|
Remove(obj: CADObject)
|
|
|
|
|
{
|
|
|
|
|
ArrayRemove(this.objectCol, obj);
|
|
|
|
|
obj.Erase();
|
|
|
|
|
if (this._db && this._db.hm.UndoData)
|
|
|
|
|
{
|
|
|
|
|
let hisRec = new HistoricRecord();
|
|
|
|
@ -444,6 +453,12 @@ class ObjectCollection<T> extends CADObject
|
|
|
|
|
return this.objectCol.length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//迭代器
|
|
|
|
|
Entries()
|
|
|
|
|
{
|
|
|
|
|
return this.objectCol.entries;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//#region -----------------------------File-----------------------------
|
|
|
|
|
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
|
|
|
|
|
//类名,保证序列化时得到正确的new
|
|
|
|
@ -463,6 +478,7 @@ class ObjectCollection<T> extends CADObject
|
|
|
|
|
if (undoData instanceof AppendData)
|
|
|
|
|
{
|
|
|
|
|
let obj = undoData.getObject(this._db);
|
|
|
|
|
this.objectCol.push(obj);
|
|
|
|
|
}
|
|
|
|
|
else if (undoData instanceof RemoveData)
|
|
|
|
|
{
|
|
|
|
@ -613,7 +629,7 @@ class Database
|
|
|
|
|
constructor()
|
|
|
|
|
{
|
|
|
|
|
this.ModelSpace = new BlockTableRecord();
|
|
|
|
|
this.ModelSpace.SetDefaultDb(this);
|
|
|
|
|
this.ModelSpace.InitObjectId(this);
|
|
|
|
|
this.hm = new HistoricManage();
|
|
|
|
|
this.hm.SetDefaultDb(this);
|
|
|
|
|
}
|
|
|
|
@ -646,7 +662,7 @@ class Database
|
|
|
|
|
if (obj.Db === this)
|
|
|
|
|
{
|
|
|
|
|
this.idCout++;
|
|
|
|
|
let id = ObjectId.Create(this, this.idCout);
|
|
|
|
|
let id = ObjectId.Create(this, this.idCout, obj);
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -706,18 +722,6 @@ class BlockTableRecord extends ObjectCollection<Entity>
|
|
|
|
|
super.ApplyPartialUndo(file);
|
|
|
|
|
}
|
|
|
|
|
//#endregion-----------------------------File End-----------------------------
|
|
|
|
|
AppendEntity(ent: Entity): ObjectId
|
|
|
|
|
{
|
|
|
|
|
if (ent.Db)
|
|
|
|
|
{
|
|
|
|
|
console.warn("同一个对象无法重复加入图纸中!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.Append(ent);
|
|
|
|
|
return ent.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//所有图元的基类
|
|
|
|
|
class Entity extends CADObject
|
|
|
|
@ -788,42 +792,59 @@ class Line extends Entity
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CADFactory.RegisterObject(Line);
|
|
|
|
|
|
|
|
|
|
let db = new Database();
|
|
|
|
|
|
|
|
|
|
let l = CADFactory.CreateObject("Line") as Line;
|
|
|
|
|
console.log(l);
|
|
|
|
|
CADFactory.RegisterObject(Line);
|
|
|
|
|
|
|
|
|
|
l.StartPoint = new Vector3(0, 1, 0);
|
|
|
|
|
let id = db.ModelSpace.AppendEntity(l);
|
|
|
|
|
db.GetObjectId(0).Object.ClassName /*?*/
|
|
|
|
|
test('工厂构造实体', () =>
|
|
|
|
|
{
|
|
|
|
|
let l = CADFactory.CreateObject("Line") as Line;
|
|
|
|
|
|
|
|
|
|
console.log(id);
|
|
|
|
|
expect(l != undefined).toBeTruthy();
|
|
|
|
|
expect(l.ClassName).toBe("Line");
|
|
|
|
|
expect(l.Id).toBeUndefined();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function createLine()
|
|
|
|
|
test('id分配', () =>
|
|
|
|
|
{
|
|
|
|
|
for (let i = 0; i < 5000; i++)
|
|
|
|
|
{
|
|
|
|
|
let l = CADFactory.CreateObject("Line") as Line;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let db = new Database();
|
|
|
|
|
let line = new Line();
|
|
|
|
|
let id = db.ModelSpace.Append(line);
|
|
|
|
|
|
|
|
|
|
test('create line', () =>
|
|
|
|
|
{
|
|
|
|
|
expect(id != undefined).toBeTruthy();
|
|
|
|
|
expect(id.Object === line).toBeTruthy();
|
|
|
|
|
|
|
|
|
|
db.hm.Undo();
|
|
|
|
|
|
|
|
|
|
expect(id.IsErase).toBeTruthy();
|
|
|
|
|
expect(db.ModelSpace.Cout()).toBe(0);
|
|
|
|
|
|
|
|
|
|
db.hm.Redo();
|
|
|
|
|
|
|
|
|
|
expect(db.ModelSpace.Cout()).toBe(1);
|
|
|
|
|
expect(!id.IsErase).toBeTruthy();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// createLine(); //?.
|
|
|
|
|
|
|
|
|
|
// function createLine()
|
|
|
|
|
// {
|
|
|
|
|
// for (let i = 0; i < 5000; i++)
|
|
|
|
|
// {
|
|
|
|
|
// let l = CADFactory.CreateObject("Line") as Line;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
function undoRedo()
|
|
|
|
|
{
|
|
|
|
|
for (let i = 0; i < 5000; i++)
|
|
|
|
|
{
|
|
|
|
|
db.hm.Undo();
|
|
|
|
|
db.hm.Redo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// // createLine(); //?.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// function undoRedo()
|
|
|
|
|
// {
|
|
|
|
|
// for (let i = 0; i < 5000; i++)
|
|
|
|
|
// {
|
|
|
|
|
// db.hm.Undo();
|
|
|
|
|
// db.hm.Redo();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// undoRedo(); //?.
|
|
|
|
|
// // undoRedo(); //?.
|
|
|
|
|