mirror of https://gitee.com/cf-fz/WebCAD.git
parent
2438a0dd92
commit
2a9677a89f
@ -0,0 +1,444 @@
|
||||
|
||||
import * as THREE from 'three';
|
||||
|
||||
/*
|
||||
关于webCAD 文件系统的原型.
|
||||
包括了对象的保存,撤销,还原.
|
||||
|
||||
对象的绘制 更新.
|
||||
|
||||
对象ID更新 引用
|
||||
|
||||
材质字典
|
||||
|
||||
关于对象的撤销和重做设计.
|
||||
|
||||
对象池
|
||||
|
||||
增量保存
|
||||
|
||||
|
||||
1.应该能够新增和删除图元.
|
||||
2.新增删除图元应该是可以撤销和重做的.
|
||||
3.图元更改是可以撤销和重做的.
|
||||
4.命令事务一致性,事物可以提交也可以取消.
|
||||
5.数据保存和还原
|
||||
6.对象引用应该是可以复制到新图纸的.
|
||||
|
||||
|
||||
创建对象如何撤销和重做?
|
||||
db.AppendEntity(ent);
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 所有cad对象的基类
|
||||
*
|
||||
* @class CADObject
|
||||
*/
|
||||
class CADObject
|
||||
{
|
||||
/**
|
||||
*
|
||||
* 局部撤销
|
||||
*
|
||||
* @param {number} type
|
||||
* @param {*} data
|
||||
* @memberof CADObject
|
||||
*/
|
||||
ApplyPartialUndo(type: number, data: any)
|
||||
{
|
||||
}
|
||||
|
||||
DataIn(data)
|
||||
{
|
||||
|
||||
}
|
||||
DataOut()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cad文件数据
|
||||
*
|
||||
* @class CADFile
|
||||
*/
|
||||
class CADFile
|
||||
{
|
||||
databaseData; //图纸数据
|
||||
objectDataCol: any[]; //对象集合
|
||||
}
|
||||
|
||||
class HistoricManage
|
||||
{
|
||||
curIndex: number; //当前执行位置
|
||||
historicRecord: CommandHistoricRecord[];//历史记录
|
||||
}
|
||||
|
||||
//命令历史记录集合
|
||||
class CommandHistoricRecord
|
||||
{
|
||||
//命令名称
|
||||
commandName: string;
|
||||
//历史记录表
|
||||
historicCol: CommandHistoricRecord[];
|
||||
}
|
||||
|
||||
//历史记录
|
||||
class HistoricRecord
|
||||
{
|
||||
objectId: number;
|
||||
undoData: any;
|
||||
redoData: any;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @class HistoryManager
|
||||
*/
|
||||
class HistoryManager extends CADObject
|
||||
{
|
||||
|
||||
private curUndoIndex = -1;
|
||||
//命令撤销数据列表
|
||||
commandUndoData: { cmdName: string, undoData: Map<CADObject, UndoFile> }[] = [];
|
||||
|
||||
get UndoData(): Map<CADObject, UndoFile>
|
||||
{
|
||||
if (this.commandUndoData.length == 0)
|
||||
{
|
||||
this.startCmd("");
|
||||
}
|
||||
return this.commandUndoData[this.commandUndoData.length - 1].undoData;
|
||||
}
|
||||
|
||||
startCmd(cmdName: string)
|
||||
{
|
||||
this.commandUndoData.splice(this.curUndoIndex, this.commandUndoData.length - this.curUndoIndex);
|
||||
this.commandUndoData.push({ cmdName: "", undoData: new Map<CADObject, UndoFile>() });
|
||||
this.curUndoIndex = this.commandUndoData.length - 1;
|
||||
}
|
||||
|
||||
Undo(cout: number)
|
||||
{
|
||||
let undoFile = this.commandUndoData[this.curUndoIndex];
|
||||
if (!undoFile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (let [obj, data] of undoFile.undoData)
|
||||
{
|
||||
for (let i = data.m_UndoDataList.length; i--;)
|
||||
{
|
||||
let d = data.m_UndoDataList[i];
|
||||
obj.ApplyPartialUndo(d.type, d.undoData);
|
||||
}
|
||||
}
|
||||
this.curUndoIndex--;
|
||||
}
|
||||
Redo(cout: number)
|
||||
{
|
||||
let undoFile = this.commandUndoData[this.curUndoIndex + 1];
|
||||
if (!undoFile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (let [obj, data] of undoFile.undoData)
|
||||
{
|
||||
for (let d of data.m_UndoDataList)
|
||||
{
|
||||
obj.ApplyPartialUndo(d.type, d.redoData);
|
||||
}
|
||||
}
|
||||
this.curUndoIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
class Database
|
||||
{
|
||||
|
||||
//块表记录
|
||||
blockTableCol: BlockTableRecord[];
|
||||
//材质字典
|
||||
}
|
||||
|
||||
|
||||
|
||||
class BlockTableRecord extends CADObject
|
||||
{
|
||||
//对象池. 管理所有的对象
|
||||
objectMap = new Map<number, CADObject>();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @class UndoFile
|
||||
*/
|
||||
class UndoFile
|
||||
{
|
||||
m_UndoDataList: UndoData[] = [];
|
||||
}
|
||||
|
||||
interface UndoData
|
||||
{
|
||||
type: number;
|
||||
undoData: any;
|
||||
redoData: any;
|
||||
userData?: any;
|
||||
}
|
||||
|
||||
|
||||
|
||||
enum EntityUndoType
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
interface EntityData
|
||||
{
|
||||
id: number;
|
||||
isErase: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 所有图元的基类
|
||||
*
|
||||
* @class Entity
|
||||
*/
|
||||
class Entity extends CADObject
|
||||
{
|
||||
protected m_Data: EntityData;
|
||||
m_Db: HistoryManager;
|
||||
constructor()
|
||||
{
|
||||
super();
|
||||
this.m_Data = {
|
||||
id: -1,
|
||||
isErase: false
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
get UndoFile(): UndoFile
|
||||
{
|
||||
if (this.m_Db)
|
||||
{
|
||||
let undoData = this.m_Db.UndoData;
|
||||
if (!undoData.has(this))
|
||||
{
|
||||
undoData.set(this, new UndoFile());
|
||||
}
|
||||
return undoData.get(this);
|
||||
}
|
||||
}
|
||||
|
||||
WriteUndoData(data: UndoData)
|
||||
{
|
||||
let undoFile = this.UndoFile;
|
||||
if (undoFile)
|
||||
{
|
||||
undoFile.m_UndoDataList.push(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 直线撤销类型
|
||||
*
|
||||
* @enum {number}
|
||||
*/
|
||||
enum LineUndoType
|
||||
{
|
||||
Full = 0,
|
||||
StartPoint = 1,
|
||||
EndPoint = 2,
|
||||
}
|
||||
|
||||
//
|
||||
interface LineData extends EntityData
|
||||
{
|
||||
startPoint: number[];
|
||||
endPoint: number[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 直线对象
|
||||
*
|
||||
* @class Line
|
||||
*/
|
||||
class Line extends Entity
|
||||
{
|
||||
protected m_Data: LineData;
|
||||
constructor()
|
||||
{
|
||||
super();
|
||||
this.m_Data.startPoint = [0, 0, 0];
|
||||
this.m_Data.endPoint = [0, 0, 0];
|
||||
}
|
||||
get StartPoint(): number[]
|
||||
{
|
||||
return this.m_Data.startPoint;
|
||||
}
|
||||
set StartPoint(value: number[])
|
||||
{
|
||||
this.WriteUndoData({
|
||||
type: LineUndoType.StartPoint,
|
||||
undoData: { startPoint: this.m_Data.startPoint },
|
||||
redoData: { startPoint: value }
|
||||
});
|
||||
this.m_Data.startPoint = value;
|
||||
}
|
||||
|
||||
ApplyPartialUndo(type, data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case LineUndoType.Full:
|
||||
break;
|
||||
case LineUndoType.StartPoint:
|
||||
this.m_Data.startPoint = data.startPoint;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 图纸绘制适配器,使用适配器绘制对象图元.
|
||||
*
|
||||
* @class EentiyDrawAdapter
|
||||
*/
|
||||
class EentiyDrawAdapter
|
||||
{
|
||||
Draw()
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 直线的绘制适配
|
||||
*
|
||||
* @class LineAdapter
|
||||
* @extends {EentiyDrawAdapter}
|
||||
*/
|
||||
class LineAdapter extends EentiyDrawAdapter
|
||||
{
|
||||
Draw()
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
|
||||
Update(type: number)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case LineUndoType.Full:
|
||||
break;
|
||||
case LineUndoType.StartPoint:
|
||||
break;
|
||||
case LineUndoType.EndPoint:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let line = new Line();
|
||||
|
||||
console.log(line);
|
||||
|
||||
line.StartPoint = [1, 2, 3];
|
||||
|
||||
console.log(line);
|
||||
|
||||
|
||||
let db = new HistoryManager();
|
||||
|
||||
line.m_Db = db;
|
||||
|
||||
|
||||
line.StartPoint = [3, 3, 3];
|
||||
|
||||
line.StartPoint = [3, 3, 5];
|
||||
|
||||
line.StartPoint = [12, 3, 5];
|
||||
|
||||
db.Undo(1);
|
||||
|
||||
console.log(line.StartPoint);
|
||||
|
||||
db.Redo(1);
|
||||
|
||||
db.startCmd("");
|
||||
|
||||
console.log(line.StartPoint);
|
||||
|
||||
|
||||
|
||||
|
||||
function per()
|
||||
{
|
||||
for (let i = 0; i < 5000; i++)
|
||||
{
|
||||
new Line();
|
||||
}
|
||||
}
|
||||
|
||||
function per2()
|
||||
{
|
||||
for (let i = 0; i < 5000; i++)
|
||||
{
|
||||
|
||||
line.StartPoint = [3, 3, 3];
|
||||
|
||||
// console.log(line);
|
||||
// line.StartPoint = [3, 3, 5];
|
||||
|
||||
line.StartPoint = [12, 3, 5];
|
||||
// console.log(line);
|
||||
|
||||
// console.log(db.commandUndoData);
|
||||
|
||||
db.Undo(1);
|
||||
|
||||
// console.log(line);
|
||||
|
||||
db.Redo(1);
|
||||
|
||||
db.startCmd("");
|
||||
|
||||
// console.log(line.StartPoint);
|
||||
}
|
||||
}
|
||||
|
||||
// per();/*?.*/
|
||||
// per2();/*?.*/
|
||||
// per2();/*?.*/
|
||||
// per2();/*?.*/
|
||||
// per2();/*?.*/
|
||||
|
||||
// // console.log(3);
|
||||
|
||||
let undoManage = new HistoricManage();
|
||||
|
||||
let l = new Line();
|
||||
|
||||
let ms = new BlockTableRecord();
|
||||
|
Loading…
Reference in new issue