分离db层的实体代码,加入材质和贴图类.

pull/7/head
ChenX 7 years ago
parent 4523d0e1d7
commit 75b28fe307

@ -4,22 +4,20 @@ exports[`changev 1`] = `"[1,[\\"BlockTableRecord\\",1,0,1,[\\"Line\\",1,2,1,[2,3
exports[`创建 修改 撤销撤销 重做重做 撤销 重做 1`] = `"[1,[\\"BlockTableRecord\\",1,0,1,[\\"Line\\",1,2,1,[1,2,3],[0,0,0]]],[\\"MaerialTableRecord\\",1,1,0]]"`;
exports[`创建 修改 撤销撤销 重做重做 撤销 重做 2`] = `"[1,1,2,[\\"CommandHistoryRecord\\",1,\\"\\",1,0,1,[\\"HistorycRecord\\",1,[\\"RemoveObjectData\\",1,0],[\\"CreateObjectData\\",1,[[\\"Line\\",1,2,1,[0,0,0],[0,0,0]]]],\\"\\"]],[\\"CommandHistoryRecord\\",1,\\"U\\",1,2,1,[\\"ObjectAllDataHistoryRecord\\",1,[\\"AllObjectData\\",1,-1,1,[1,2,1,[0,0,0],[0,0,0]]],[\\"AllObjectData\\",1,-1,1,[1,2,1,[1,2,3],[0,0,0]]],\\"\\"]]]"`;
exports[`创建 修改 撤销撤销 重做重做 撤销 重做 2`] = `"[[\\"HistoricManage\\",1,1,2,[\\"CommandHistoryRecord\\",1,\\"\\",1,0,1,[\\"HistorycRecord\\",1,[\\"RemoveObjectData\\",1,0],[\\"CreateObjectData\\",1,[[\\"Line\\",1,2,1,[0,0,0],[0,0,0]]]],\\"\\"]],[\\"CommandHistoryRecord\\",1,\\"U\\",1,2,1,[\\"ObjectAllDataHistoryRecord\\",1,[\\"AllObjectData\\",1,-1,1,[1,2,1,[0,0,0],[0,0,0]]],[\\"AllObjectData\\",1,-1,1,[1,2,1,[1,2,3],[0,0,0]]],\\"\\"]]]]"`;
exports[`测试创建 1`] = `"[1,-1,1,[]]"`;
exports[`测试创建 1`] = `"[[\\"AllObjectData\\",1,-1,1,[]]]"`;
exports[`测试创建 2`] = `"[1,-1,0]"`;
exports[`测试创建 2`] = `"[[\\"BlockTableRecord\\",1,-1,0]]"`;
exports[`测试创建 3`] = `"[1,null,0]"`;
exports[`测试创建 3`] = `"[[\\"CommandHistoryRecord\\",1,null,0]]"`;
exports[`测试创建 4`] = `"[1,[]]"`;
exports[`测试创建 4`] = `"[[\\"CreateObjectData\\",1,[]]]"`;
exports[`测试创建 5`] = `"[1,\\"\\",\\"\\",\\"\\"]"`;
exports[`测试创建 5`] = `"[[\\"HistorycRecord\\",1,\\"\\",\\"\\",\\"\\"]]"`;
exports[`测试创建 6`] = `"[1,-1,1,[0,0,0],[0,0,0]]"`;
exports[`测试创建 6`] = `"[[\\"Line\\",1,-1,1,[0,0,0],[0,0,0]]]"`;
exports[`测试创建 7`] = `"[1,\\"\\",\\"\\",\\"\\"]"`;
exports[`测试创建 7`] = `"[[\\"ObjectAllDataHistoryRecord\\",1,\\"\\",\\"\\",\\"\\"]]"`;
exports[`测试创建 8`] = `"[1,null]"`;
exports[`测试创建 9`] = `"[1,-1]"`;
exports[`测试创建 8`] = `"[[\\"RemoveObjectData\\",1,null]]"`;

@ -1,27 +1,21 @@
import { Vector3 } from 'three';
import * as THREE from 'three';
import
{
AllObjectData,
BlockTableRecord,
CADFactory,
CADFile,
CADObject,
CommandHistoryRecord,
CreateObjectData,
Database,
HistorycRecord,
Line,
ObjectAllDataHistoryRecord,
RemoveObjectData,
} from '../../src/DatabaseServices/FileSystem';
import { ColorMaterial } from '../../src/Common/ColorPalette';
import { BlockTableRecord } from '../../src/DatabaseServices/BlockTableRecord';
import { CADFactory } from '../../src/DatabaseServices/CADFactory';
import { CADFile } from '../../src/DatabaseServices/CADFile';
import { CommandHistoryRecord } from '../../src/DatabaseServices/CommandHistoryRecord';
import { CreateObjectData } from '../../src/DatabaseServices/CreateObjectData';
import { Database } from '../../src/DatabaseServices/Database';
import { HistorycRecord } from '../../src/DatabaseServices/HistorycRecord';
import { Line } from '../../src/DatabaseServices/Line';
import { ObjectAllDataHistoryRecord } from '../../src/DatabaseServices/ObjectAllDataHistoryRecord';
import { RemoveObjectData } from '../../src/DatabaseServices/RemoveObjectData';
import { CADObject, AllObjectData } from '../../src/DatabaseServices/CADObject';
function CadObjectToString(obj: CADObject)
{
let file = new CADFile();
obj.WriteFile(file);
file.WriteObject(obj)
return file.ToString();
}
@ -35,11 +29,13 @@ test('测试创建', () =>
Line,
ObjectAllDataHistoryRecord,
RemoveObjectData,
CADObject])
])
{
console.log(C);
//确保每个对象都被正确的创建
let obj = CADFactory.CreateObject(C.name /*?*/);
let str = CadObjectToString(obj);
console.log(obj.constructor.name);
expect(str).toMatchSnapshot();
//确保对象正确的反序列化
@ -85,7 +81,7 @@ test('clone object', () =>
let db = new Database();
let line = new Line();
db.ModelSpace.Append(line);
line.StartPoint = new Vector3(9, 9, 8);
line.StartPoint = new THREE.Vector3(9, 9, 8);
CadObjectToString(line)/*?*/
@ -109,7 +105,7 @@ test('changev', () =>
expect(id.Object !== l1).toBeTruthy(); //创建对象的撤销和重做后 id指向了新的实体
(id.Object as Line).StartPoint = new Vector3(2, 3, 4);
(id.Object as Line).StartPoint = new THREE.Vector3(2, 3, 4);
let file = db.FileWrite();
expect(file.ToString()/*?*/).toMatchSnapshot();
@ -135,15 +131,15 @@ test('xxx', () =>
db.hm.Redo(); //?
// db.hm.StartCmd("");
(id1.Object as Line).StartPoint = new Vector3(10, 4, 2);
(id1.Object as Line).EndPoint = new Vector3(2, 2, 2);
(id1.Object as Line).StartPoint = new THREE.Vector3(10, 4, 2);
(id1.Object as Line).EndPoint = new THREE.Vector3(2, 2, 2);
let file = db.FileWrite();
console.log(file.ToString());
db.hm.StartCmd("");
(id1.Object as Line).StartPoint = new Vector3(100, 300, 400);
(id1.Object as Line).EndPoint = new Vector3(2000, 3000, 4000);
(id1.Object as Line).StartPoint = new THREE.Vector3(100, 300, 400);
(id1.Object as Line).EndPoint = new THREE.Vector3(2000, 3000, 4000);
db.hm.Undo();
@ -171,7 +167,7 @@ test('创建 修改 撤销撤销 重做重做 撤销 重做', () =>
let line = new Line();
let id = db.ModelSpace.Append(line);
db.hm.StartCmd("U");
line.StartPoint = new Vector3(1, 2, 3);
line.StartPoint = new THREE.Vector3(1, 2, 3);
db.hm.EndCmd();
db.hm.Undo(); /*?*/

422
package-lock.json generated

@ -125,9 +125,9 @@
}
},
"acorn": {
"version": "5.1.2",
"resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.1.2.tgz",
"integrity": "sha1-kRy1PgNoB88Pp3jcXTcPvYZCRtc=",
"version": "5.3.0",
"resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.3.0.tgz",
"integrity": "sha1-dEbTlFnFT7SagObuZHgUm5QOyCI=",
"dev": true
},
"acorn-dynamic-import": {
@ -227,9 +227,9 @@
}
},
"ajv-keywords": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz",
"integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=",
"version": "2.1.1",
"resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz",
"integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
"dev": true
},
"align-text": {
@ -546,22 +546,14 @@
"dev": true
},
"asn1.js": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
"integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=",
"version": "4.9.2",
"resolved": "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.9.2.tgz",
"integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=",
"dev": true,
"requires": {
"bn.js": "4.11.8",
"inherits": "2.0.3",
"minimalistic-assert": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"assert": {
@ -1451,9 +1443,9 @@
}
},
"browserify-aes": {
"version": "1.1.0",
"resolved": "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.1.0.tgz",
"integrity": "sha1-HSrWKotHnyPwq2McG+hqgtvMvkg=",
"version": "1.1.1",
"resolved": "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.1.1.tgz",
"integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=",
"dev": true,
"requires": {
"buffer-xor": "1.0.3",
@ -1462,14 +1454,6 @@
"evp_bytestokey": "1.0.3",
"inherits": "2.0.3",
"safe-buffer": "5.1.1"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"browserify-cipher": {
@ -1478,7 +1462,7 @@
"integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
"dev": true,
"requires": {
"browserify-aes": "1.1.0",
"browserify-aes": "1.1.1",
"browserify-des": "1.0.0",
"evp_bytestokey": "1.0.3"
}
@ -1492,14 +1476,6 @@
"cipher-base": "1.0.4",
"des.js": "1.0.0",
"inherits": "2.0.3"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"browserify-rsa": {
@ -1525,23 +1501,15 @@
"elliptic": "6.4.0",
"inherits": "2.0.3",
"parse-asn1": "5.1.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"browserify-zlib": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
"integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
"version": "0.2.0",
"resolved": "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz",
"integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
"dev": true,
"requires": {
"pako": "0.2.9"
"pako": "1.0.6"
}
},
"browserslist": {
@ -1764,14 +1732,6 @@
"requires": {
"inherits": "2.0.3",
"safe-buffer": "5.1.1"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"clap": {
@ -2015,6 +1975,12 @@
"integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
"dev": true
},
"co": {
"version": "4.6.0",
"resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
},
"coa": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
@ -2408,14 +2374,6 @@
"inherits": "2.0.3",
"ripemd160": "2.0.1",
"sha.js": "2.4.9"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"create-hmac": {
@ -2430,14 +2388,6 @@
"ripemd160": "2.0.1",
"safe-buffer": "5.1.1",
"sha.js": "2.4.9"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"cross-spawn": {
@ -2461,9 +2411,9 @@
}
},
"crypto-browserify": {
"version": "3.11.1",
"resolved": "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.11.1.tgz",
"integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=",
"version": "3.12.0",
"resolved": "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz",
"integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
"dev": true,
"requires": {
"browserify-cipher": "1.0.0",
@ -2475,15 +2425,8 @@
"inherits": "2.0.3",
"pbkdf2": "3.0.14",
"public-encrypt": "4.0.0",
"randombytes": "2.0.5"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
"randombytes": "2.0.5",
"randomfill": "1.0.3"
}
},
"crypto-random-string": {
@ -2792,7 +2735,7 @@
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"dev": true,
"requires": {
"es5-ext": "0.10.35"
"es5-ext": "0.10.37"
}
},
"dashdash": {
@ -2966,14 +2909,6 @@
"requires": {
"inherits": "2.0.3",
"minimalistic-assert": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"destroy": {
@ -3174,14 +3109,6 @@
"inherits": "2.0.3",
"minimalistic-assert": "1.0.0",
"minimalistic-crypto-utils": "1.0.1"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"emojis-list": {
@ -3265,9 +3192,9 @@
}
},
"es5-ext": {
"version": "0.10.35",
"resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.35.tgz",
"integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=",
"version": "0.10.37",
"resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.37.tgz",
"integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
"dev": true,
"requires": {
"es6-iterator": "2.0.3",
@ -3281,7 +3208,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35",
"es5-ext": "0.10.37",
"es6-symbol": "3.1.1"
}
},
@ -3292,7 +3219,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35",
"es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-set": "0.1.5",
"es6-symbol": "3.1.1",
@ -3306,7 +3233,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35",
"es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1",
"event-emitter": "0.3.5"
@ -3319,7 +3246,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35"
"es5-ext": "0.10.37"
}
},
"es6-templates": {
@ -3339,7 +3266,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35",
"es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1"
}
@ -3445,7 +3372,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
"es5-ext": "0.10.35"
"es5-ext": "0.10.37"
}
},
"eventemitter3": {
@ -3929,6 +3856,12 @@
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
"dev": true
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
@ -4672,14 +4605,6 @@
"dev": true,
"requires": {
"inherits": "2.0.3"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"hash.js": {
@ -4690,14 +4615,6 @@
"requires": {
"inherits": "2.0.3",
"minimalistic-assert": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"hawk": {
@ -5314,9 +5231,9 @@
}
},
"https-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
"integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
"version": "1.0.0",
"resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
"https-proxy-agent": {
@ -5577,9 +5494,9 @@
}
},
"interpret": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz",
"integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=",
"version": "1.1.0",
"resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
"dev": true
},
"invariant": {
@ -8812,12 +8729,6 @@
"inherits": "2.0.3",
"safe-buffer": "5.1.1"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
@ -9204,21 +9115,21 @@
"dev": true
},
"node-libs-browser": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz",
"integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=",
"version": "2.1.0",
"resolved": "http://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.1.0.tgz",
"integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=",
"dev": true,
"requires": {
"assert": "1.4.1",
"browserify-zlib": "0.1.4",
"browserify-zlib": "0.2.0",
"buffer": "4.9.1",
"console-browserify": "1.1.0",
"constants-browserify": "1.0.0",
"crypto-browserify": "3.11.1",
"crypto-browserify": "3.12.0",
"domain-browser": "1.1.7",
"events": "1.1.1",
"https-browserify": "0.0.1",
"os-browserify": "0.2.1",
"https-browserify": "1.0.0",
"os-browserify": "0.3.0",
"path-browserify": "0.0.0",
"process": "0.11.10",
"punycode": "1.4.1",
@ -9226,20 +9137,12 @@
"readable-stream": "2.3.3",
"stream-browserify": "2.0.1",
"stream-http": "2.7.2",
"string_decoder": "0.10.31",
"string_decoder": "1.0.3",
"timers-browserify": "2.0.4",
"tty-browserify": "0.0.0",
"url": "0.11.0",
"util": "0.10.3",
"vm-browserify": "0.0.4"
},
"dependencies": {
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
}
}
},
"node-notifier": {
@ -9565,9 +9468,9 @@
}
},
"os-browserify": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz",
"integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=",
"version": "0.3.0",
"resolved": "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz",
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
"os-homedir": {
@ -9647,9 +9550,9 @@
}
},
"pako": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
"integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
"version": "1.0.6",
"resolved": "http://registry.npm.taobao.org/pako/download/pako-1.0.6.tgz",
"integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=",
"dev": true
},
"param-case": {
@ -9667,8 +9570,8 @@
"integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
"dev": true,
"requires": {
"asn1.js": "4.9.1",
"browserify-aes": "1.1.0",
"asn1.js": "4.9.2",
"browserify-aes": "1.1.1",
"create-hash": "1.1.3",
"evp_bytestokey": "1.0.3",
"pbkdf2": "3.0.14"
@ -10802,6 +10705,16 @@
"safe-buffer": "5.1.1"
}
},
"randomfill": {
"version": "1.0.3",
"resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.3.tgz",
"integrity": "sha1-uWt99YfwHdkXJsQY8wVTsUGOPWI=",
"dev": true,
"requires": {
"randombytes": "2.0.5",
"safe-buffer": "5.1.1"
}
},
"range-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
@ -11414,14 +11327,6 @@
"requires": {
"hash-base": "2.0.2",
"inherits": "2.0.3"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"safe-buffer": {
@ -11642,14 +11547,6 @@
"requires": {
"inherits": "2.0.3",
"safe-buffer": "5.1.1"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"shebang-command": {
@ -12093,14 +11990,6 @@
"requires": {
"inherits": "2.0.3",
"readable-stream": "2.3.3"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"stream-http": {
@ -12114,14 +12003,6 @@
"readable-stream": "2.3.3",
"to-arraybuffer": "1.0.1",
"xtend": "4.0.1"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
}
}
},
"strict-uri-encode": {
@ -13134,6 +13015,61 @@
}
}
},
"ts-loader": {
"version": "3.2.0",
"resolved": "http://registry.npm.taobao.org/ts-loader/download/ts-loader-3.2.0.tgz",
"integrity": "sha1-IyEZIhebgfdEh1S3/fykW4N0oVo=",
"dev": true,
"requires": {
"chalk": "2.3.0",
"enhanced-resolve": "3.3.0",
"loader-utils": "1.1.0",
"semver": "5.4.1"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.0",
"resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz",
"integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=",
"dev": true,
"requires": {
"color-convert": "1.9.0"
}
},
"chalk": {
"version": "2.3.0",
"resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
"integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
"dev": true,
"requires": {
"ansi-styles": "3.2.0",
"escape-string-regexp": "1.0.5",
"supports-color": "4.5.0"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "2.0.0",
"resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
"supports-color": {
"version": "4.5.0",
"resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz",
"integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
"dev": true,
"requires": {
"has-flag": "2.0.0"
}
}
}
},
"tslib": {
"version": "1.8.0",
"resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.8.0.tgz",
@ -14300,17 +14236,6 @@
"async": "2.5.0",
"chokidar": "1.7.0",
"graceful-fs": "4.1.11"
},
"dependencies": {
"async": {
"version": "2.5.0",
"resolved": "http://registry.npm.taobao.org/async/download/async-2.5.0.tgz",
"integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=",
"dev": true,
"requires": {
"lodash": "4.17.4"
}
}
}
},
"wbuf": {
@ -14338,26 +14263,26 @@
"dev": true
},
"webpack": {
"version": "3.8.1",
"resolved": "http://registry.npm.taobao.org/webpack/download/webpack-3.8.1.tgz",
"integrity": "sha1-sWloqBEAq+YWCLAVPJFZ74uyvYM=",
"version": "3.10.0",
"resolved": "http://registry.npm.taobao.org/webpack/download/webpack-3.10.0.tgz",
"integrity": "sha1-UpG4dQeM8qv0K90jr+P4+WwX1yU=",
"dev": true,
"requires": {
"acorn": "5.1.2",
"acorn": "5.3.0",
"acorn-dynamic-import": "2.0.2",
"ajv": "5.2.3",
"ajv-keywords": "2.1.0",
"ajv": "5.5.2",
"ajv-keywords": "2.1.1",
"async": "2.5.0",
"enhanced-resolve": "3.4.1",
"escope": "3.6.0",
"interpret": "1.0.4",
"interpret": "1.1.0",
"json-loader": "0.5.7",
"json5": "0.5.1",
"loader-runner": "2.3.0",
"loader-utils": "1.1.0",
"memory-fs": "0.4.1",
"mkdirp": "0.5.1",
"node-libs-browser": "2.0.0",
"node-libs-browser": "2.1.0",
"source-map": "0.5.7",
"supports-color": "4.5.0",
"tapable": "0.2.8",
@ -14368,44 +14293,17 @@
},
"dependencies": {
"ajv": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz",
"integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=",
"version": "5.5.2",
"resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
"co": "4.6.0",
"fast-deep-equal": "1.0.0",
"json-schema-traverse": "0.3.0",
"json-stable-stringify": "1.0.1"
"fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.0"
}
},
"async": {
"version": "2.5.0",
"resolved": "http://registry.npm.taobao.org/async/download/async-2.5.0.tgz",
"integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=",
"dev": true,
"requires": {
"lodash": "4.17.4"
}
},
"big.js": {
"version": "3.2.0",
"resolved": "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
"integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
"dev": true
},
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
},
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
},
"enhanced-resolve": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
@ -14424,38 +14322,6 @@
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
"json-stable-stringify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
"dev": true,
"requires": {
"jsonify": "0.0.0"
}
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
"jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
},
"loader-utils": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
"dev": true,
"requires": {
"big.js": "3.2.0",
"emojis-list": "2.1.0",
"json5": "0.5.1"
}
},
"source-map": {
"version": "0.5.7",
"resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",

@ -51,7 +51,7 @@
"typings-for-css-modules-loader": "^1.7.0",
"url-loader": "^0.6.2",
"wallaby-webpack": "0.0.45",
"webpack": "^3.8.1",
"webpack": "^3.10.0",
"webpack-dev-server": "^2.9.4"
},
"dependencies": {

@ -1,12 +1,12 @@
import * as THREE from 'three';
import { Vector3 } from 'three';
import { app } from '../ApplicationServices/Application';
import { Circle } from '../DatabaseServices/Circle';
import { Line } from '../DatabaseServices/Line';
import { Command } from '../Editor/CommandMachine';
import { PromptStatus } from '../Editor/PromptResult';
import { RenderType } from '../GraphicsSystem/Enum';
import { Line, Database } from '../DatabaseServices/FileSystem';
import { Vector3 } from 'three';
import { Circle } from '../DatabaseServices/Circle';
export class DrawLine implements Command
{

@ -2,7 +2,7 @@ import * as THREE from 'three';
import { app } from '../ApplicationServices/Application';
import { Circle } from '../DatabaseServices/Circle';
import { Line } from '../DatabaseServices/FileSystem';
import { Line } from '../DatabaseServices/Line';
import { Command } from '../Editor/CommandMachine';
export class DrawCircle0 implements Command
@ -18,8 +18,6 @@ export class DrawCircle0 implements Command
app.m_Viewer.WorldToScreen(p);
app.m_Viewer.ScreenToWorld(p);
let line = new Line(new THREE.Vector3(0, 0, 0), new THREE.Vector3(100, 0, 0));
app.m_Database.ModelSpace.Append(line);

@ -2,13 +2,13 @@ import { Callback } from 'awesome-typescript-loader/dist/paths-plugin';
import * as THREE from 'three';
import { app } from '../ApplicationServices/Application';
import { Entity } from '../DatabaseServices/Entity';
import { Command } from '../Editor/CommandMachine';
import { PromptStatus } from '../Editor/PromptResult';
import { SelectBox } from '../Editor/SelectBox';
import { SelectPick } from '../Editor/SelectPick';
import { SelectSet, SelectType } from '../Editor/SelectSet';
import { Move } from '../Geometry/GeUtils';
import { Entity } from '../DatabaseServices/FileSystem';
export class Stretch implements Command
{

@ -2,7 +2,7 @@ import * as THREE from 'three';
import * as xaop from 'xaop';
import { KeyBoard } from '../Common/KeyEnum';
import { Database } from '../DatabaseServices/FileSystem';
import { Database } from '../DatabaseServices/Database';
import { CameraControls } from '../Editor/CameraControls';
import { commandMachine } from '../Editor/CommandMachine';
import { DatGUI } from '../Editor/DebugDatUi';
@ -12,6 +12,7 @@ import { SnapDrag } from '../Editor/SnapDrag';
import { SnapServices } from '../GraphicsSystem/SnapServices';
import { Viewer } from '../GraphicsSystem/Viewer';
import { layoutOnsizeEvent } from '../UI/Layout/LayoutOnSizeEventManage';
export var app: ApplicationService
export var ed: Editor
export var db: Database

@ -0,0 +1,9 @@
import { Factory } from './CADFactory';
import { Entity } from './Entity';
import { ObjectCollection } from './ObjectCollection';
@Factory
export class BlockTableRecord extends ObjectCollection<Entity>
{
}

@ -0,0 +1,29 @@
import { CADObject } from "./CADObject";
/**
* CAD, ,
*
* @export
* @class CADFactory
*/
export class CADFactory
{
private constructor() { }
private objectNameMap = new Map<string, any>();
private static factory = new CADFactory();
static RegisterObject(C)
{
this.factory.objectNameMap.set(C.name, C);
}
static CreateObject(name: string): CADObject
{
let C = this.factory.objectNameMap.get(name);
if (C) return new C();
}
}
//可以通过添加装饰器 在类前面(@Factory),自动注册工厂的序列化
export function Factory(target: Object)
{
CADFactory.RegisterObject(target);
}

@ -0,0 +1,88 @@
import { CADFactory } from './CADFactory';
import { CADObject } from './CADObject';
import { Database } from './Database';
/**
* CAD
*
* @export
* @class CADFile
*/
export class CADFile
{
private readIndex: number = 0;
private dataList: any[] = [];
Destroy()
{
delete this.dataList;
delete this.readIndex;
}
get Data()
{
return this.dataList;
}
set Data(v)
{
this.dataList = v;
this.Reset();
}
Reset()
{
this.readIndex = 0;
}
WriteString(str: string)
{
this.dataList.push(str);
}
ReadString(): string
{
let str = this.dataList[this.readIndex] as string;
this.readIndex++;
return str;
}
WriteObject(obj: CADObject)
{
if (!obj)
{
this.Write("");
return;
}
let tempFile = new CADFile();
tempFile.WriteString(obj.constructor.name);
obj.WriteFile(tempFile);
this.Write(tempFile.Data);
tempFile.Destroy();//GC
}
ReadObject(db: Database, obj?: CADObject): CADObject
{
let data = this.Read();
let tempFile = new CADFile();
tempFile.Data = data;
let className = tempFile.ReadString();
if (className)
{
obj = obj ? obj : CADFactory.CreateObject(className);
obj.SetDefaultDb(db);
obj.ReadFile(tempFile);
tempFile.Destroy();
return obj;
}
}
Write(data: any)
{
this.dataList.push(data);
}
Read(): any
{
let data = this.dataList[this.readIndex];
this.readIndex++;
return data;
}
ToString()
{
return JSON.stringify(this.dataList);
}
}

@ -0,0 +1,179 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CommandHistoryRecord } from './CommandHistoryRecord';
import { Database } from './Database';
import { ObjectId } from './ObjectId';
export abstract class CADObject
{
//对象被彻底遗弃
GoodBye(): any
{
}
//-------------------------DB-------------------------
protected _db: Database;
get Db(): Database
{
return this._db;
}
//对象在加入数据库时,必须指定一个源数据库,否则无法读取引用id.
SetDefaultDb(db: Database)
{
if (!this._db)
this._db = db;
else
console.warn("警告:同一个对象无法重复设置默认db.");
}
//private 私有的方法,暴露给Db的添加对象,方法使用.
//只用对象加入到db中,我们才初始化ObjectId.
//从db池中分配id给自身使用. 除非你创建对象往db里面加,否则不要调用该方法
InitObjectId(db: Database)
{
if (!this._db)
{
this._db = db;
this.objectId = db.AllocateId(this);
}
else
console.warn("同一个对象无法重复设置到数据库中!");
}
//-------------------------DB End-------------------------
// -------------------------isErase-------------------------
protected _isErase: boolean = false;
get IsErase(): boolean
{
return this._isErase;
}
Erase(isErase: boolean = true)
{
this._isErase = isErase;
}
//-------------------------isErase End-------------------------
// -------------------------id-------------------------
protected objectId: ObjectId;
get Id(): ObjectId
{
return this.objectId;
}
// -------------------------id End-------------------------
// -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
let ver = file.Read();
//write Id;
this.objectId = this.ReadObjectId(file);
if (this.objectId)
{
this.objectId.Object = this;
}
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);
this.WriteObjectId(file)
}
//局部撤销
ApplyPartialUndo(undoData: CADObject)
{
if (undoData instanceof AllObjectData)
{
undoData.file.Reset();
this.ReadFile(undoData.file);
}
}
//撤销所保存的位置
UndoRecord(): CommandHistoryRecord
{
if (this._db)
return this._db.hm.UndoData;
}
//写入所有的对象数据 以便还原对象
protected WriteAllObjectRecord()
{
let undoData = this.UndoRecord();
if (undoData)
undoData.CreateObjectHistory(this);
}
//复制出一个实体,所有的关联引用全部失效,如有需要,请重新关联.
Clone(): CADObject
{
let file = new CADFile();
file.WriteObject(this);
return file.ReadObject(undefined);
}
//-------------------------File End-------------------------
protected WriteObjectId(file: CADFile)
{
if (this.objectId)
{
file.Write(this.objectId.Index);
}
else
file.Write(-1);
}
protected ReadObjectId(file: CADFile): ObjectId
{
let index = file.Read();
if (index >= 0 && this._db)
{
return ObjectId.Create(this._db, index);
}
}
}
/**
*
*
* @export
* @class AllObjectData
* @extends {IFileReadWrite}
*/
@Factory
export class AllObjectData extends CADObject
{
file: CADFile;
constructor(obj?: CADObject)
{
super();
this.file = new CADFile();
if (obj)
obj.WriteFile(this.file);
}
//#region -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
super.ReadFile(file);
let ver = file.Read();
let data = file.Read();
this.file.Data = data;
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
super.WriteFile(file);
file.Write(1);
file.Write(this.file.Data);
}
//#endregion
}

@ -3,7 +3,9 @@ import * as THREE from 'three';
import { ColorMaterial } from '../Common/ColorPalette';
import { RenderType } from '../GraphicsSystem/Enum';
import { CADFile, Entity, Factory } from './FileSystem';
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { Entity } from './Entity';
@Factory

@ -0,0 +1,133 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
import { HistorycRecord } from './HistorycRecord';
import { ObjectAllDataHistoryRecord } from './ObjectAllDataHistoryRecord';
import { ObjectId } from './ObjectId';
/**
*
*
* @export
* @class CommandHistoryRecord
* @extends {DbObject}
*/
@Factory
export class CommandHistoryRecord extends CADObject
{
constructor(cmdName?: string)
{
super();
this.commandName = cmdName;
}
//命令名称
private commandName: string;
//历史记录表
private historyCol = new Map<ObjectId, HistorycRecord[]>();
get HistoryList(): Map<ObjectId, HistorycRecord[]>
{
return this.historyCol;
}
private GetObjectHistoryList(id: ObjectId)
{
if (!this.historyCol.has(id))
{
this.historyCol.set(id, []);
}
return this.historyCol.get(id);
}
EndCommand()
{
for (let [id, recs] of this.historyCol)
{
let rec = this.GetObjectAllDataRecord(recs);
if (rec)
{
rec.WriteRedo();
}
}
}
//获得对象的记录
GetObjectAllDataRecord(historyList: HistorycRecord[]): ObjectAllDataHistoryRecord
{
if (historyList.length > 0)
{
let rec = historyList[historyList.length - 1];
if (rec instanceof ObjectAllDataHistoryRecord)
{
return rec;
}
}
}
//对象写入数据
WriteObjectHistoryPath(obj: CADObject, history: HistorycRecord)
{
let his = this.GetObjectHistoryList(obj.Id);
if (this.GetObjectAllDataRecord(his))
{
//console.log("优化掉重复的全部数据");
return;
}
if (history instanceof ObjectAllDataHistoryRecord)
{
history.WriteUndo();
}
his.push(history);
}
CreateObjectHistory(obj: CADObject): ObjectAllDataHistoryRecord
{
if (!obj.Id)
{
console.warn("错误!CreateObjectHistory");
return;
}
let rec = new ObjectAllDataHistoryRecord(obj.Id);
this.WriteObjectHistoryPath(obj, rec);
return rec;
}
//#region -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
let ver = file.Read();
this.commandName = file.Read();
let cout = file.Read();
this.historyCol.clear();
for (let i = 0; i < cout; i++)
{
let id = this.ReadObjectId(file);
let length = file.Read();
let recs = [];
this.historyCol.set(id, recs);
for (let j = 0; j < length; j++)
{
let rec = file.ReadObject(this._db);
recs.push(rec);
}
}
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);
file.Write(this.commandName);
file.Write(this.historyCol.size);
for (let [id, recs] of this.historyCol)
{
file.Write(id.Index);
file.Write(recs.length);
for (let rec of recs)
{
file.WriteObject(rec);
}
}
}
//#endregion
}

@ -0,0 +1,43 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
import { Database } from './Database';
@Factory
export class CreateObjectData extends CADObject
{
private cadFile: CADFile;
constructor(obj?: CADObject)
{
super();
this.cadFile = new CADFile();
if (obj)
this.cadFile.WriteObject(obj);
}
getObject(db: Database): CADObject
{
this.cadFile.Reset();
let obj = this.cadFile.ReadObject(db);
this.cadFile.Reset();
return obj;
}
//#region -----------------------------File-----------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
file.Read();//ver;
let data = file.Read();
this.cadFile.Data = data;
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);//ver
file.Write(this.cadFile.Data);
}
//#endregion -----------------------------File End-----------------------------
}

@ -0,0 +1,85 @@
import { BlockTableRecord } from './BlockTableRecord';
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
import { HistoricManage } from './HistoricManage';
import { MaerialTableRecord } from './MaerialTableRecord';
import { ObjectId } from './ObjectId';
@Factory
export class Database
{
hm: HistoricManage;
//块表记录
blockTableCol: BlockTableRecord[];
//模型空间
ModelSpace: BlockTableRecord;
//材质字典...
MaterialDict: MaerialTableRecord;
private idCout = -1;
private idMap = new Map<number, ObjectId>();
constructor()
{
this.ModelSpace = new BlockTableRecord();
this.ModelSpace.InitObjectId(this);
this.MaterialDict = new MaerialTableRecord();
this.MaterialDict.InitObjectId(this);
this.hm = new HistoricManage();
this.hm.SetDefaultDb(this);
}
FileWrite(): CADFile
{
let file = new CADFile();
file.Write(1);//ver;
file.WriteObject(this.ModelSpace);
file.WriteObject(this.MaterialDict);
return file;
}
FileRead(file: CADFile)
{
let ver = file.Read();
file.ReadObject(this, this.ModelSpace);
file.ReadObject(this, this.MaterialDict);
}
//创建一个id,自动递增它的索引号,并且会自动加入到db的id列表中.
AllocateId(obj: CADObject): ObjectId
{
if (obj.Db === this)
{
this.idCout++;
let id = ObjectId.Create(this, this.idCout);
id.Object = obj;
return id;
}
else
console.warn("警告:对象不属于该数据库!");
}
/*
private , ObjectId使.
id, id, , 使 ObjectId.Create,,使,AllocateId
*/
GetObjectId(index: number): ObjectId
{
return this.idMap.get(index);
}
/*
private , ObjectId使.
idid. Objectid.Cretes使.
*/
SetObjectId(index: number, id: ObjectId)
{
if (this.idMap.has(index))
console.warn("警告:尝试加入已经存在的id!");
this.idMap.set(index, id);
}
}

@ -0,0 +1,71 @@
//所有图元的基类
import * as THREE from 'three';
import { RenderType } from '../GraphicsSystem/Enum';
import { Factory } from './CADFactory';
import { CADObject } from './CADObject';
import { ObjectId } from './ObjectId';
@Factory
export class Entity extends CADObject
{
protected m_DrawEntity = new Map<RenderType, THREE.Object3D>();
//材质id
protected m_MaterialId: ObjectId;
protected m_Color: number = 7;
//绘制一个threeJs对象.
Draw(renderType: RenderType = RenderType.Wireframe): THREE.Object3D
{
if (this.m_DrawEntity && this.m_DrawEntity.has(renderType))
{
return this.m_DrawEntity.get(renderType);
}
}
Update()
{
}
GoodBye()
{
for (let [, obj] of this.m_DrawEntity)
{
let geo = obj['Geometry']
if (geo && geo instanceof THREE.Geometry)
{
geo.dispose();
}
obj.parent.remove(obj);
}
}
Erase(isErase: boolean = true)
{
super.Erase(isErase);
if (isErase)
{
for (let [, en] of this.m_DrawEntity)
{
en.visible = !isErase;
}
}
}
GetStretchPoints(): Array<THREE.Vector3>
{
return []
}
MoveStretchPoints(indexList: Array<number>, vec: THREE.Vector3)
{
}
//#region -------------------------File-------------------------
//局部撤销
ApplyPartialUndo(undoData: CADObject)
{
super.ApplyPartialUndo(undoData);
this.Update();
}
//#endregion
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,123 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
import { CommandHistoryRecord } from './CommandHistoryRecord';
//历史记录管理
@Factory
export class HistoricManage extends CADObject
{
curIndex: number = -1; //当前执行位置,也就是当前的状态, undo时,撤销当前状态,redo时,应用下一个状态
historyRecord: CommandHistoryRecord[] = []; //历史记录
private doing: boolean = false;
constructor()
{
super();
}
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
let ver = file.Read();
this.curIndex = file.Read();
this.historyRecord = [];
let cout = file.Read();
for (let i = 0; i < cout; i++)
{
this.historyRecord.push(file.ReadObject(this._db) as CommandHistoryRecord);
}
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);
file.Write(this.curIndex);
file.Write(this.historyRecord.length);
for (let rec of this.historyRecord)
{
file.WriteObject(rec);
}
}
//命令正在当前状态
get IsNow(): boolean
{
return this.historyRecord.length !== 0 && this.curIndex === this.historyRecord.length - 1;
}
get UndoData(): CommandHistoryRecord
{
if (this.doing)
return undefined;
if (!this.IsNow)
this.StartCmd("");
return this.historyRecord[this.historyRecord.length - 1];
}
StartCmd(cmdName: string)
{
this.EndCmd();
//删除当前状态以后的所有状态
this.historyRecord.splice(this.curIndex + 1, this.historyRecord.length - (this.curIndex + 1));
this.historyRecord.push(new CommandHistoryRecord(cmdName));
this.curIndex = this.historyRecord.length - 1;
}
//结束当前的命令.
EndCmd()
{
if (!this.IsNow)
return;
let lastRec = this.historyRecord[this.curIndex];
if (lastRec)
{
lastRec.EndCommand();
}
}
Undo(): boolean
{
this.EndCmd();
let historyRec = this.historyRecord[this.curIndex];
if (!historyRec)
{
return false;
}
this.doing = true;
for (let [id, recList] of historyRec.HistoryList)
{
let obj = id.Object;
for (let i = recList.length; i--;)
{
obj.ApplyPartialUndo(recList[i].undoData);
}
}
this.curIndex--;
this.doing = false;
return true;
}
Redo()
{
let historyRec = this.historyRecord[this.curIndex + 1];
if (!historyRec)
{
return false;
}
this.doing = true;
for (let [id, recList] of historyRec.HistoryList)
{
let obj = id.Object;
for (let rec of recList)
{
obj.ApplyPartialUndo(rec.redoData);
}
}
this.curIndex++;
this.doing = false;
return true;
}
}

@ -0,0 +1,40 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
/**
* ,.
*
* @class HistoricRecord
* @extends {CADObject}
*/
@Factory
export class HistorycRecord extends CADObject
{
//指定撤销时所需要的数据
undoData: CADObject;
//制定重做时所需要的数据
redoData: CADObject;
userData: CADObject;
//#region -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
let ver = file.Read();
this.undoData = file.ReadObject(this._db);
this.redoData = file.ReadObject(this._db);
this.userData = file.ReadObject(this._db);
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);
file.WriteObject(this.undoData);
file.WriteObject(this.redoData);
file.WriteObject(this.userData);
}
//#endregion
}

@ -0,0 +1,113 @@
//直线对象
import { Geometry, Object3D, Vector3 } from 'three';
import * as THREE from 'three';
import { ColorMaterial } from '../Common/ColorPalette';
import { RenderType } from '../GraphicsSystem/Enum';
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { Entity } from './Entity';
@Factory
export class Line extends Entity
{
private startPoint: Vector3;
private endPoint: Vector3;
constructor(sp?: Vector3, ep?: Vector3)
{
super();
this.startPoint = sp || new Vector3(0, 0, 0);
this.endPoint = ep || new Vector3(0, 0, 0);
}
Draw(renderType: RenderType): Object3D
{
let obj = super.Draw(renderType);
if (obj) return obj;
let geo = new Geometry();
geo.vertices.push(this.StartPoint, this.EndPoint);
obj = new THREE.Line(geo, ColorMaterial.GetLineMaterial(this.m_Color));
this.m_DrawEntity.set(renderType, obj);
obj.userData = this;
return obj;
}
Update()
{
for (let [, obj] of this.m_DrawEntity)
{
let geo = (<THREE.Line>obj).geometry as THREE.Geometry;
geo.vertices[0].copy(this.startPoint);
geo.vertices[1].copy(this.endPoint);
geo.computeBoundingSphere();
geo.verticesNeedUpdate = true;
}
}
GetStretchPoints(): Array<THREE.Vector3>
{
return [this.StartPoint, this.EndPoint]
}
MoveStretchPoints(indexList: Array<number>, vec: Vector3)
{
for (let index of indexList)
{
if (index == 0)
this.StartPoint = this.StartPoint.add(vec);
else
this.EndPoint = this.EndPoint.add(vec);
}
}
//#region -----------------------------File-----------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
super.ReadFile(file);
let ver = file.Read();//1
this.startPoint.fromArray(file.Read());
this.endPoint.fromArray(file.Read());
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
super.WriteFile(file);
file.Write(1);//ver
file.Write(this.startPoint.toArray());
file.Write(this.endPoint.toArray());
}
//#endregion-----------------------------File End-----------------------------
//#region 属性
set StartPoint(v: Vector3)
{
this.WriteAllObjectRecord();
this.startPoint.copy(v);
this.Update();
}
get StartPoint(): Vector3
{
return this.startPoint.clone();
}
get EndPoint(): Vector3
{
return this.endPoint.clone();
}
set EndPoint(v: Vector3)
{
this.WriteAllObjectRecord();
this.endPoint.copy(v);
this.Update();
}
//#endregion
}

@ -0,0 +1,10 @@
import { Factory } from './CADFactory';
import { Material } from './Material';
import { ObjectCollection } from './ObjectCollection';
@Factory
export class MaerialTableRecord extends ObjectCollection<Material>
{
}

@ -0,0 +1,7 @@
import { Factory } from './CADFactory';
import { CADObject } from './CADObject';
@Factory
export class Material extends CADObject
{
}

@ -0,0 +1,27 @@
import { Factory } from './CADFactory';
import { ObjectId } from './ObjectId';
import { HistorycRecord } from './HistorycRecord';
import { AllObjectData } from './CADObject';
@Factory
export class ObjectAllDataHistoryRecord extends HistorycRecord
{
objId: ObjectId;
constructor(id?: ObjectId)
{
super();
this.objId = id;
}
//将数据写入 手动调用
WriteUndo()
{
this.undoData = new AllObjectData(this.objId.Object);
}
WriteRedo()
{
this.redoData = new AllObjectData(this.objId.Object);
}
}

@ -0,0 +1,98 @@
import { HistorycRecord } from './HistorycRecord';
import { ArrayRemove } from '../Common/Utils';
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { RemoveObjectData } from './RemoveObjectData';
import { CADObject } from './CADObject';
import { CreateObjectData } from './CreateObjectData';
//对象集合.
@Factory
export class ObjectCollection<T> extends CADObject
{
objectCol: CADObject[] = [];
//添加一个对象进入集合,这个集合存在db中,那么将自动分配id.
Append(obj: CADObject)
{
this.objectCol.push(obj);
if (this._db && !obj.Id)
{
obj.InitObjectId(this._db);
}
let undoRec = this.UndoRecord();
if (undoRec)
{
let hisRec = new HistorycRecord();
hisRec.redoData = new CreateObjectData(obj);
hisRec.undoData = new RemoveObjectData(this.objectCol.length - 1);
undoRec.WriteObjectHistoryPath(this, hisRec);
}
return obj.Id;
}
Remove(obj: CADObject)
{
ArrayRemove(this.objectCol, obj);
obj.Erase();
obj.GoodBye();
let undoRec = this.UndoRecord();
if (undoRec)
{
let hisRec = new HistorycRecord();
hisRec.undoData = new CreateObjectData(obj);
hisRec.redoData = new RemoveObjectData(this.objectCol.length - 1);
undoRec.WriteObjectHistoryPath(this, hisRec);
}
}
Cout(): number
{
return this.objectCol.length;
}
//#region -----------------------------File-----------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
super.ReadFile(file);
let cout = file.Read();
this.objectCol = [];
for (let i = 0; i < cout; i++)
{
let obj = file.ReadObject(this._db);
this.objectCol.push(obj);
}
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
super.WriteFile(file);
file.Write(this.objectCol.length);
for (let obj of this.objectCol)
{
file.WriteObject(obj);
}
}
//局部撤销
ApplyPartialUndo(undoData: CADObject)
{
if (undoData instanceof CreateObjectData)
{
let obj = undoData.getObject(this._db);
this.Append(obj);
}
else if (undoData instanceof RemoveObjectData)
{
this.Remove(this.objectCol[undoData.Index]);
}
}
//#endregion -----------------------------File End-----------------------------
}

@ -0,0 +1,59 @@
import { Database } from './Database';
import { CADObject } from './CADObject';
/*
CADObjectId,.
id,.
ObjectId使 Database(dbid,便id)
*/
export class ObjectId
{
private id: number;
private obj: CADObject;
//对外隐藏构造函数,如果需要构造一个id,请使用 Create 静态方法.
private constructor(index: number = -1, obj?: CADObject)
{
this.id = index;
this.obj = obj;
}
get IsErase(): boolean
{
return !this.obj || this.obj.IsErase;
}
/*
id, dbid,id,,newid,db
使:
1.db
2..
3.redo
4.
*/
static Create(db: Database, index: number): ObjectId
{
let id = db.GetObjectId(index);
if (!id && index >= 0)
{
id = new ObjectId(index);
db.SetObjectId(index, id);
}
return id;
}
set Object(v: CADObject)
{
this.obj = v;
}
get Object(): CADObject
{
return this.obj;
}
get Index(): number
{
return this.id;
}
}

@ -1,7 +1,6 @@
import * as THREE from "three";
import { Texture } from "three";
import { ObjectId, Factory, Material } from "./FileSystem";
import { Material } from './Material';
import { Factory } from './CADFactory';
import { ObjectId } from './ObjectId';
/**
* ,,db.three.material

@ -0,0 +1,39 @@
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
@Factory
export class RemoveObjectData extends CADObject
{
private index: number;
constructor(index?: number)
{
super();
this.index = index;
}
get Index()
{
return this.index;
}
//#region -----------------------------File-----------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
file.Read();//ver
this.index = file.Read();
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
file.Write(1);
file.Write(this.index);
}
//局部撤销
ApplyPartialUndo(file: CADObject)
{ }
//#endregion -----------------------------File End-----------------------------
}

@ -1,5 +1,7 @@
import { CADObject, Factory } from "./FileSystem";
import * as THREE from "three";
import * as THREE from 'three';
import { Factory } from './CADFactory';
import { CADObject } from './CADObject';
/**
@ -7,7 +9,7 @@ import * as THREE from "three";
*
* @export
* @class Texture
* @extends {CADObject}
* @extends {DbObject}
*/
@Factory
export class Texture extends CADObject

@ -1,4 +1,4 @@
import { Database } from "./FileSystem";
import { Database } from "./Database";
/**
*

@ -1,11 +1,11 @@
//用户交互编辑工具
import { Vector3 } from 'three';
import * as THREE from 'three';
import { Vector3 } from 'three';
import * as xaop from 'xaop';
import { app, ApplicationService } from '../ApplicationServices/Application';
import { GetPointPrompt, InputState } from '../Common/InputState';
import { Entity } from '../DatabaseServices/FileSystem';
import { Entity } from '../DatabaseServices/Entity';
import { CommandStore } from '../UI/Store/CommandStore';
import { GetPointServices } from './GetPointServices';
import { KeyBoardControls } from './KeyBoardControls';

@ -3,7 +3,7 @@ import { end } from 'xaop';
import { app } from '../ApplicationServices/Application';
import { KeyBoard, MouseKey } from '../Common/KeyEnum';
import { Entity } from '../DatabaseServices/FileSystem';
import { Entity } from '../DatabaseServices/Entity';
import { GripScene } from '../GraphicsSystem/GripScene';
import { Viewer } from '../GraphicsSystem/Viewer';
import { SelectMarquee } from '../UI/JsPlugin/SelectMarquee';

@ -1,6 +1,7 @@
import * as THREE from 'three';
import { Entity } from '../DatabaseServices/FileSystem';
import { Entity } from '../DatabaseServices/Entity';
export class GripScene extends THREE.Object3D
{

@ -2,7 +2,8 @@ import * as THREE from 'three';
import * as xaop from 'xaop';
import { db } from '../ApplicationServices/Application';
import { Database, Entity } from '../DatabaseServices/FileSystem';
import { Database } from '../DatabaseServices/Database';
import { Entity } from '../DatabaseServices/Entity';
import { cZeroVec, GetBox, GetBoxArr } from '../Geometry/GeUtils';
import { PlaneExt } from '../Geometry/Plane';
import { CameraControl } from './CameraControl';

@ -4,7 +4,7 @@
"sourceMap": true,
"module": "commonjs",
"allowJs": true,
"target": "es6",
"target": "esnext",
"noLib": false,
"moduleResolution": "node",
"lib": [

Loading…
Cancel
Save