@ccpc/core 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -2175,3 +2175,4 @@ export {
2175
2175
  ht as registerRequest,
2176
2176
  Y as requestMgr
2177
2177
  };
2178
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/element/element_id.ts","../src/element/i_element.ts","../src/toolkit/debug_util.ts","../src/toolkit/class_manager.ts","../src/document/element_mgr.ts","../src/document/id_pool.ts","../src/transaction/i_transaction_base.ts","../src/transaction/transaction_base.ts","../src/types/type_define.ts","../src/transaction/undo_redo_entity.ts","../src/transaction/transaction.ts","../src/transaction/transaction_group.ts","../src/transaction/transaction_mgr.ts","../src/request/request_mgr.ts","../src/grep/display/display_object_mgr.ts","../src/render/render_node.ts","../src/toolkit/cmath_util.ts","../src/grep/gnode_type.ts","../src/grep/gnode.ts","../src/grep/ggroup.ts","../src/grep/grep.ts","../src/display/dirty_prop.ts","../src/display/state_object.ts","../src/grep/display/display_object.ts","../src/grep/display/grep_display.ts","../src/render/null_render.ts","../src/model_view/model_changed_cache.ts","../src/grep/i_style.ts","../src/grep/style_utils.ts","../src/model_view/model_view.ts","../src/document/doc_saver.ts","../src/document/document.ts","../src/element/db.ts","../src/element/element.ts","../src/element/element_decorator.ts","../src/element/tmp_element/tmp_element.ts","../src/element/tmp_element/tmp_element_painter.ts","../src/grep/gnode2d.ts","../src/grep/gcurve2d.ts","../src/grep/gpolycurve.ts","../src/grep/gpoint2d.ts","../src/grep/gpolygon.ts","../src/grep/gtext2d.ts","../src/render/i_render.ts","../src/render/render_node_util.ts","../src/request/request.ts","../src/request/request_decorator.ts","../src/request/buildin_request/undo_request.ts","../src/request/buildin_request/redo_request.ts","../src/toolkit/signal.ts","../src/toolkit/signal_hook.ts"],"sourcesContent":["import { IDBEleId } from '../types/type_define';\r\n\r\nclass ElementId {\r\n public static get INVALID() {\r\n return new ElementId(-1);\r\n }\r\n\r\n protected _id: number = -1;\r\n\r\n constructor(id: number) {\r\n this._id = id;\r\n }\r\n\r\n public asInt() {\r\n return this._id;\r\n }\r\n\r\n public equals(id: ElementId) {\r\n return this._id === id.asInt();\r\n }\r\n\r\n public isValid() {\r\n return this._id && this._id > -1;\r\n }\r\n\r\n public toString() {\r\n return '' + this._id;\r\n }\r\n\r\n public dump(): IDBEleId {\r\n return {\r\n id: this._id,\r\n };\r\n }\r\n\r\n public load(json: IDBEleId) {\r\n this._id = json.id;\r\n }\r\n}\r\n\r\nexport { ElementId };\r\n","import { IDocument } from '../document/i_document'\r\nimport { GRep } from '../grep/grep'\r\nimport { IJSON } from '../types/type_define';\r\nimport { ElementId } from './element_id'\r\n\r\nexport type IModifiedProps = {\r\n propertyName: string;\r\n oldValue: unknown;\r\n newValue: unknown;\r\n}\r\n\r\nexport interface IDB {\r\n readonly db: Record<string, unknown>\r\n\r\n readonly cache: Record<string, unknown>\r\n\r\n getModified(): IModifiedProps[]\r\n\r\n commit(): void\r\n\r\n rollBack(): void\r\n\r\n dump(): IJSON\r\n\r\n load(val: IJSON): void\r\n}\r\n\r\nexport interface IElement extends IDB {\r\n id: ElementId\r\n\r\n name: string\r\n\r\n getDoc(): IDocument\r\n\r\n setDoc(doc: IDocument): void\r\n\r\n init(...params: unknown[]): this\r\n\r\n getSerialId(): string\r\n\r\n getGRep(): GRep\r\n\r\n /**\r\n * 获取选中GRep\r\n */\r\n getGRepWhenSelected(): GRep\r\n\r\n /**\r\n * 获取高亮GRep\r\n */\r\n getGRepWhenActive(): GRep\r\n\r\n setGRep(grep: GRep): boolean\r\n\r\n isElementVisible(): boolean\r\n\r\n isTemporary(): boolean\r\n\r\n dontSave(): boolean\r\n\r\n dontShowView(): boolean\r\n\r\n propShouldCacheToView(propName: string): boolean\r\n\r\n clone(): this\r\n\r\n onLoad(): void\r\n\r\n}\r\n\r\nexport type T_SerializedId = {\r\n /**类序列化的唯一标识*/\r\n ctor: string\r\n}\r\n\r\nexport type IElementCtor<T extends IElement = IElement> = {\r\n new(): T\r\n\r\n serializedId: T_SerializedId\r\n}\r\n\r\nexport const EN_VIEW_CACHE_PROPS = {\r\n C_GREP: 'C_GRep',\r\n VISIBLE: 'visible',\r\n} as const;\r\n\r\nexport type IDumpLoad = {\r\n dump(): unknown,\r\n load(val: unknown): void\r\n}\r\n\r\nexport const MathSymbol = Symbol('math')\r\n\r\nexport const DBGenerator = {\r\n newGeoArray: <T>() => {\r\n return [MathSymbol] as T[];\r\n },\r\n\r\n newGeoObject: <T>() => {\r\n return MathSymbol as T;\r\n },\r\n};\r\n","export class DebugUtil {\r\n public static assert<T>(value: T, message: string, name: string, time: string): asserts value is NonNullable<T> {\r\n if (!value) {\r\n const showMesg = `${message}\\n报告人:${name}\\n报告时间:${time}\\n点击确定可debug`;\r\n // TODO 触发事件\r\n throw new Error(showMesg);\r\n }\r\n }\r\n\r\n public static warn(value: boolean, message: string, name: string, time: string) {\r\n if (!value) {\r\n const showMesg = `${message}\\n报告人:${name}\\n报告时间:${time}\\n点击确定可debug`;\r\n console.warn(showMesg)\r\n }\r\n }\r\n}\r\n","import { DebugUtil } from './debug_util';\r\n\r\n/**\r\n * 类管理器\r\n */\r\nexport class ClassManager<T, K> {\r\n\r\n private _kvMap: Map<T, K> = new Map();\r\n\r\n private _vkMap: Map<K, T> = new Map();\r\n /**\r\n * 注册类\r\n */\r\n public registerCls(key: T, val: K) {\r\n const ctor = this._kvMap.get(key);\r\n if (ctor) DebugUtil.assert(false, `${String(val)}已注册,请检查`, 'wg', '2026-03-05');\r\n this._kvMap.set(key, val);\r\n this._vkMap.set(val, key);\r\n }\r\n\r\n /**\r\n * 获取类\r\n */\r\n public getCls(key: T) {\r\n return this._kvMap.get(key);\r\n }\r\n\r\n public getClsEnsure(key: T) {\r\n const cls = this.getCls(key);\r\n DebugUtil.assert(cls, `未获取到键为${String(key)}对应的类`, 'wg', '2026-03-05');\r\n return cls;\r\n }\r\n\r\n /**\r\n * 获取标识\r\n */\r\n public getClsName(val: K) {\r\n return this._vkMap.get(val);\r\n }\r\n\r\n public getClsNameEnsure(val: K) {\r\n const name = this.getClsName(val);\r\n DebugUtil.assert(name, `未获取到值为${String(val)}对应的标识`, 'wg', '2026-03-05');\r\n return name;\r\n }\r\n\r\n /**\r\n * 获取所有类\r\n */\r\n public getAllCls() {\r\n return [...this._kvMap.values()];\r\n }\r\n\r\n /**\r\n * 查看所有类个数\r\n */\r\n public getClsLength() {\r\n return this._kvMap.size;\r\n }\r\n}\r\n","import type { IElement, IElementCtor } from '../element/i_element'\r\nimport { ClassManager } from '../toolkit/class_manager'\r\n\r\nexport class ElementMgr {\r\n private static _instance?: ElementMgr\r\n /**\r\n * 当前文档中的所有对象\r\n */\r\n private readonly _allElements = new Map<number, IElement>()\r\n\r\n /**\r\n * 序列化id到实例对象的映射\r\n */\r\n private readonly _ctorToElements = new Map<string, Set<IElement>>()\r\n\r\n /**\r\n * 类管理器\r\n */\r\n private readonly _eleClsMgr = new ClassManager<string, IElementCtor>()\r\n\r\n public static instance() {\r\n if (!this._instance) {\r\n this._instance = new ElementMgr()\r\n }\r\n return this._instance\r\n }\r\n\r\n /**\r\n * 注册对象\r\n */\r\n public registerElement(ctor: string, eleCtor: IElementCtor) {\r\n this._eleClsMgr.registerCls(ctor, eleCtor)\r\n }\r\n\r\n /**\r\n * 根据序列化id获取Element构造函数\r\n */\r\n public getElementClsByCtor(ctor: string) {\r\n return this._eleClsMgr.getCls(ctor)\r\n }\r\n\r\n /**\r\n * 根据id获取element\r\n */\r\n public getElementById<T extends IElement>(id: number) {\r\n return this._allElements.get(id) as T\r\n }\r\n\r\n /**\r\n * 获取所有element\r\n */\r\n public getAllElements(): IElement[] {\r\n return [...this._allElements.values()]\r\n }\r\n\r\n public getAllElementIds(): number[] {\r\n return [...this._allElements.keys()]\r\n }\r\n\r\n /**\r\n * 根据序列化id获取element数组\r\n */\r\n public getElementsByCtor(ctor: string) {\r\n const eles = this._ctorToElements.get(ctor)\r\n if (!eles) return []\r\n else return [...eles]\r\n }\r\n\r\n public add(element: IElement, force = true) {\r\n if (!force && this._allElements.has(element.id.asInt())) {\r\n return false\r\n }\r\n this._allElements.set(element.id.asInt(), element)\r\n\r\n const eles = this._ctorToElements.get(element.getSerialId())\r\n if (!eles) {\r\n this._ctorToElements.set(element.getSerialId(), new Set([element]))\r\n } else {\r\n eles.add(element)\r\n }\r\n return true\r\n }\r\n\r\n public delete(id: number) {\r\n const ele = this._allElements.get(id)\r\n if (ele) {\r\n this._allElements.delete(id)\r\n const eles = this._ctorToElements.get(ele.getSerialId())\r\n if (eles) eles.delete(ele)\r\n }\r\n }\r\n\r\n public clear() {\r\n this._allElements.clear()\r\n this._ctorToElements.clear()\r\n }\r\n}\r\n\r\nexport const elementMgr = ElementMgr.instance()\r\n","import { ElementId } from '../element/element_id';\r\nimport type { IElement } from '../element/i_element';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\n\r\nexport class IDPool {\r\n public static readonly MAX_TMP_NUM = 1000;\r\n\r\n public static readonly MAX_TMP_OFFSET = 2 ** 32 - IDPool.MAX_TMP_NUM;\r\n\r\n public static readonly MAX_UNSTABLE_NUM = 1e6;\r\n\r\n public static readonly MAX_UNSTABLE_OFFSET = 2 ** 32 - IDPool.MAX_UNSTABLE_NUM - IDPool.MAX_TMP_NUM;\r\n\r\n private _unstablePool: number[] = [];\r\n\r\n private _tmpPool: number[] = [];\r\n\r\n private _currentStableIndex: number = 0;\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n public reset(usedIds?: Set<number>) {\r\n this._unstablePool.splice(0);\r\n for (let i = 0; i < IDPool.MAX_UNSTABLE_NUM; i++) {\r\n const id = IDPool.MAX_UNSTABLE_OFFSET + i;\r\n if (!usedIds?.has(id)) {\r\n this._unstablePool.push(id);\r\n if (this._unstablePool.length >= 1000) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this._tmpPool.splice(0);\r\n for (let i = 0; i < IDPool.MAX_TMP_NUM; i++) {\r\n const id = IDPool.MAX_TMP_OFFSET + i;\r\n if (!usedIds?.has(id)) {\r\n this._tmpPool.push(id);\r\n }\r\n }\r\n }\r\n\r\n public genId(e: IElement): ElementId | undefined {\r\n if (e.isTemporary()) {\r\n return this.genTmpId();\r\n }\r\n\r\n if (!e.dontSave()) {\r\n return this.genStableId();\r\n }\r\n\r\n return this.genUnstableId();\r\n }\r\n\r\n public genTmpId(): ElementId | undefined {\r\n const id = this._tmpPool.pop();\r\n if (id === undefined) {\r\n return undefined;\r\n }\r\n return new ElementId(id);\r\n }\r\n\r\n public genUnstableId(): ElementId | undefined {\r\n const id = this._unstablePool.pop();\r\n if (id === undefined) {\r\n return undefined;\r\n }\r\n return new ElementId(id);\r\n }\r\n\r\n public genStableId(): ElementId {\r\n const id = ++this._currentStableIndex;\r\n DebugUtil.assert(id < IDPool.MAX_UNSTABLE_OFFSET, 'stable id资源已耗尽', 'wg', '2026-03-04');\r\n return new ElementId(id);\r\n }\r\n\r\n /**\r\n * 重置稳定ID的起始计数\r\n */\r\n public clearStableId(startIdx: number) {\r\n this._currentStableIndex = startIdx;\r\n }\r\n\r\n public isStableId(id: number) {\r\n return id < IDPool.MAX_UNSTABLE_OFFSET;\r\n }\r\n}\r\n","import { IDocument } from '../document/i_document'\r\nimport { IConstructor } from '../types/type_guard'\r\nimport { ITransactionGroup } from './i_transaction_group'\r\n\r\nexport enum EN_TransactionStatus {\r\n /**未启动*/\r\n NOT_STARTED = 'not-started',\r\n /**已启动*/\r\n STARTED = 'started',\r\n /**已提交*/\r\n COMMITTED = 'committed',\r\n /**已回滚*/\r\n ROLLED_BACK = 'rolled_back',\r\n}\r\n\r\nexport interface ITransactionBase {\r\n name: string\r\n\r\n doc: IDocument\r\n\r\n /**\r\n * 启动事务\r\n */\r\n start(): boolean\r\n\r\n /**\r\n * 启动事务时获取初始化parent\r\n */\r\n getStartParent(): ITransactionGroup\r\n\r\n /**\r\n * 获取事务状态\r\n */\r\n getStatus(): EN_TransactionStatus\r\n\r\n /**\r\n * 修改状态 慎用!!!\r\n */\r\n setStatus(status: EN_TransactionStatus): void\r\n\r\n /**\r\n * 回滚\r\n */\r\n rollBack(): boolean\r\n\r\n /**\r\n * Transaction/TransactionGroup类型推断\r\n */\r\n isTransactionLike<T extends ITransactionBase>(this: ITransactionBase, ctor: IConstructor<T>): this is T;\r\n\r\n /**搜集占用的ID*/\r\n collectUsedIds(set: Set<number>): void\r\n}\r\n","import { IDocument } from '../document/i_document';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { IConstructor } from '../types/type_guard';\r\nimport { EN_TransactionStatus, ITransactionBase } from './i_transaction_base';\r\n\r\nexport abstract class TransactionBase implements ITransactionBase {\r\n public name: string;\r\n\r\n public doc: IDocument;\r\n\r\n protected _status = EN_TransactionStatus.NOT_STARTED;\r\n\r\n constructor(doc: IDocument, name: string) {\r\n this.name = name;\r\n this.doc = doc;\r\n }\r\n\r\n public abstract collectUsedIds(set: Set<number>): void;\r\n public start(): boolean {\r\n this._status = EN_TransactionStatus.STARTED;\r\n return true;\r\n }\r\n\r\n public getStartParent() {\r\n const parent = this.doc.transactionMgr.getCurrentTransactionGroup();\r\n DebugUtil.assert(parent, '没有找到TransactionGroup', 'wg', '2026-03-05');\r\n parent.startTransaction(this);\r\n return parent;\r\n }\r\n\r\n public getStatus(): EN_TransactionStatus {\r\n return this._status;\r\n }\r\n\r\n public setStatus(status: EN_TransactionStatus): void {\r\n this._status = status;\r\n }\r\n\r\n public rollBack(): boolean {\r\n this._status = EN_TransactionStatus.ROLLED_BACK;\r\n return true;\r\n }\r\n\r\n public isTransactionLike<T extends ITransactionBase>(this: ITransactionBase, ctor: IConstructor<T>): this is T {\r\n return this instanceof ctor;\r\n }\r\n}\r\n","/**\r\n * 模型层视图变化类型\r\n */\r\nexport enum EN_ModelViewChanged {\r\n ELEMENT_CREATE,\r\n ELEMENT_UPDATE,\r\n ELEMENT_DELETE,\r\n}\r\n\r\nexport enum EN_RNODE_TYPE {\r\n UNKOWN = 0,\r\n POINT = 1,\r\n EDGE = 2,\r\n GROUP = 5,\r\n}\r\n\r\n/**\r\n * 不参与序列化的属性名前缀\r\n */\r\nexport enum EN_DontSavePropPrefix {\r\n UNDER_SCORE = '_',\r\n C_UNDER_SCORE = 'C_'\r\n}\r\n\r\nexport enum EN_CoreRequestIds {\r\n UNDO = 'core.undo',\r\n REDO = 'core.redo'\r\n}\r\n\r\nexport type IDBEleId = {\r\n id: number\r\n}\r\n\r\nexport type IJSON = {\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface I_SignalEvent<S, D> {\r\n type?: string\r\n subject?: S\r\n data?: D\r\n}\r\n\r\nexport type T_SignalCallbackFn<S = unknown, D = unknown> = (data: I_SignalEvent<S, D>) => void\r\n\r\nexport interface I_SignalCallbackItem<S = unknown, D = unknown> {\r\n listener?: unknown\r\n fn: T_SignalCallbackFn<S, D>;\r\n}\r\n","import { IDocument } from '../document/i_document';\r\nimport { IElement, IModifiedProps } from '../element/i_element';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { EN_ModelViewChanged } from '../types/type_define';\r\n\r\n/**\r\n * 记录一次undo/redo的Element变化\r\n */\r\nexport class UndoRedoEntity {\r\n private _doc: IDocument;\r\n\r\n /**增加的元素*/\r\n private readonly _added = new Set<IElement>();\r\n\r\n /**删除的元素*/\r\n private readonly _deleted = new Set<IElement>();\r\n\r\n /**修改的元素*/\r\n private readonly _modified = new Set<IElement>();\r\n\r\n /**修改的元素-属性集合映射*/\r\n private readonly _modifiedProperties: Map<number, IModifiedProps[]> = new Map();\r\n\r\n constructor(doc: IDocument) {\r\n this._doc = doc;\r\n }\r\n\r\n /**监听元素增加*/\r\n public onElementsAdded(eles: IElement[]) {\r\n eles.forEach(ele => this._added.add(ele));\r\n }\r\n\r\n /**监听元素更新*/\r\n public onElementsUpdated(eles: IElement[]) {\r\n eles.forEach(ele => this._modified.add(ele));\r\n }\r\n\r\n /**监听元素删除*/\r\n public onElementsDeleted(eles: IElement[]) {\r\n eles.forEach(ele => this._deleted.add(ele));\r\n }\r\n\r\n public clear() {\r\n this._added.clear();\r\n this._modified.clear();\r\n this._modifiedProperties.clear();\r\n this._deleted.clear();\r\n }\r\n\r\n /**\r\n * 真正去改变db\r\n */\r\n public commit() {\r\n // 1.压缩事务\r\n this._compress();\r\n if (this._isEmpty()) return false;\r\n\r\n // 2.记录属性的修改\r\n this._modifiedProperties.clear();\r\n this._modified.forEach(ele => {\r\n const modify = ele.getModified();\r\n if (!ele.isTemporary() && modify.length) {\r\n this._modifiedProperties.set(ele.id.asInt(), modify);\r\n }\r\n ele.commit();\r\n });\r\n\r\n this._added.forEach(ele => ele.commit());\r\n\r\n this._updateViewCache();\r\n // TODO 事件通知\r\n return true;\r\n }\r\n\r\n /**\r\n * 数据回滚\r\n */\r\n public rollBack() {\r\n // 增加和删除的回滚\r\n this._handleElementsFromDB(true, ...this._added);\r\n this._handleElementsFromDB(false, ...this._deleted);\r\n\r\n // 修改的回滚\r\n this._modified.forEach(ele => {\r\n ele.rollBack();\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * undo变redo,redo变undo\r\n */\r\n public reverseAndExecute() {\r\n this._reverse();\r\n this._execute();\r\n }\r\n\r\n /**\r\n * 合并其它提交\r\n */\r\n public merge(other: UndoRedoEntity) {\r\n const otherAdded = new Set([...other._added]);\r\n const otherDeleted = new Set([...other._deleted]);\r\n const otherModifiedProps: Map<number, IModifiedProps[]> = new Map();\r\n other._modifiedProperties.forEach((v, k) => otherModifiedProps.set(k, v));\r\n\r\n // 新增\r\n for (const ele of [...this._added]) {\r\n DebugUtil.assert(!otherAdded.has(ele), '不可能发生', 'wg', '2026-03-05');\r\n if (otherDeleted.has(ele)) {\r\n // add + delete = null\r\n this._added.delete(ele);\r\n otherDeleted.delete(ele);\r\n } else {\r\n // add + modify = add\r\n otherModifiedProps.delete(ele.id.asInt());\r\n }\r\n }\r\n\r\n // 删除\r\n for (const ele of [...this._deleted]) {\r\n DebugUtil.assert(\r\n !otherAdded.has(ele) &&\r\n !otherDeleted.has(ele) &&\r\n !otherModifiedProps.has(ele.id.asInt()), '不可能发生', 'wg', '2026-03-05');\r\n }\r\n\r\n // 修改\r\n for (const [thisId, thisPvs] of this._modifiedProperties) {\r\n if ([...otherAdded].find(_ => _.id.asInt() === thisId)) {\r\n DebugUtil.assert(false, '不可能发生', 'wg', '2026-03-05');\r\n } else if (otherModifiedProps.has(thisId)) {\r\n const otherPvs = otherModifiedProps.get(thisId);\r\n otherPvs?.forEach(otherPv => {\r\n const thisPv = thisPvs.find(_ => _.propertyName === otherPv.propertyName);\r\n if (thisPv) {\r\n thisPv.newValue = otherPv.newValue;\r\n } else {\r\n thisPvs.push(otherPv);\r\n }\r\n });\r\n // 合并完需要删除\r\n otherModifiedProps.delete(thisId);\r\n } else if ([...otherDeleted].find(_ => _.id.asInt() === thisId)) {\r\n // modify + delete = delete\r\n this._modifiedProperties.delete(thisId);\r\n // 需要把更新回滚\r\n const otherDelElement = [...otherDeleted].find(_ => _.id.asInt() === thisId);\r\n thisPvs.forEach(({ propertyName, oldValue }) => {\r\n const tKey = propertyName;\r\n const tVal = oldValue;\r\n if (otherDelElement) {\r\n otherDelElement.db[tKey] = tVal;\r\n }\r\n });\r\n }\r\n }\r\n\r\n otherAdded.forEach(ele => this._added.add(ele));\r\n otherDeleted.forEach(ele => this._deleted.add(ele));\r\n otherModifiedProps.forEach((v, k) => {\r\n this._modifiedProperties.set(k, v);\r\n });\r\n this._modified.clear();\r\n this._modifiedProperties.forEach((_v, k) => {\r\n const ele = this._doc.getElementByIdEnsure(k);\r\n this._modified.add(ele);\r\n });\r\n }\r\n\r\n /**\r\n * 将操作reverse\r\n */\r\n private _reverse() {\r\n // 新增变删除\r\n const oldAdded = [...this._added];\r\n const oldDeleted = [...this._deleted];\r\n\r\n this._added.clear();\r\n this._deleted.clear();\r\n\r\n oldAdded.forEach(ele => this._deleted.add(ele));\r\n oldDeleted.forEach(ele => this._added.add(ele));\r\n\r\n // 修改\r\n for (const [, values] of this._modifiedProperties) {\r\n for (const v of values) {\r\n [v.oldValue, v.newValue] = [v.newValue, v.oldValue];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 正向执行\r\n */\r\n public _execute() {\r\n this._handleElementsFromDB(false, ...this._added);\r\n // 修改\r\n for (const [id, values] of this._modifiedProperties) {\r\n const element = this._doc.getElementByIdEnsure(id);\r\n for (const v of values) {\r\n const tKey = v.propertyName;\r\n const tVal = v.newValue;\r\n element.db[tKey] = tVal;\r\n }\r\n }\r\n this._handleElementsFromDB(true, ...this._deleted);\r\n this._updateViewCache();\r\n\r\n // TODO 事件分发\r\n }\r\n\r\n /**\r\n * 压缩事务\r\n * 主要处理例如,新增一个Element,然后更改这个Element的属性,事务管理器会记录每一个操作,这时只需要记录增加的操作即可\r\n */\r\n private _compress() {\r\n // add + modified = add\r\n for (const ele of this._added) {\r\n if (this._modified.has(ele)) {\r\n ele.commit();\r\n this._modified.delete(ele);\r\n }\r\n }\r\n\r\n // modified + delete = (rollback modified) + delete\r\n for (const ele of this._deleted) {\r\n if (this._modified.has(ele)) {\r\n ele.rollBack();\r\n this._modified.delete(ele);\r\n }\r\n }\r\n\r\n // add + delete = null\r\n for (const ele of this._deleted) {\r\n if (this._added.has(ele)) {\r\n this._deleted.delete(ele);\r\n this._added.delete(ele);\r\n }\r\n }\r\n }\r\n\r\n /**是否为空*/\r\n public _isEmpty() {\r\n return !this._added.size && !this._deleted.size && !this._modified.size;\r\n }\r\n\r\n /**\r\n * 从容器中增删对象\r\n * @param del 是否删除\r\n * @param eles 对象数组\r\n */\r\n private _handleElementsFromDB(del: boolean, ...eles: IElement[]) {\r\n const eleMgr = this._doc.elementMgr;\r\n eles.forEach(ele => {\r\n if (del) eleMgr.delete(ele.id.asInt());\r\n else eleMgr.add(ele);\r\n });\r\n }\r\n\r\n /**\r\n * 收集使用过的id\r\n */\r\n public collectUsedIds(set: Set<number>) {\r\n [...this._added, ...this._deleted].forEach(e => set.add(e.id.asInt()));\r\n [...this._modifiedProperties.keys()].forEach(id => set.add(id));\r\n }\r\n\r\n /**\r\n * 获取所有修改的ElementId集合\r\n */\r\n public getModifiedElementIds() {\r\n const result: Set<number> = new Set();\r\n this._added.forEach(ele => result.add(ele.id.asInt()));\r\n this._modified.forEach(ele => result.add(ele.id.asInt()));\r\n return result;\r\n }\r\n\r\n private _updateViewCache() {\r\n const changedElements: Set<IElement> = new Set();\r\n for (const [id, values] of this._modifiedProperties) {\r\n const element = this._doc.getElementByIdEnsure(id);\r\n\r\n if (values.find(({ propertyName }) => {\r\n return element?.propShouldCacheToView(propertyName);\r\n })) {\r\n changedElements.add(element);\r\n }\r\n }\r\n\r\n // 刷新视图\r\n this._doc.cacheForViewElementChanged(EN_ModelViewChanged.ELEMENT_CREATE, [...this._added]);\r\n this._doc.cacheForViewElementChanged(EN_ModelViewChanged.ELEMENT_UPDATE, [...changedElements]);\r\n this._doc.cacheForViewElementChanged(EN_ModelViewChanged.ELEMENT_DELETE, [...this._deleted]);\r\n }\r\n}\r\n","import { IDocument } from '../document/i_document';\r\nimport { ITransaction } from './i_transaction';\r\nimport { EN_TransactionStatus } from './i_transaction_base';\r\nimport { ITransactionGroup } from './i_transaction_group';\r\nimport { TransactionBase } from './transaction_base';\r\nimport { UndoRedoEntity } from './undo_redo_entity';\r\n\r\nexport class Transaction extends TransactionBase implements ITransaction {\r\n public readonly undoRedoEntity: UndoRedoEntity;\r\n\r\n public canUndo: boolean = true;\r\n\r\n public parent!: ITransactionGroup;\r\n\r\n constructor(doc: IDocument, name: string) {\r\n super(doc, name);\r\n this.start();\r\n this.undoRedoEntity = new UndoRedoEntity(doc);\r\n }\r\n\r\n public start(): boolean {\r\n super.start();\r\n this.doc.transactionMgr.getLastLeafTranGroup(true)?.clearRedoList();\r\n this.parent = this.getStartParent();\r\n return true;\r\n }\r\n\r\n public commit(): boolean {\r\n // TODO 发送事件\r\n const ok = this.undoRedoEntity.commit();\r\n if (!ok) this.parent.popTransaction(this);\r\n this._status = EN_TransactionStatus.COMMITTED;\r\n return true;\r\n }\r\n\r\n public rollBack(): boolean {\r\n this.undoRedoEntity.rollBack();\r\n\r\n this.parent.popTransaction(this);\r\n super.rollBack();\r\n return true;\r\n }\r\n\r\n public reverseAndExecute(): void {\r\n this.undoRedoEntity.reverseAndExecute();\r\n }\r\n\r\n public merge(another: ITransaction): this {\r\n this.undoRedoEntity.merge(another.undoRedoEntity);\r\n return this;\r\n }\r\n\r\n public collectUsedIds(set: Set<number>): void {\r\n this.undoRedoEntity.collectUsedIds(set);\r\n }\r\n}\r\n","import { IDocument } from '../document/i_document';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { ITransaction } from './i_transaction';\r\nimport { EN_TransactionStatus, ITransactionBase } from './i_transaction_base';\r\nimport { ITransactionGroup } from './i_transaction_group';\r\nimport { Transaction } from './transaction';\r\nimport { TransactionBase } from './transaction_base';\r\n\r\nexport class TransactionGroup extends TransactionBase implements ITransactionGroup {\r\n public undoList: ITransactionBase[] = [];\r\n\r\n public redoList: ITransactionBase[] = [];\r\n\r\n private _maxUndoStackSize: number = 30;\r\n\r\n public parent?: ITransactionGroup;\r\n\r\n constructor(doc: IDocument, name: string, public isRoot = false) {\r\n super(doc, name);\r\n this.isRoot = isRoot;\r\n this.start();\r\n }\r\n\r\n public start() {\r\n // TODO 发送事件\r\n super.start();\r\n if (this.isRoot) return true;\r\n this.doc.transactionMgr.getLastLeafTranGroup(true)?.clearRedoList();\r\n this.parent = this.getStartParent();\r\n return true;\r\n }\r\n\r\n public startTransaction(t: ITransactionBase) {\r\n DebugUtil.assert(\r\n this.getStatus() === EN_TransactionStatus.STARTED,\r\n '事务组已完成,不能再启动事务',\r\n 'wg',\r\n '2026-03-05',\r\n );\r\n\r\n const oldName = this.getCurrentTransaction()?.name;\r\n const newName = t.name;\r\n DebugUtil.assert(\r\n this.getStatus() === EN_TransactionStatus.STARTED && !this.getCurrentTransaction(),\r\n `事务不能嵌套, 新事务${newName}, 未完成的事务${oldName}`,\r\n 'wg',\r\n '2025-03-05',\r\n );\r\n this.undoList.push(t);\r\n this.redoList.splice(0);\r\n const max = Math.max(this.getMaxUndoStackSize(), 4);\r\n if (this.undoList.length <= max) {\r\n return;\r\n }\r\n\r\n const head = this.undoList.shift();\r\n // edit mode will compress all transactions to one single node,so we should merge first node to second\r\n if (head && this.parent) {\r\n const first = this._toTransaction(head);\r\n const second = this._toTransaction(this.undoList[0]);\r\n this.undoList[0] = first.merge(second);\r\n }\r\n }\r\n\r\n /**\r\n * 事务或事务组转成事务\r\n */\r\n private _toTransaction(t: ITransactionBase): ITransaction {\r\n if (t.isTransactionLike(TransactionGroup)) return t._compressToTransaction();\r\n else return t as ITransaction;\r\n }\r\n\r\n /**\r\n * 事务组压缩成事务\r\n */\r\n private _compressToTransaction(): ITransaction {\r\n //空的事务组 压缩成一个空事务\r\n if (!this.undoList.length) {\r\n const empty = new Transaction(this.doc, 'empty');\r\n empty.setStatus(EN_TransactionStatus.COMMITTED);\r\n return empty;\r\n }\r\n\r\n const newName = this.undoList[0].name + '->' + this.undoList[this.undoList.length - 1].name;\r\n\r\n while (this.undoList.length > 1) {\r\n const popped = this.undoList.pop();\r\n DebugUtil.assert(popped, 'undoList不应该为空', 'wg', '2026-03-05');\r\n const next = this._toTransaction(popped);\r\n const pre = this._toTransaction(this.undoList[this.undoList.length - 1]);\r\n this.undoList[this.undoList.length - 1] = pre;\r\n pre.merge(next);\r\n }\r\n\r\n const result = this.undoList[0] as ITransaction;\r\n result.name = newName;\r\n result.canUndo = true;\r\n\r\n return result;\r\n }\r\n\r\n public assimilate(): ITransaction | undefined {\r\n this._status = EN_TransactionStatus.COMMITTED;\r\n if (!this.undoList.length) {\r\n this.parent?.undoList.pop();\r\n return undefined;\r\n }\r\n const transaction = this._compressToTransaction();\r\n this.parent?.replaceTailTransaction(this, transaction);\r\n // TODO 刷新视图, 发送事件\r\n // this.doc.updateView();\r\n return transaction;\r\n }\r\n\r\n /**\r\n * 压缩成一个事务,然后undo\r\n */\r\n public rollBack(): boolean {\r\n super.rollBack();\r\n if (!this.undoList.length) {\r\n this.parent?.undoList.pop();\r\n return true;\r\n }\r\n const transaction = this._compressToTransaction();\r\n this.parent?.replaceTailTransaction(this, transaction);\r\n this.parent?.undoWithoutRedo(transaction);\r\n return true;\r\n }\r\n\r\n public undoWithoutRedo(ut: ITransaction): boolean {\r\n ut.reverseAndExecute();\r\n this.undoList.pop();\r\n return true;\r\n }\r\n\r\n public replaceTailTransaction(tail: ITransactionBase, t: ITransaction) {\r\n DebugUtil.assert(\r\n this.undoList[this.undoList.length - 1] === tail,\r\n '只能替换栈顶事务',\r\n 'wg',\r\n '2026-03-05');\r\n this.undoList[this.undoList.length - 1] = t;\r\n t.parent = this;\r\n return true;\r\n }\r\n\r\n public canUndo(): boolean {\r\n const ut = this.undoList[this.undoList.length - 1];\r\n if (!ut) return false;\r\n\r\n if (ut.isTransactionLike(TransactionGroup)) {\r\n if (ut._undoListNotEmpty()) {\r\n return ut.canUndo();\r\n }\r\n return false;\r\n } else if (ut.isTransactionLike(Transaction)) {\r\n return !!ut.canUndo;\r\n }\r\n return false;\r\n }\r\n\r\n public canRedo(): boolean {\r\n const ut = this.redoList[this.redoList.length - 1];\r\n if (!ut) return false;\r\n\r\n if (ut.isTransactionLike(TransactionGroup)) {\r\n if (ut._redoListNotEmpty()) {\r\n return ut.canRedo();\r\n }\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * undo数组是否为空\r\n */\r\n private _undoListNotEmpty() {\r\n return !!this.undoList.length;\r\n }\r\n\r\n /**\r\n * redo是否为空\r\n */\r\n private _redoListNotEmpty() {\r\n return !!this.redoList.length;\r\n }\r\n\r\n public undo(): boolean {\r\n const ut = this.undoList[this.undoList.length - 1];\r\n if (!ut) return false;\r\n if (ut.isTransactionLike(TransactionGroup)) {\r\n if (ut._undoListNotEmpty()) {\r\n return ut.undo();\r\n }\r\n return false;\r\n } else if (ut.isTransactionLike(Transaction)) {\r\n if (!ut.canUndo) return false;\r\n ut.reverseAndExecute();\r\n this.undoList.pop();\r\n this.redoList.push(ut);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public redo(): boolean {\r\n const ut = this.redoList[this.redoList.length - 1];\r\n if (!ut) return false;\r\n if (ut.isTransactionLike(TransactionGroup)) {\r\n if (ut._redoListNotEmpty()) {\r\n return ut.redo();\r\n }\r\n return false;\r\n } else if (ut.isTransactionLike(Transaction)) {\r\n ut.reverseAndExecute();\r\n this.redoList.pop();\r\n this.undoList.push(ut);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public clearRedoList(): void {\r\n this.redoList.splice(0);\r\n }\r\n\r\n public popTransaction(t: ITransactionBase): boolean {\r\n DebugUtil.assert(this.undoList.pop() === t, '只能pop栈顶事务', 'wg', '2026-03-05');\r\n return true;\r\n }\r\n\r\n public getCurrentTransaction(): ITransaction | undefined {\r\n const t = this.undoList[this.undoList.length - 1];\r\n if (t && t.isTransactionLike(Transaction) && t.getStatus() === EN_TransactionStatus.STARTED)\r\n return t;\r\n return undefined;\r\n }\r\n\r\n public getCurrentTransactionGroup(): ITransactionGroup | undefined {\r\n const t = this.undoList.slice(0)\r\n .reverse()\r\n .find((i) => i.isTransactionLike(TransactionGroup) && i.getStatus() === EN_TransactionStatus.STARTED);\r\n if (t && t.isTransactionLike(TransactionGroup)) {\r\n return t.getCurrentTransactionGroup();\r\n }\r\n if (this.getStatus() === EN_TransactionStatus.STARTED) {\r\n return this;\r\n }\r\n return undefined;\r\n }\r\n\r\n public getLastLeafTransGroup(undoList: boolean): ITransactionGroup | undefined {\r\n let t: ITransactionBase | undefined;\r\n if (this.undoList[this.undoList.length - 1]) {\r\n t = this.undoList[this.undoList.length - 1];\r\n } else {\r\n const list = undoList ? this.undoList : this.redoList;\r\n t = list[list.length - 1];\r\n }\r\n if (!t) return this;\r\n if (t.isTransactionLike(Transaction)) {\r\n return t.parent;\r\n }\r\n if (t.isTransactionLike(TransactionGroup)) {\r\n return t.getLastLeafTransGroup(undoList);\r\n }\r\n }\r\n\r\n public setMaxUndoStackSize(size: number): void {\r\n this._maxUndoStackSize = size;\r\n }\r\n\r\n public getMaxUndoStackSize(): number {\r\n return this._maxUndoStackSize || this.parent?.getMaxUndoStackSize() || 30;\r\n }\r\n\r\n public collectUsedIds(set: Set<number>): void {\r\n this.undoList.concat(this.redoList).forEach(t => t.collectUsedIds(set));\r\n }\r\n}\r\n","import { IDocument } from '../document/i_document';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { ITransaction } from './i_transaction';\r\nimport { ITransactionGroup } from './i_transaction_group';\r\nimport { TransactionGroup } from './transaction_group';\r\nimport { UndoRedoEntity } from './undo_redo_entity';\r\n\r\n/**\r\n * 事务管理器\r\n */\r\nexport class TransactionMgr {\r\n /**事务树的根节点*/\r\n private _rootNode!: ITransactionGroup;\r\n\r\n public init(doc: IDocument) {\r\n this._rootNode = new TransactionGroup(doc, 'root', true);\r\n this.setMaxUndoStackSize(50);\r\n }\r\n\r\n /**\r\n * 清空事务树\r\n */\r\n public clear() {\r\n this._rootNode.undoList.splice(0);\r\n this._rootNode.clearRedoList();\r\n }\r\n\r\n /**\r\n * 设置最大回撤步数\r\n */\r\n public setMaxUndoStackSize(size: number) {\r\n this._rootNode.setMaxUndoStackSize(size);\r\n }\r\n\r\n /**\r\n * 获取当前正在进行的事务\r\n */\r\n public getCurrentTransaction(): ITransaction | undefined {\r\n const group = this._rootNode.getCurrentTransactionGroup();\r\n if (!group) return undefined;\r\n return group.getCurrentTransaction();\r\n }\r\n\r\n /**\r\n * 获取当前事务组\r\n */\r\n public getCurrentTransactionGroup(): ITransactionGroup | undefined {\r\n return this._rootNode.getCurrentTransactionGroup();\r\n }\r\n\r\n /**\r\n * 获取最后的叶子节点事务组\r\n */\r\n public getLastLeafTranGroup(undoList: boolean): ITransactionGroup | undefined {\r\n return this._rootNode.getLastLeafTransGroup(undoList);\r\n }\r\n\r\n /**\r\n * 获取当前正在进行的事务的undoRedoEntity\r\n */\r\n public getCurrentUndoRedoEntity(): UndoRedoEntity {\r\n const transaction = this.getCurrentTransaction();\r\n DebugUtil.assert(transaction, '没有事务', 'wg', '2025-11-18');\r\n return transaction.undoRedoEntity;\r\n }\r\n\r\n /**\r\n * 撤销\r\n */\r\n public undo() {\r\n const result = !!this.getLastLeafTranGroup(true)?.undo();\r\n return result;\r\n }\r\n\r\n /**\r\n * 回退\r\n */\r\n public redo() {\r\n const result = !!this.getLastLeafTranGroup(false)?.redo();\r\n return result;\r\n }\r\n\r\n /**\r\n * 是否可撤销\r\n */\r\n public canUndo() {\r\n return !!this.getLastLeafTranGroup(true)?.canUndo();\r\n }\r\n\r\n /**\r\n * 是否可回退\r\n */\r\n public canRedo() {\r\n return !!this.getLastLeafTranGroup(false)?.canRedo();\r\n }\r\n\r\n public idPoolGC(): Set<number> {\r\n const set = new Set<number>();\r\n this._rootNode.collectUsedIds(set);\r\n return set;\r\n }\r\n}\r\n","import type { IDocument } from '../document/i_document'\r\nimport { ClassManager } from '../toolkit/class_manager'\r\nimport { DebugUtil } from '../toolkit/debug_util'\r\nimport { ITransaction } from '../transaction/i_transaction'\r\nimport { ITransactionGroup } from '../transaction/i_transaction_group'\r\nimport { Transaction } from '../transaction/transaction'\r\nimport { TransactionGroup } from '../transaction/transaction_group'\r\nimport { IConstructor } from '../types/type_guard'\r\nimport { IRequest } from './i_request'\r\nimport { Request } from './request'\r\n\r\n/**\r\n * RequestMgr 用法说明:\r\n * 1) 单次请求:createReq -> executeReq(req, true)\r\n * 2) 可取消请求:createReq -> executeReq(req, false) -> 后续 commit/cancel\r\n * 3) 会话请求:\r\n * startSession()\r\n * createReq/executeReq 多次\r\n * 成功 commitSession(),失败 abortSession()\r\n *\r\n * 约束:\r\n * - 仅当 req.canTransact() 为 true 时会创建 Transaction。\r\n * - abortSession/cancelReq 会回滚当前事务或事务组。\r\n */\r\nexport class RequestMgr {\r\n private static _instance?: RequestMgr\r\n\r\n private _doc!: IDocument\r\n\r\n /** Request 类管理器 */\r\n private _requestClsMgr = new ClassManager<string, IConstructor<Request>>()\r\n\r\n private _transGroup?: ITransactionGroup\r\n\r\n private _transaction?: ITransaction\r\n\r\n public static getInstance(): RequestMgr {\r\n if (!this._instance) {\r\n this._instance = new RequestMgr()\r\n }\r\n return this._instance\r\n }\r\n\r\n public init(doc: IDocument): void {\r\n this._doc = doc\r\n }\r\n\r\n /**\r\n * 注册请求\r\n */\r\n public registerRequest(requestId: string, request: IConstructor<Request>) {\r\n this._requestClsMgr.registerCls(requestId, request);\r\n }\r\n\r\n public startSession(name: string = ''): void {\r\n DebugUtil.assert(!this._transGroup, '请先提交上一个 request', 'wg', '2026-03-05')\r\n this._transGroup = new TransactionGroup(this._doc, name)\r\n }\r\n\r\n public commitSession(): void {\r\n this._transGroup?.assimilate()\r\n this._doc.updateView();\r\n this._transGroup = undefined\r\n }\r\n\r\n public abortSession(): void {\r\n this._transGroup?.rollBack()\r\n this._doc.updateView();\r\n this._transGroup = undefined\r\n }\r\n\r\n /**\r\n * 创建请求\r\n */\r\n public createReq<T extends IConstructor<Request>>(ctor: T, ...args: ConstructorParameters<T>): InstanceType<T> {\r\n const req = new ctor(...args)\r\n req.setDoc(this._doc)\r\n const reqName = this._requestClsMgr.getClsNameEnsure(ctor)\r\n if (req.canTransact()) {\r\n this._transaction = new Transaction(this._doc, `${reqName}-start`)\r\n }\r\n\r\n return req as InstanceType<T>\r\n }\r\n\r\n public executeReq<T extends IRequest, R = ReturnType<T['execute']>>(req: T, commit = true): R {\r\n const result = req.execute()\r\n if (!commit || !req.canTransact()) {\r\n this._doc.updateView();\r\n return result as R\r\n }\r\n DebugUtil.assert(this._transaction, '请先创建一个 request', 'wg', '2026-03-05')\r\n this._transaction?.commit()\r\n this._doc.updateView();\r\n // TODO 事件分发\r\n this._transaction = undefined\r\n\r\n return result as R\r\n }\r\n\r\n public cancelReq(): void {\r\n this._transaction?.rollBack()\r\n this._doc.updateView();\r\n this._transaction = undefined\r\n }\r\n}\r\n\r\nexport const requestMgr = RequestMgr.getInstance()\r\n","import type { IMgrDisplayRenderData } from './display_object'\nimport { DisplayObject } from './display_object'\n\nexport class DisplayObjectMgr {\n /** 显示对象集合。 */\n private _displayMap: Map<number, DisplayObject>\n\n /** 本轮被移除的显示对象 id。 */\n private _removedSet: Set<number>\n\n /** 单例实例。 */\n private static _instance: DisplayObjectMgr\n\n constructor() {\n this._displayMap = new Map()\n this._removedSet = new Set()\n }\n\n public addDisplay(display: DisplayObject): void {\n this._displayMap.set(display.id, display)\n }\n\n public getDisplay<T extends DisplayObject>(id: number): T | undefined {\n return this._displayMap.get(id) as T\n }\n\n public removeDisplayById(id: number): boolean {\n const display = this._displayMap.get(id)\n if (!display) {\n return false\n }\n this._displayMap.delete(id)\n display.dispose()\n this._removedSet.add(id)\n return true\n }\n\n /**\n * 渲染前准备\n */\n public onBeforeRender(rebuild = false): {\n update: IMgrDisplayRenderData[]\n remove: number[]\n } {\n const update: IMgrDisplayRenderData[] = []\n\n for (const [id, display] of this._displayMap) {\n const renderData = display.onBeforeRender(rebuild)\n if (renderData) {\n update.push({ ...renderData, id })\n }\n }\n\n const remove = Array.from(this._removedSet)\n this._removedSet.clear()\n\n return { update, remove }\n }\n\n public clearDisplay(): void {\n for (const [id, display] of this._displayMap) {\n display.dispose()\n this._removedSet.add(id)\n }\n this._displayMap.clear()\n }\n\n public static instance(): DisplayObjectMgr {\n if (!this._instance) {\n this._instance = new DisplayObjectMgr()\n }\n return this._instance\n }\n}\n","import { EN_RNODE_TYPE } from '../types/type_define';\r\nimport { Matrix4, types, Vec3 } from '@ccpc/math'\r\nimport { IConstructor } from '../types/type_guard';\r\nimport { GNode } from '../grep/gnode';\r\nimport { IStyle } from '../grep/i_style';\r\n/**\r\n * 渲染对象,所有的几何对象都要离散为此数据结构\r\n */\r\nexport class RenderNode {\r\n public parent?: RenderGroup;\r\n\r\n public gnode!: GNode;\r\n\r\n public style: IStyle = {}\r\n\r\n public type: EN_RNODE_TYPE = EN_RNODE_TYPE.UNKOWN;\r\n\r\n public globalMatrix?: Matrix4\r\n\r\n public copyWorldMatrix(m?: Matrix4): void {\r\n this.globalMatrix = m?.clone()\r\n }\r\n\r\n public traverse(callback: (rNode: RenderNode) => void) {\r\n callback(this)\r\n if (this instanceof RenderGroup) {\r\n this.children.forEach(child => {\r\n child.traverse(callback)\r\n })\r\n }\r\n }\r\n\r\n public clone() {\r\n const Ctor = this.constructor as IConstructor<this>\r\n const copy = new Ctor()\r\n copy.parent = this.parent\r\n copy.gnode = this.gnode\r\n copy.globalMatrix = this.globalMatrix?.clone()\r\n return copy\r\n }\r\n}\r\n\r\nexport class RenderGroup extends RenderNode {\r\n public children: Array<RenderNode> = [];\r\n\r\n public type: EN_RNODE_TYPE = EN_RNODE_TYPE.GROUP;\r\n\r\n public add(node: RenderNode): void {\r\n this.children.push(node);\r\n node.parent = this;\r\n }\r\n\r\n public override clone(): this {\r\n const copy = super.clone();\r\n this.children.forEach(child => {\r\n copy.add(child.clone())\r\n })\r\n return copy\r\n }\r\n}\r\n\r\nexport class RenderPoint extends RenderNode {\r\n public point!: Vec3\r\n\r\n public type: EN_RNODE_TYPE = EN_RNODE_TYPE.POINT;\r\n\r\n // TODO clone方法\r\n}\r\n\r\nexport class RenderEdge extends RenderNode {\r\n public points!: Vec3[];\r\n\r\n public type: EN_RNODE_TYPE = EN_RNODE_TYPE.EDGE;\r\n\r\n // TODO clone方法\r\n}\r\n\r\n/**\r\n * 文字\r\n */\r\nexport class RenderText extends RenderNode {\r\n public text: string = ''\r\n\r\n public opacity: number = 1;\r\n\r\n public position: types.IXYZ = Vec3.O()\r\n\r\n public clone() {\r\n const copy = super.clone()\r\n copy.text = this.text\r\n copy.opacity = this.opacity\r\n copy.position = new Vec3(this.position)\r\n return copy\r\n }\r\n}\r\n\r\n/**\r\n * 三角面片\r\n */\r\nexport class RenderMesh extends RenderNode {\r\n private _verts: Float32Array | undefined;\r\n\r\n private _indices: Uint32Array | undefined;\r\n\r\n private _normals: Float32Array | undefined;\r\n\r\n private _uvs: Float32Array | undefined;\r\n\r\n /**\r\n * 点集,一个点由一个索引组成\r\n * 离散后的所有顶点, 此数据不渲染,只做存储使用\r\n */\r\n public setVerts(verts: types.IXYZ[] | Float32Array) {\r\n if (verts instanceof Float32Array) {\r\n this._verts = verts;\r\n } else {\r\n this._verts = new Float32Array(3 * verts.length);\r\n for (let i = 0; i < verts.length; i++) {\r\n this._verts[i * 3] = verts[i].x;\r\n this._verts[i * 3 + 1] = verts[i].y;\r\n this._verts[i * 3 + 2] = verts[i].z;\r\n }\r\n }\r\n }\r\n\r\n public setIndices(indices: number[][] | Uint32Array) {\r\n if (indices instanceof Uint32Array) {\r\n this._indices = indices;\r\n } else {\r\n this._indices = new Uint32Array(3 * indices.length);\r\n for (let i = 0; i < indices.length; i++) {\r\n this._indices[i * 3] = indices[i][0];\r\n this._indices[i * 3 + 1] = indices[i][1];\r\n this._indices[i * 3 + 2] = indices[i][2];\r\n }\r\n }\r\n }\r\n\r\n public setNormals(normals: types.IXYZ[] | Float32Array) {\r\n if (normals instanceof Float32Array) {\r\n this._normals = normals;\r\n } else {\r\n this._normals = new Float32Array(3 * normals.length);\r\n for (let i = 0; i < normals.length; i++) {\r\n this._normals[i * 3] = normals[i].x;\r\n this._normals[i * 3 + 1] = normals[i].y;\r\n this._normals[i * 3 + 2] = normals[i].z;\r\n }\r\n }\r\n }\r\n\r\n public setUVs(uvs: types.IXY[] | Float32Array) {\r\n if (uvs instanceof Float32Array) {\r\n this._uvs = uvs;\r\n } else {\r\n this._uvs = new Float32Array(2 * uvs.length);\r\n for (let i = 0; i < uvs.length; i++) {\r\n this._uvs[i * 2] = uvs[i].x;\r\n this._uvs[i * 2 + 1] = uvs[i].y;\r\n }\r\n }\r\n }\r\n\r\n public getVertexes(): Vec3[] {\r\n if (!this._verts) {\r\n return [];\r\n }\r\n\r\n const result: Vec3[] = [];\r\n for (let i = 0; i < this._verts.length / 3; i++) {\r\n result.push(new Vec3(this._verts[i * 3], this._verts[i * 3 + 1], this._verts[i * 3 + 2]));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getVerts(): Float32Array {\r\n return this._verts ? this._verts : new Float32Array();\r\n }\r\n\r\n public getIndices(): Uint32Array {\r\n return this._indices ? this._indices : new Uint32Array();\r\n }\r\n\r\n public getNormals(): Float32Array {\r\n return this._normals ? this._normals : new Float32Array();\r\n }\r\n\r\n public getUVs(): Float32Array {\r\n return this._uvs ? this._uvs : new Float32Array();\r\n }\r\n\r\n public clone() {\r\n const copy = super.clone()\r\n copy.setVerts(Float32Array.from(this._verts || []));\r\n copy.setNormals(Float32Array.from(this._normals || []));\r\n copy.setUVs(Float32Array.from(this._uvs || []));\r\n copy.setIndices(Uint32Array.from(this._indices || []));\r\n return copy\r\n }\r\n\r\n /**\r\n * 将目标RenderMesh合并到当前RenderMesh, 会改变this\r\n * @param 目标RenderMesh\r\n */\r\n public merge(renderMesh: RenderMesh) {\r\n if (!renderMesh.getVerts().length) {\r\n return;\r\n }\r\n const verts1: number[] = Array.from(this._verts || []);\r\n const length1 = verts1.length / 3;\r\n const verts2: number[] = Array.from(renderMesh.getVerts());\r\n verts1.push(...verts2);\r\n\r\n const normals1: number[] = Array.from(this._normals || []);\r\n const normals2: number[] = Array.from(renderMesh.getNormals());\r\n normals1.push(...normals2);\r\n\r\n const uvs1: number[] = Array.from(this._uvs || []);\r\n const uvs2: number[] = Array.from(renderMesh.getUVs());\r\n uvs1.push(...uvs2);\r\n\r\n const indices1: number[] = Array.from(this._indices || []);\r\n let indices2: number[] = Array.from(renderMesh.getIndices());\r\n indices2 = indices2.map(n => n + length1);\r\n indices1.push(...indices2);\r\n\r\n this._verts = new Float32Array(verts1);\r\n this._normals = new Float32Array(normals1);\r\n this._uvs = new Float32Array(uvs1);\r\n this._indices = new Uint32Array(indices1);\r\n }\r\n}\r\n","import { Matrix4 } from '@ccpc/math';\r\n\r\nexport class CMathUtil {\r\n public static composeMatrix(mat1?: Matrix4, mat2?: Matrix4) {\r\n if (!mat1) return mat2?.clone()\r\n if (!mat2) return mat1.clone()\r\n const m = mat1.multiplied(mat2)\r\n return m\r\n }\r\n}\r\n","export enum GNODE_TYPE {\n INVALID = -1, // 默认(非法)\n GPoint2d = 1,\n GCurve2d = 2,\n GGroup = 3,\n GRep = 4,\n GPolygon = 5,\n GPolycurve = 6,\n GText2d = 7,\n}\n","import { DiscreteParam, Matrix4 } from '@ccpc/math'\r\nimport { RenderNode } from '../render/render_node'\r\nimport { CMathUtil } from '../toolkit/cmath_util'\r\nimport { DebugUtil } from '../toolkit/debug_util'\r\nimport { ElementId } from '../element/element_id'\r\nimport { GRep } from './grep'\r\nimport { GGroup } from './ggroup'\r\nimport { GNODE_TYPE } from './gnode_type'\r\nimport { IStyle } from './i_style'\r\n\r\n/**\r\n * 表示图形的基本单元, 包括几何数据和显示样式\r\n */\r\nexport abstract class GNode {\r\n\r\n public static gId = 0\r\n /**\r\n * dynamic global incremental\r\n */\r\n public readonly globalID: number\r\n\r\n public parent?: GNode\r\n\r\n /**\r\n * 相对父节点局部矩阵\r\n */\r\n protected _localMatrix?: Matrix4\r\n\r\n /**\r\n * 根节点累计到当前的世界矩阵\r\n */\r\n protected _globalMatrix?: Matrix4\r\n\r\n /**\r\n * 对应的渲染节点\r\n * 一旦创建出来, 会复用并在需要时同步矩阵\r\n */\r\n protected _renderNode?: RenderNode\r\n\r\n /**\r\n * 渲染节点样式\r\n */\r\n protected _style: IStyle = {}\r\n\r\n protected _canPick = true\r\n\r\n protected _canSnap = true\r\n\r\n public get elementId() {\r\n const root = this.getRoot()\r\n return root instanceof GRep\r\n ? root.elementId\r\n : ElementId.INVALID\r\n }\r\n\r\n public get localMatrix(): Matrix4 | undefined {\r\n return this._localMatrix\r\n }\r\n\r\n public set localMatrix(value: Matrix4) {\r\n this._localMatrix = value\r\n }\r\n\r\n public get globalMatrix() {\r\n return this._globalMatrix\r\n }\r\n\r\n constructor() {\r\n GNode.gId += 1\r\n this.globalID = GNode.gId\r\n }\r\n\r\n /**\r\n * set local style only (without mixing with parent style)\r\n */\r\n public setStyle(style: IStyle) {\r\n this._style = Object.assign(this._style, style)\r\n return this\r\n }\r\n\r\n /**\r\n * get final style mixing child and parent\r\n */\r\n public getStyle() {\r\n const style = this._style\r\n const pStyle: IStyle = this.parent ? this.parent.getStyle() : {}\r\n return Object.assign(pStyle, style)\r\n }\r\n\r\n public get canPick() {\r\n if (!this._canPick) return false\r\n return this.parent ? this.parent.canPick : true\r\n }\r\n\r\n public set canPick(canPick: boolean) {\r\n this._canPick = canPick\r\n }\r\n\r\n public get canSnap() {\r\n if (!this._canSnap) return false\r\n return this.parent ? this.parent.canSnap : true\r\n }\r\n\r\n public set canSnap(canSnap: boolean) {\r\n this._canSnap = canSnap\r\n }\r\n\r\n /**\r\n * GNode->RenderNode入口\r\n */\r\n public toRenderNode(discreteParams?: DiscreteParam) {\r\n this.updateRenderNode(discreteParams)\r\n DebugUtil.assert(this._renderNode, '转RenderNode失败', 'wg', '2026-03-11')\r\n return this._renderNode\r\n }\r\n\r\n /**\r\n * 更新GNode对应的RenderNode\r\n */\r\n public updateRenderNode(discreteParams?: DiscreteParam) {\r\n if (!this._renderNode) {\r\n this._renderNode = this._toRenderNodeWithoutMatrix(discreteParams)\r\n }\r\n this._renderNode.gnode = this\r\n if (this._globalMatrix) {\r\n this._renderNode.copyWorldMatrix(this._globalMatrix)\r\n }\r\n }\r\n\r\n /**\r\n * 设置局部坐标变换\r\n */\r\n public setLocalMatrix(mat?: Matrix4) {\r\n this._localMatrix = mat?.clone()\r\n }\r\n\r\n /**\r\n * 从当前节点的树根计算整棵子树的世界矩阵\r\n */\r\n public updateGlobalMatrix() {\r\n const root = this.getRoot()\r\n root._updateMatrix()\r\n }\r\n\r\n /**\r\n * 递归计算当前节点及子节点的世界矩阵\r\n */\r\n protected _updateMatrix(parentGlobalMatrix?: Matrix4) {\r\n this._globalMatrix = CMathUtil.composeMatrix(parentGlobalMatrix, this._localMatrix)\r\n if (this._renderNode) {\r\n this._renderNode.globalMatrix = this._globalMatrix?.clone()\r\n }\r\n const children = this.getTraverseChildren()\r\n children.forEach(child => {\r\n child._updateMatrix(this._globalMatrix)\r\n })\r\n }\r\n\r\n /**\r\n * 查整根树的根节点\r\n */\r\n public getRoot() {\r\n let curNode: GNode = this.parent || this\r\n while (curNode.parent) {\r\n curNode = curNode.parent\r\n }\r\n return curNode\r\n }\r\n\r\n public traverse(callback: (gnode: GNode) => void) {\r\n callback(this)\r\n this.getTraverseChildren().forEach(child => {\r\n child.traverse(callback)\r\n })\r\n }\r\n\r\n /**\r\n * 返回当前节点的可遍历子节点\r\n */\r\n public getTraverseChildren(): Array<GNode> {\r\n return []\r\n }\r\n\r\n public getType(): GNODE_TYPE {\r\n return GNODE_TYPE.INVALID\r\n }\r\n\r\n /**\r\n * 通过离散等方式生成对应的RenderNode\r\n */\r\n protected abstract _toRenderNodeWithoutMatrix(discreteParams?: DiscreteParam): RenderNode\r\n\r\n /**\r\n * 清除_renderNode\r\n * @param clearChildren 是否清除子节点renderNode\r\n * @param clearParent 是否清除父节点renderNode\r\n */\r\n public clearRenderNode(clearChildren = false, clearParent = false) {\r\n delete this._renderNode\r\n if (clearParent) {\r\n let gnode = this.parent\r\n while (gnode) {\r\n delete gnode._renderNode\r\n gnode = gnode.parent\r\n }\r\n return\r\n }\r\n if (clearChildren) {\r\n this.getTraverseChildren().forEach(child => {\r\n child.clearRenderNode(clearChildren)\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 从父节点移除\r\n */\r\n public removeFromParent() {\r\n if (!this.parent || !(this.parent instanceof GGroup)) return false\r\n return this.parent.removeNode(this)\r\n }\r\n\r\n /**\r\n * 克隆\r\n * @param cloneGeo 是否深拷贝底层几何对象\r\n */\r\n public abstract clone(cloneGeo?: boolean): GNode\r\n\r\n /**\r\n * 从其它实例复制状态\r\n */\r\n protected _copyFrom(another: GNode) {\r\n this._style = { ...another._style }\r\n this._localMatrix = another._localMatrix?.clone()\r\n this._globalMatrix = another._globalMatrix?.clone()\r\n this._canPick = another._canPick\r\n this._canSnap = another._canSnap\r\n return this\r\n }\r\n\r\n}\r\n","import { DiscreteParam } from '@ccpc/math';\nimport { RenderGroup, RenderNode } from '../render/render_node';\nimport { GNode } from './gnode';\nimport { GNODE_TYPE } from './gnode_type';\n\r\nexport class GGroup extends GNode {\r\n /**\r\n * 子节点\r\n */\r\n protected _children: Array<GNode> = []\r\n\r\n public get children() {\r\n return this._children\r\n }\r\n\r\n public isEmpty(): boolean {\r\n return this._children.length < 1;\r\n }\r\n\r\n /**\r\n * 添加子节点\r\n */\r\n public addNode(node: GNode, index?: number) {\r\n if (node.parent) {\r\n node.removeFromParent()\r\n }\r\n node.parent = this\r\n if (index !== undefined) {\r\n this.children.splice(index, 0, node)\r\n } else {\r\n this._children.push(node)\r\n }\r\n return node\r\n }\r\n\r\n /**\r\n * 移除子节点\r\n */\r\n public removeNode(node: GNode) {\r\n const index = this.children.findIndex(_ => _ === node)\r\n if (index < 0) return false\r\n node.parent = undefined\r\n this.children.splice(index, 1)\r\n return true\r\n }\r\n\r\n /**\r\n * 批量添加子节点\r\n */\r\n public addNodes(...nodes: Array<GNode | GNode[]>): void {\r\n nodes.flat().forEach(node => this.addNode(node));\r\n }\r\n\r\n public getTraverseChildren(): GNode[] {\n return [...this._children];\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GGroup\n }\n\r\n protected _toRenderNodeWithoutMatrix(discreteParams?: DiscreteParam): RenderNode {\r\n const render = new RenderGroup();\r\n this._children.forEach(child => {\r\n const renderNode = child.toRenderNode(discreteParams)\r\n if (renderNode) render.add(renderNode);\r\n });\r\n return render;\r\n }\r\n\r\n public clone(cloneGeo?: boolean): GGroup {\r\n return new GGroup()._copyFrom(this, cloneGeo)\r\n }\r\n\r\n protected _copyFrom(another: GGroup, cloneGeo?: boolean): this {\r\n super._copyFrom(another)\r\n another._children.forEach(child => {\r\n this.addNode(child.clone(cloneGeo))\r\n })\r\n return this\r\n }\r\n\r\n}\r\n","import { ElementId } from '../element/element_id';\nimport { GGroup } from './ggroup';\nimport { GNODE_TYPE } from './gnode_type';\n\r\n// TODO 补充完整\r\nexport class GRep extends GGroup {\r\n\r\n protected _elementId = ElementId.INVALID\r\n\r\n /**\r\n * 为减少对象的构造,可直接引用GRep.empty,来构造空的grep\r\n */\r\n public static get empty() {\r\n return new GRep();\r\n }\r\n\r\n public get elementId() {\r\n return this._elementId\r\n }\r\n\r\n public set elementId(eId: ElementId) {\n this._elementId = eId\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GRep\n }\n\r\n public clone(cloneGeo?: boolean): GRep {\r\n return new GRep()._copyFrom(this, cloneGeo)\r\n }\r\n\r\n protected _copyFrom(another: GRep, cloneGeo?: boolean) {\r\n super._copyFrom(another, cloneGeo)\r\n this.elementId = another.elementId\r\n return this\r\n }\r\n}\r\n","import { IPrototype } from '../types/type_guard';\r\nimport type { StateObject } from './state_object';\r\n\r\nexport function dirtyProp<T extends StateObject>(equals?: (o: unknown, n: unknown) => boolean) {\r\n return function (target: IPrototype<T>, fieldName: string) {\r\n const privateName = `_${fieldName}`;\r\n Object.defineProperty(\r\n target,\r\n fieldName,\r\n {\r\n get(this: T) {\r\n return this._dirtyPropsPool.get(privateName)\r\n },\r\n set(this: T, value: unknown) {\r\n const oldVal = this._dirtyPropsPool.get(privateName)\r\n if (equals) {\r\n if (!equals(oldVal, value)) {\r\n this.dirty();\r\n }\r\n } else {\r\n if (oldVal !== value) {\r\n this.dirty();\r\n }\r\n }\r\n this._dirtyPropsPool.set(privateName, value)\r\n },\r\n },\r\n );\r\n };\r\n}\r\n","export abstract class StateObject {\r\n /** 脏标识 */\r\n private _dirty = true;\r\n\r\n /** 注销状态 */\r\n private _disposed = false;\r\n\r\n /** 脏属性池 */\r\n protected _dirtyPropsPool = new Map<string, unknown>()\r\n\r\n /**\r\n * 脏处理\r\n */\r\n public dirty(): void {\r\n this._dirty = true;\r\n }\r\n\r\n /**\r\n * 清理脏\r\n */\r\n public unDirty(): void {\r\n this._dirty = false;\r\n }\r\n\r\n /**\r\n * 是否脏\r\n * @returns boolean\r\n */\r\n public isDirty(): boolean {\r\n return this._dirty;\r\n }\r\n\r\n /**\r\n * 注销\r\n */\r\n public dispose(): void {\r\n this._disposed = true;\r\n this._dirtyPropsPool.clear()\r\n }\r\n\r\n /**\r\n * 是否注销\r\n * @returns\r\n */\r\n public isDisposed(): boolean {\r\n return this._disposed;\r\n }\r\n}\r\n","import type { GRep } from '../grep'\nimport { dirtyProp } from '../../display/dirty_prop'\nimport { StateObject } from '../../display/state_object'\n\nexport interface IDisplayRenderData {\n gRep?: GRep\n}\n\nexport interface IMgrDisplayRenderData extends IDisplayRenderData {\n id: number\n}\n\n/**\n * 最小单类显示对象。\n * 当前只保留跑通 GRep 渲染链路需要的公共能力。\n */\nexport abstract class DisplayObject extends StateObject {\n private static _dID = 0\n\n /**\n * 统一显示对象 id,后续可作为渲染层主键。\n */\n public readonly id: number\n\n /**\n * 在render层创建出group后,设置visible属性。\n * display 直接改,modelview里 updateElementVisible。\n * 控制整棵树显隐,grep中的visible控制图元是否参与渲染。\n */\n @dirtyProp()\n public visible?: boolean\n\n constructor() {\n super()\n this.id = ++DisplayObject._dID\n }\n\n /**\n * 统一判断当前对象是否应该显示。\n */\n public testVisible(): boolean {\n const visible = this.visible != null ? this.visible : true\n return visible && this.visibleCheck()\n }\n\n /**\n * 给子类补充额外显示条件。\n */\n public visibleCheck(): boolean {\n return true\n }\n\n public onBeforeRender(rebuild = false): IDisplayRenderData | null {\n if (rebuild || this.isDirty()) {\n const data = this.onRender()\n this.unDirty()\n return data\n }\n return null\n }\n\n public onRender(): IDisplayRenderData | null {\n return null\n }\n\n public override dispose(): void {\n super.dispose()\n }\n}\n","import type { GRep } from '../grep'\nimport { dirtyProp } from '../../display/dirty_prop'\nimport type { IDisplayRenderData } from './display_object'\nimport { DisplayObject } from './display_object'\n\nexport class GrepDisplay extends DisplayObject {\n /**\n * 当前显示对象对应的 GRep。\n */\n @dirtyProp()\n public gRep!: GRep\n\n /**\n * 关联的 elementId。\n * 先保留,便于继续兼容当前 ModelView 链路。\n */\n public eId!: number\n\n public getGRep(): GRep {\n return this.gRep\n }\n\n public override onRender(): IDisplayRenderData | null {\n return { gRep: this.gRep }\n }\n}\n","import { GRep } from '../grep/grep';\r\nimport { IRender } from './i_render';\r\n\r\nexport class NullRender implements IRender {\r\n public drawActives(_greps: GRep[]): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n public clearActive(): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n public clearSelection(): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n public drawSelections(_greps: GRep[]): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n public updateView(): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n\r\n public updateImmediately(): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\n","import { IElement } from '../element/i_element'\r\nimport { IHighLight } from './i_high_light'\r\nimport { ISelection } from './i_selection'\r\nimport { EN_ModelViewChanged } from '../types/type_define'\r\n/**\r\n * 缓存视图层发生的变化\r\n */\r\nexport class ModelChangedCache {\r\n public container = new Map<EN_ModelViewChanged, Set<number>>()\r\n\r\n public highLight?: IHighLight\r\n\r\n public selection?: ISelection\r\n\r\n constructor() {\r\n const arr = [\r\n EN_ModelViewChanged.ELEMENT_CREATE,\r\n EN_ModelViewChanged.ELEMENT_DELETE,\r\n EN_ModelViewChanged.ELEMENT_UPDATE]\r\n arr.forEach(i => this.container.set(i, new Set()))\r\n }\r\n\r\n /**\r\n * 是否发生改变\r\n */\r\n public isChange() {\r\n for (const set of this.container.values()) {\r\n if (set.size) return true\r\n }\r\n\r\n return this.selection || this.highLight\r\n }\r\n\r\n /**\r\n * 缓存变化的Element\r\n * 先删+更新/创建 = 更新\r\n * 更新/创建+删除 = 删除\r\n */\r\n public cacheElementChanged(type: EN_ModelViewChanged, elements: IElement[]) {\r\n const fElements = elements.filter(_ => !_.dontShowView());\r\n const modifiedContainer = this.container.get(EN_ModelViewChanged.ELEMENT_UPDATE);\r\n const deleteContainer = this.container.get(EN_ModelViewChanged.ELEMENT_DELETE);\r\n if (EN_ModelViewChanged.ELEMENT_CREATE === type || EN_ModelViewChanged.ELEMENT_UPDATE === type) {\r\n fElements.forEach(e => {\r\n if (deleteContainer?.has(e.id.asInt())) {\r\n deleteContainer.delete(e.id.asInt());\r\n }\r\n modifiedContainer?.add(e.id.asInt());\r\n });\r\n } else if (EN_ModelViewChanged.ELEMENT_DELETE === type) {\r\n fElements.forEach(e => {\r\n if (modifiedContainer?.has(e.id.asInt())) {\r\n modifiedContainer.delete(e.id.asInt());\r\n }\r\n deleteContainer?.add(e.id.asInt());\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 缓存高亮\r\n */\r\n public cacheHighLight(highLight: IHighLight) {\r\n this.highLight = highLight\r\n }\r\n\r\n /**\r\n * 缓存选择集\r\n */\r\n public cacheSelection(selection: ISelection) {\r\n this.selection = selection\r\n }\r\n\r\n /**\r\n * 清空缓存\r\n */\r\n public clear() {\r\n for (const set of this.container.values()) {\r\n set.clear();\r\n }\r\n delete this.highLight\r\n delete this.selection\r\n }\r\n}\r\n","\r\n/**\r\n * 文字水平对齐\r\n */\r\nexport enum EN_AnchorX {\r\n Left = 'left',\r\n Center = 'center',\r\n Right = 'right',\r\n}\r\n\r\n/**\r\n * 文字垂直对齐\r\n */\r\nexport enum EN_AnchorY {\r\n Top = 'top',\r\n Middle = 'middle',\r\n Bottom = 'bottom',\r\n}\r\n\r\nexport type IPointStyle = Partial<{\r\n color: number | string,\r\n opacity: number,\r\n size: number\r\n}>\r\n\r\nexport type ILineStyle = Partial<{\r\n opacity: number,\r\n color: number | string,\r\n width: number,\r\n dashed: boolean,\r\n dashSize: number,\r\n gapSize: number\r\n}>\r\n\r\nexport type IFaceStyle = Partial<{\r\n opacity: number,\r\n color: number | string,\r\n}>\r\n\r\nexport type ITextStyle = Partial<{\r\n color: number | string,\r\n fontSize: number,\r\n anchorX: EN_AnchorX,\r\n anchorY: EN_AnchorY\r\n}>\r\n\r\nexport type IStyle = Partial<{\r\n point: IPointStyle,\r\n line: ILineStyle,\r\n face: IFaceStyle,\r\n text: ITextStyle\r\n}>\r\n","import { EN_AnchorX, EN_AnchorY, IFaceStyle, ILineStyle, IPointStyle, IStyle, ITextStyle } from './i_style';\n\nexport class StyleUtils {\n private static default_opacity = 1\n private static default_point_color = 0xffffff\n private static default_point_size = 8\n private static default_line_color = 0xffffff\n private static default_line_width = 2\n private static default_face_color = 0xffffff\n private static default_text_color = 0xffffff\n private static default_text_fontSize = 16\n private static default_text_anchorX = EN_AnchorX.Center\n private static default_text_anchorY = EN_AnchorY.Middle\n\n public static defaultActiveStyle: IStyle = {\n point: { color: 0xff6800 },\n line: { color: 0xff6800 },\n face: { color: 0xff6800 },\n text: { color: 0xff6800 },\n }\n\n public static defaultSelectionStyle: IStyle = {\n point: { color: 0xff4500 },\n line: { color: 0xff4500 },\n face: { color: 0xff4500 },\n text: { color: 0xff4500 },\n }\n\n public static mergeStateStyle(base: IStyle = {}, state: IStyle = {}): IStyle {\n return {\n point: { ...base.point, ...state.point },\n line: { ...base.line, ...state.line },\n face: { ...base.face, ...state.face },\n text: { ...base.text, ...state.text },\n }\n }\n\n private static _isValidNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\n }\n\n private static _isValidColor(value: unknown): value is number | string {\n return typeof value === 'number' || typeof value === 'string'\n }\n\n public static getPointStyle(style: IStyle = {}): IStyle {\n const point = style.point\n\n const pointStyle: IPointStyle = {\n opacity: this._isValidNumber(point?.opacity) ? point.opacity : this.default_opacity,\n size: this._isValidNumber(point?.size) ? point.size : this.default_point_size,\n color: this._isValidColor(point?.color) ? point.color : this.default_point_color,\n }\n\n return {\n point: pointStyle,\n }\n }\n\n public static getLineStyle(style: IStyle = {}): IStyle {\n const line = style.line\n\n const lineStyle: ILineStyle = {\n opacity: this._isValidNumber(line?.opacity) ? line.opacity : this.default_opacity,\n width: this._isValidNumber(line?.width) ? line.width : this.default_line_width,\n color: this._isValidColor(line?.color) ? line.color : this.default_line_color,\n }\n\n return {\n line: lineStyle,\n }\n }\n\n public static getFaceStyle(style: IStyle = {}): IStyle {\n const face = style.face\n\n const faceStyle: IFaceStyle = {\n opacity: this._isValidNumber(face?.opacity) ? face.opacity : this.default_opacity,\n color: this._isValidColor(face?.color) ? face.color : this.default_face_color,\n }\n\n return {\n face: faceStyle,\n }\n }\n\n public static getTextStyle(style: IStyle = {}): IStyle {\n const text = style.text\n\n const textStyle: ITextStyle = {\n color: this._isValidColor(text?.color) ? text.color : this.default_text_color,\n fontSize: this._isValidNumber(text?.fontSize) ? text.fontSize : this.default_text_fontSize,\n anchorX: text?.anchorX !== undefined ? text.anchorX : this.default_text_anchorX,\n anchorY: text?.anchorY !== undefined ? text.anchorY : this.default_text_anchorY,\n }\n\n return {\n text: textStyle,\n }\n }\n}\n","import { IDocument } from '../document/i_document'\r\nimport { IElement } from '../element/i_element'\r\nimport { DisplayObjectMgr } from '../grep/display/display_object_mgr'\r\nimport { GRep } from '../grep/grep'\r\nimport { GrepDisplay } from '../grep/display/grep_display'\r\nimport { IRender } from '../render/i_render'\r\nimport { NullRender } from '../render/null_render'\r\nimport { DebugUtil } from '../toolkit/debug_util'\r\nimport { EN_ModelViewChanged } from '../types/type_define'\r\nimport { ModelChangedCache } from './model_changed_cache'\r\nimport { GNode } from '../grep/gnode'\r\nimport { StyleUtils } from '../grep/style_utils'\r\n\r\n/**\r\n * 模型层视图,不依赖具体 UI。\r\n * 调用 `updateView()` 时,根据缓存的元素变化刷新渲染层。\r\n */\r\nexport class ModelView {\r\n private _doc: IDocument\r\n\r\n /**标记渲染脏*/\r\n private _renderDirty = true\r\n\r\n public iRender: IRender = new NullRender()\r\n\r\n public readonly cacheForView = new ModelChangedCache()\r\n\r\n /**\r\n * eId->did缓存\r\n */\r\n private _eid2didMap = new Map<number, number>()\r\n\r\n constructor(doc: IDocument) {\r\n this._doc = doc\r\n }\r\n\r\n public updateView(rebuild = false) {\r\n if (rebuild) {\r\n this.iRender.clearSelection()\r\n this.iRender.clearActive()\r\n this.generateAll()\r\n this.iRender.updateImmediately()\r\n this.cacheForView.clear()\r\n return\r\n }\r\n\r\n if (!this.cacheForView.isChange()) return\r\n\r\n this._renderDirty = false\r\n this._updateElements()\r\n this._updateSelection()\r\n this._updateHighLight()\r\n\r\n if (this._renderDirty) {\r\n this.iRender.updateView()\r\n }\r\n this.cacheForView.clear()\r\n }\r\n\r\n public generateAll() {\r\n this.clearAll()\r\n for (const e of this._doc.filterElements()) {\r\n if (!this._isElementValid(e)) {\r\n continue\r\n }\r\n const grep = e.getGRep()\r\n if (grep) {\r\n this._addGRep(grep)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空modelview\r\n */\r\n public clearAll() {\r\n this._eid2didMap.forEach((v, k) => this._removeGRep(k));\r\n this._eid2didMap.clear();\r\n }\r\n\r\n private _updateElements() {\r\n const { container } = this.cacheForView\r\n const added = container.get(EN_ModelViewChanged.ELEMENT_CREATE)?.keys()\r\n const modified = container.get(EN_ModelViewChanged.ELEMENT_UPDATE)?.keys()\r\n const deleted = container.get(EN_ModelViewChanged.ELEMENT_DELETE)?.keys()\r\n if (!added || !modified || !deleted) return\r\n\r\n for (const id of added) {\r\n const element = this._doc.getElementById(id)\r\n if (!element || !this._isElementValid(element)) continue\r\n this._addGRep(element.getGRep())\r\n }\r\n\r\n for (const id of modified) {\r\n const element = this._doc.getElementById(id)\r\n if (!element) continue\r\n\r\n const grep = element.getGRep()\r\n if (!this._isElementValid(element)) {\r\n this._removeGRep(id)\r\n } else {\r\n this._updateGRep(grep)\r\n }\r\n }\r\n\r\n for (const id of deleted) {\r\n this._removeGRep(id)\r\n }\r\n }\r\n\r\n /**\r\n * 元素是否有效可显示\r\n */\r\n private _isElementValid(ele: IElement) {\r\n if (ele.dontShowView()) return false\r\n const grep = ele.getGRep()\r\n return grep && !grep.isEmpty() && ele.isElementVisible()\r\n }\r\n\r\n private _addGRep(grep: GRep) {\r\n const eId = grep.elementId.asInt()\r\n const display = new GrepDisplay()\r\n display.gRep = grep\r\n display.eId = eId\r\n this._eid2didMap.set(eId, display.id)\r\n DisplayObjectMgr.instance().addDisplay(display)\r\n this._renderDirty = true\r\n }\r\n\r\n private _updateGRep(grep: GRep) {\r\n const eId = grep.elementId.asInt()\r\n const did = this._eid2didMap.get(eId)\r\n let display: GrepDisplay | undefined\r\n if (!did) {\r\n display = new GrepDisplay()\r\n DisplayObjectMgr.instance().addDisplay(display)\r\n this._eid2didMap.set(eId, display.id)\r\n } else {\r\n display = DisplayObjectMgr.instance().getDisplay<GrepDisplay>(did)\r\n DebugUtil.assert(display, '未查询到display', 'wg', '2026-03-12')\r\n }\r\n display.gRep = grep\r\n display.eId = eId\r\n this._renderDirty = true\r\n }\r\n\r\n private _removeGRep(eId: number) {\r\n const did = this._eid2didMap.get(eId)\r\n if (did) {\r\n DisplayObjectMgr.instance().removeDisplayById(did)\r\n this._eid2didMap.delete(eId)\r\n this._renderDirty = true\r\n }\r\n }\r\n\r\n /**\r\n * 刷新选择集\r\n */\r\n private _updateSelection() {\r\n const { selection } = this.cacheForView\r\n if (!selection) return\r\n\r\n const greps = this._toGReps(selection.getSelectedElements(), selection.getSelectedGNodes(), true)\r\n this.iRender.clearSelection()\r\n this._renderDirty = true\r\n if (!greps.length) return\r\n // TODO displayid\r\n this.iRender.drawSelections(greps)\r\n }\r\n\r\n /**\r\n * 刷新高亮集合\r\n */\r\n private _updateHighLight() {\r\n const { highLight } = this.cacheForView;\r\n if (!highLight) return\r\n const elements = highLight.getActiveElements()\r\n const gnodes = highLight.getActiveGNodes()\r\n\r\n this.iRender.clearActive();\r\n this._renderDirty = true;\r\n\r\n const greps = this._toGReps(elements, gnodes, false);\r\n if (!greps.length) {\r\n return;\r\n }\r\n this.iRender.drawActives(greps);\r\n }\r\n\r\n /**\r\n * 高亮选中对象转grep\r\n */\r\n private _toGReps(elements: IElement[], gnodes: GNode[], isSelection: boolean) {\r\n const greps: GRep[] = []\r\n elements.forEach(_ => {\r\n const grep = isSelection ? _.getGRepWhenSelected() : _.getGRepWhenActive();\r\n if (grep.isEmpty()) return\r\n greps.push(grep)\r\n })\r\n\r\n // 将一组选中的GNode,组装成一个GRep\r\n const grep = new GRep()\r\n gnodes.forEach(gnode => {\r\n const gMat = gnode.globalMatrix?.clone()\r\n const cloned = gnode.clone()\r\n cloned.setLocalMatrix(gMat)\r\n const stateStyle = isSelection ? StyleUtils.defaultSelectionStyle : StyleUtils.defaultActiveStyle\r\n cloned.setStyle(StyleUtils.mergeStateStyle(cloned.getStyle(), stateStyle))\r\n grep.addNode(cloned)\r\n })\r\n grep.updateGlobalMatrix()\r\n greps.push(grep)\r\n return greps\r\n }\r\n}\r\n","import { IElement } from '../element/i_element';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { Transaction } from '../transaction/transaction';\r\nimport { Document } from './document';\r\nimport { IDocFile, IDocument, IElementFile } from './i_document';\r\n\r\nexport class DocSaver {\r\n private _doc: IDocument\r\n\r\n constructor(doc: IDocument) {\r\n this._doc = doc\r\n }\r\n\r\n public dump() {\r\n const file: IDocFile = {\r\n id: this._doc.id,\r\n }\r\n file.doc = this._dumpDoc()\r\n\r\n return file\r\n }\r\n\r\n private _dumpDoc() {\r\n const doc = this._doc.filterElements().filter(e => !e.dontSave()).map(e => {\r\n return {\r\n ctor: e.getSerialId(),\r\n ...e.dump(),\r\n } as IElementFile\r\n })\r\n return doc\r\n }\r\n\r\n /**\r\n * 同步加载\r\n */\r\n public syncLoad(file: IDocFile) {\r\n try {\r\n const trans = new Transaction(this._doc, 'open doc file')\r\n trans.canUndo = false\r\n this._clearDocument()\r\n this._fillDocument(file)\r\n const eles = this._doc.filterElements()\r\n eles.forEach(_ => _.onLoad())\r\n trans.commit()\r\n // this._doc.updateView(true)\r\n return true\r\n } catch {\r\n DebugUtil.warn(false, 'parsing saved doc failed', 'wg', '2026-03-30')\r\n }\r\n return false\r\n }\r\n\r\n private _clearDocument() {\r\n const eles = this._doc.filterElements(e => !e.dontSave())\r\n eles.forEach(e => {\r\n this._doc.elementMgr.delete(e.id.asInt())\r\n })\r\n }\r\n\r\n private _fillDocument(file: IDocFile) {\r\n const newEles: IElement[] = []\r\n if (!file.doc) return\r\n file.doc.forEach(_ => {\r\n const Ctor = this._doc.elementMgr.getElementClsByCtor(_.ctor)\r\n DebugUtil.assert(Ctor, `cant find element ctor ${_.ctor}`, 'wg', '2026-03-30')\r\n Document.canCreate = true\r\n const ele = new Ctor()\r\n ele.setDoc(this._doc)\r\n ele.load(_)\r\n newEles.push(ele)\r\n Document.canCreate = false\r\n })\r\n\r\n // add to doc\r\n newEles.forEach(_ => this._doc.elementMgr.add(_))\r\n this._doc.transactionMgr.getCurrentUndoRedoEntity().onElementsAdded(newEles)\r\n // reset id pool\r\n if (newEles.length) {\r\n const maxId = Math.max(...newEles.map(_ => _.id.asInt()))\r\n this._doc.idPool.clearStableId(maxId)\r\n }\r\n this._doc.id = file.id\r\n return newEles\r\n }\r\n}\r\n","import type { IElement, IElementCtor } from '../element/i_element'\r\nimport type { IDocFile, IDocument } from './i_document'\r\nimport { elementMgr } from './element_mgr'\r\nimport { IDPool } from './id_pool'\r\nimport { ElementId } from '../element/element_id'\r\nimport { TransactionMgr } from '../transaction/transaction_mgr'\r\nimport { DebugUtil } from '../toolkit/debug_util'\r\nimport { IConstructor } from '../types/type_guard'\r\nimport { requestMgr } from '../request/request_mgr'\r\nimport { EN_ModelViewChanged } from '../types/type_define'\r\nimport { ModelView } from '../model_view/model_view'\r\nimport { brep } from '@ccpc/math'\r\nimport { DocSaver } from './doc_saver'\r\n\r\nexport class Document implements IDocument {\r\n\r\n public isMainDoc: boolean = false\r\n\r\n /**\r\n * 文档唯一标识\r\n */\r\n private _id: string\r\n\r\n /**是否可以创建对象*/\r\n public static canCreate = false;\r\n\r\n public readonly idPool = new IDPool()\r\n\r\n public readonly elementMgr = elementMgr\r\n\r\n public readonly transactionMgr: TransactionMgr\r\n\r\n public readonly requestMgr = requestMgr\r\n\r\n public readonly modelView: ModelView\r\n\r\n constructor() {\r\n this._id = brep.uuid()\r\n this.transactionMgr = new TransactionMgr()\r\n this.transactionMgr.init(this)\r\n this.requestMgr.init(this)\r\n this.modelView = new ModelView(this);\r\n }\r\n\r\n public get id() {\r\n return this._id\r\n }\r\n\r\n public set id(val: string) {\r\n this._id = val\r\n }\r\n\r\n public create<T extends IElement>(ctor: IConstructor<T>): T {\r\n Document.canCreate = true;\r\n const e = new ctor();\r\n e.setDoc(this);\r\n\r\n let id = this.idPool.genId(e);\r\n if (!id) {\r\n const usedIds = this.transactionMgr.idPoolGC();\r\n this.elementMgr.getAllElementIds().forEach(_ => usedIds.add(_));\r\n\r\n this.idPool.reset(usedIds);\r\n id = this.idPool.genId(e);\r\n }\r\n DebugUtil.assert(id, 'Id资源已耗尽', 'wg', '2026-03-05');\r\n\r\n e.id = id;\r\n Document.canCreate = false;\r\n\r\n DebugUtil.assert(!this.getElementById(e.id), '该Id已存在', 'wg', '2026-03-05');\r\n\r\n if (!e.isTemporary()) {\r\n this.checkIfCanModifyDoc();\r\n this.transactionMgr.getCurrentUndoRedoEntity().onElementsAdded([e]);\r\n }\r\n\r\n this.elementMgr.add(e);\r\n return e;\r\n }\r\n\r\n public deleteElementsById(...eIds: Array<number | ElementId>) {\r\n const elementsToDelete = this.getElementsByIds(eIds);\r\n if (!elementsToDelete.length) return false;\r\n\r\n if (elementsToDelete.some(_ => !_.isTemporary())) {\r\n this.checkIfCanModifyDoc()\r\n this.transactionMgr.getCurrentUndoRedoEntity().onElementsDeleted(elementsToDelete)\r\n }\r\n\r\n elementsToDelete.forEach(_ => {\r\n this.elementMgr.delete(_.id.asInt())\r\n })\r\n\r\n this.cacheForViewElementChanged(EN_ModelViewChanged.ELEMENT_DELETE, elementsToDelete)\r\n return true\r\n }\r\n\r\n public getElementById<T extends IElement>(id: ElementId | number): T | undefined {\r\n const eId = id instanceof ElementId ? id.asInt() : id;\r\n return this.elementMgr.getElementById<T>(eId)\r\n }\r\n\r\n public getElementByIdEnsure<T extends IElement>(eleId: ElementId | number): T {\r\n const eId = eleId instanceof ElementId ? eleId.asInt() : eleId;\r\n const ele = this.getElementById(eId);\r\n DebugUtil.assert(ele, `${eId}不存在`, 'wg', '2026-03-05');\r\n return ele as T;\r\n }\r\n\r\n public getElementsByIds(eleIds: Array<ElementId | number>) {\r\n const result: IElement[] = []\r\n eleIds.forEach(eId => {\r\n const ele = this.getElementById(eId)\r\n if (ele) result.push(ele)\r\n })\r\n return result\r\n }\r\n\r\n public filterElements(filter?: (ele: IElement) => boolean) {\r\n if (!filter) {\r\n return this.elementMgr.getAllElements()\r\n }\r\n return this.elementMgr.getAllElements().filter(filter)\r\n }\r\n\r\n public getAllElementsByCtor<T extends IElement>(eleCtor?: IElementCtor<T>): T[] {\r\n if (!eleCtor) {\r\n return this.filterElements() as T[]\r\n }\r\n const ctorStr = eleCtor.serializedId.ctor\r\n return this.elementMgr.getElementsByCtor(ctorStr) as T[]\r\n }\r\n\r\n public checkIfCanModifyDoc(): void {\r\n DebugUtil.assert(this.transactionMgr.getCurrentTransaction(), '事务外不可修改文档', 'wg', '2025-11-18');\r\n }\r\n\r\n public cacheForViewElementChanged(evtType: EN_ModelViewChanged, elements: Array<IElement>): void {\r\n this.modelView.cacheForView.cacheElementChanged(evtType, elements)\r\n }\r\n\r\n public updateView(rebuild: boolean = false) {\r\n this.modelView.updateView(rebuild)\r\n return true\r\n }\r\n\r\n public dump() {\r\n const docSaver = new DocSaver(this)\r\n const file = docSaver.dump()\r\n return file\r\n }\r\n\r\n public load(file: IDocFile) {\r\n const docSaver = new DocSaver(this)\r\n docSaver.syncLoad(file)\r\n return this\r\n }\r\n\r\n // TODO 补充完整\r\n public destroy() {\r\n\r\n }\r\n}\r\n","import { Loader, types } from '@ccpc/math';\r\nimport { Document } from '../document/document';\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { EN_DontSavePropPrefix, IJSON } from '../types/type_define';\r\nimport { IConstructor } from '../types/type_guard';\r\nimport { IDB, IDumpLoad, IModifiedProps, MathSymbol } from './i_element';\r\n\r\nexport class DB implements IDB {\r\n private _db: IJSON = {}\r\n\r\n private _cache: IJSON = {}\r\n\r\n public get db() {\r\n return this._db\r\n }\r\n\r\n public get cache() {\r\n return this._cache\r\n }\r\n\r\n /**\r\n * 获取修改的数据\r\n */\r\n public getModified(): IModifiedProps[] {\r\n const result: IModifiedProps[] = [];\r\n for (const propName in this._cache) {\r\n result.push({\r\n propertyName: propName,\r\n oldValue: this._db[propName],\r\n newValue: this._cache[propName],\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 数据入库\r\n */\r\n public commit() {\r\n for (const key in this._cache) {\r\n this.db[key] = this._cache[key];\r\n }\r\n this._clearCache();\r\n }\r\n\r\n /**\r\n * 数据回滚\r\n */\r\n public rollBack() {\r\n this._clearCache();\r\n }\r\n\r\n /**\r\n * 清空缓存\r\n */\r\n private _clearCache() {\r\n this._cache = {}\r\n }\r\n\r\n public ownKeys() {\r\n const set = new Set([...Object.keys(this._db), ...Object.keys(this._cache)])\r\n return [...set]\r\n }\r\n\r\n public dump(): IJSON {\r\n if (Object.keys(this._cache).length) {\r\n return {\r\n ...this._dumpData(this._db),\r\n ...this._dumpData(this._cache),\r\n }\r\n }\r\n return this._dumpData(this._db)\r\n }\r\n\r\n public load(json: IJSON) {\r\n const db = this._db\r\n for (const key of this.ownKeys()) {\r\n if (key.startsWith(EN_DontSavePropPrefix.UNDER_SCORE) || key.startsWith(EN_DontSavePropPrefix.C_UNDER_SCORE))\r\n continue\r\n const val1 = db[key]\r\n const val2 = json[key]\r\n if (val2 === undefined || val2 === null)\r\n continue\r\n if (Array.isArray(val1)) {\r\n const first: unknown = val1[0]\r\n db[key] = this._loadArr(val2 as Array<unknown>, first)\r\n } else if (val1 instanceof Map) {\r\n db[key] = this._loadMap(val2 as Array<unknown[]>, val1)\r\n } else if (val1 instanceof Set) {\r\n const first = [...val1.values()] as Array<unknown>[0]\r\n db[key] = this._loadSet(val2 as Array<unknown>, first)\r\n } else if (this._isDumpLoad(val1)) {\r\n const newVal = new (val1.constructor as IConstructor<IDumpLoad>)()\r\n newVal.load(val2)\r\n db[key] = newVal\r\n } else if (val1 === MathSymbol) {\r\n db[key] = Loader.load(val2 as types.IDBLibGeo)\r\n } else {\r\n db[key] = val2\r\n }\r\n }\r\n }\r\n\r\n private _dumpData(data: IJSON): IJSON {\r\n Document.canCreate = true\r\n const defualtVal = new (this.constructor as IConstructor<DB>)() as unknown as IJSON\r\n Document.canCreate = false\r\n const result: IJSON = {}\r\n Object.keys(data).forEach(key => {\r\n if (key.startsWith(EN_DontSavePropPrefix.UNDER_SCORE) || key.startsWith(EN_DontSavePropPrefix.C_UNDER_SCORE)) {\r\n return\r\n }\r\n const val1 = defualtVal[key]\r\n const val2 = data[key]\r\n if (Array.isArray(val2)) {\r\n const res1 = this._dumpArr(val1 as Array<unknown>)\r\n const res2 = this._dumpArr(val2 as Array<unknown>)\r\n if (JSON.stringify(res1) === JSON.stringify(res2)) return\r\n result[key] = res2\r\n } else if (val2 instanceof Map) {\r\n const res1 = this._dumpMap(val1 as Map<unknown, unknown>)\r\n const res2 = this._dumpMap(val2 as Map<unknown, unknown>)\r\n if (JSON.stringify(res1) === JSON.stringify(res2)) return\r\n result[key] = res2\r\n } else if (val2 instanceof Set) {\r\n const res1 = this._dumpSet(val1 as Set<unknown>)\r\n const res2 = this._dumpSet(val2 as Set<unknown>)\r\n if (JSON.stringify(res1) === JSON.stringify(res2)) return\r\n result[key] = res2\r\n } else {\r\n const res1 = this._dumpAProperty(val1)\r\n const res2 = this._dumpAProperty(val2)\r\n if (JSON.stringify(res1) === JSON.stringify(res2)) return\r\n result[key] = res2\r\n }\r\n })\r\n return result\r\n }\r\n\r\n private _dumpArr(arr: Array<unknown>) {\r\n const arr1 = [...arr]\r\n for (let i = 0; i < arr1.length; i += 1) {\r\n const item = arr[i]\r\n if (item instanceof Array) {\r\n arr1[i] = this._dumpArr(item)\r\n } else {\r\n arr1[i] = this._dumpAProperty(item)\r\n }\r\n }\r\n return arr1\r\n }\r\n\r\n /**\r\n * 加载数组\r\n * @param arr JSON中的数组\r\n * @param first 参考数组中的第一个值\r\n * 数组中元素当前只支持dump、load对象和基础类型\r\n */\r\n private _loadArr(arr: Array<unknown>, first: unknown): Array<unknown> {\r\n if (!arr.length) {\r\n return []\r\n }\r\n if (Array.isArray(first)) {\r\n return arr.map(val => {\r\n return this._loadArr(val as Array<unknown>, first[0])\r\n })\r\n } else {\r\n return arr.map(val => {\r\n if (this._isDumpLoad(first)) {\r\n const Ctor = first.constructor as IConstructor<IDumpLoad>\r\n const newVal = new Ctor()\r\n newVal.load(val)\r\n return newVal\r\n } else if (first === MathSymbol) {\r\n const newVal = Loader.load(val as types.IDBLibGeo)\r\n return newVal\r\n } else {\r\n const valType = typeof val\r\n if (valType === 'string' || valType === 'boolean' || valType === 'number') {\r\n return val\r\n } else {\r\n DebugUtil.assert(false, '暂不支持的类型', 'wg', '2026-03-29')\r\n }\r\n }\r\n })\r\n }\r\n }\r\n\r\n private _dumpMap(map: Map<unknown, unknown>) {\r\n const mArr: Array<unknown[]> = [...map]\r\n for (let i = 0; i < mArr.length; i += 1) {\r\n const res = this._dumpArr(mArr[i])\r\n mArr[i] = res\r\n }\r\n return this._dumpArr(mArr)\r\n }\r\n\r\n /**\r\n * Map中的元素支持dump、load对象和基础元素类型\r\n */\r\n private _loadMap(jsonMap: Array<unknown[]>, dbMap: Map<unknown, unknown>) {\r\n if (!dbMap.size) {\r\n DebugUtil.assert(false, 'DB数据需要提供初始值', 'wg', '2026-03-29')\r\n }\r\n\r\n const map = new Map()\r\n for (const [key, val] of jsonMap) {\r\n const dbVal = dbMap.get(key)\r\n if (this._isDumpLoad(dbVal)) {\r\n const newVal = new (dbVal.constructor as IConstructor<IDumpLoad>)()\r\n newVal.load(val)\r\n map.set(key, newVal)\r\n } else if (this._isBasicType(dbVal)) {\r\n map.set(key, val)\r\n } else {\r\n DebugUtil.assert(false, '不支持的类型', 'wg', '2026-03-29')\r\n }\r\n }\r\n return map\r\n }\r\n\r\n private _dumpSet(set: Set<unknown>) {\r\n const sArr = [...set]\r\n return this._dumpArr(sArr)\r\n }\r\n\r\n /**\r\n * 当前Set只支持里面所有元素为同一类型\r\n */\r\n private _loadSet(setArr: Array<unknown>, first: unknown) {\r\n const set = new Set<unknown>()\r\n for (const val of setArr) {\r\n if (this._isDumpLoad(first)) {\r\n const Ctor = (first.constructor as IConstructor<IDumpLoad>)\r\n const newVal = new Ctor()\r\n newVal.load(val)\r\n set.add(newVal)\r\n } else if (this._isBasicType(first)) {\r\n set.add(val)\r\n } else {\r\n DebugUtil.assert(false, '不支持的数据类型', 'wg', '2026-03-29')\r\n }\r\n }\r\n return set\r\n }\r\n\r\n private _dumpAProperty(val: unknown) {\r\n if (this._isBasicType(val)) {\r\n return val\r\n }\r\n if (this._isDumpLoad(val)) {\r\n return val.dump()\r\n }\r\n if (val instanceof Array || val instanceof Map || val instanceof Set) {\r\n DebugUtil.assert(false, '不支持的数据类型', 'wg', '2026-03-27')\r\n }\r\n }\r\n\r\n private _isDumpLoad(obj: unknown): obj is IDumpLoad {\r\n return !!obj &&\r\n (obj as IDumpLoad).dump instanceof Function &&\r\n (obj as IDumpLoad).load instanceof Function\r\n }\r\n\r\n private _isBasicType(obj: unknown) {\r\n const type = typeof obj\r\n if (type === 'string' || type === 'number' || type === 'boolean') {\r\n return true\r\n }\r\n return false\r\n }\r\n}\r\n","import { ElementId } from './element_id'\r\nimport { EN_VIEW_CACHE_PROPS, type IElement, type T_SerializedId } from './i_element'\r\nimport type { IDocument } from '../document/i_document'\r\nimport { DebugUtil } from '../toolkit/debug_util';\r\nimport { Document } from '../document/document';\r\nimport { GRep } from '../grep/grep';\r\nimport { StyleUtils } from '../grep/style_utils';\r\nimport { DB } from './db';\r\nimport { IConstructor } from '../types/type_guard';\r\n\r\n// TODO 补充dump load方法,统一处理? 每个类单独写?\r\nexport class Element extends DB implements IElement {\r\n /**\r\n * 保存到文档中的序列化Id\r\n */\r\n public static serializedId: T_SerializedId;\r\n\r\n public id = ElementId.INVALID\r\n\r\n public name: string = ''\r\n\r\n private _doc!: IDocument\r\n\r\n public visible = true;\r\n\r\n public C_GRep = GRep.empty\r\n\r\n constructor() {\r\n super()\r\n DebugUtil.assert(Document.canCreate, '创建Element必须通过Document.create方法', 'wg', '2025-11-18');\r\n }\r\n\r\n public getDoc() {\r\n return this._doc\r\n }\r\n\r\n public setDoc(doc: IDocument) {\r\n this._doc = doc\r\n }\r\n\r\n /**\r\n * 空构造+初始化\r\n */\r\n public init(..._params: unknown[]) {\r\n return this\r\n }\r\n\r\n /**\r\n * 获取序列化的id\r\n */\r\n public getSerialId() {\r\n return (this.constructor as typeof Element).serializedId.ctor;\r\n }\r\n\r\n /**\r\n * 重置缓存的 GRep,强制后续重新生成图形表示。\r\n */\r\n public markGRepDirty() {\r\n this.C_GRep = new GRep()\r\n }\r\n\r\n /**\r\n * 获取GRep显示对象\r\n */\r\n public getGRep() {\r\n const grep = this.C_GRep\r\n if (!grep.elementId.isValid()) {\r\n grep.elementId = this.id\r\n }\r\n return grep\r\n }\r\n\r\n public getGRepWhenSelected(): GRep {\r\n const grep = this.getGRep()\r\n if (!grep || grep.isEmpty()) {\r\n return new GRep()\r\n }\r\n\r\n const cloned = grep.clone()\r\n cloned.traverse(gnode => {\r\n gnode.setStyle(StyleUtils.mergeStateStyle(gnode.getStyle(), StyleUtils.defaultSelectionStyle))\r\n })\r\n return cloned\r\n }\r\n\r\n public getGRepWhenActive(): GRep {\r\n const grep = this.getGRep()\r\n if (!grep || grep.isEmpty()) {\r\n return new GRep()\r\n }\r\n\r\n const cloned = grep.clone()\r\n cloned.traverse(gnode => {\r\n gnode.setStyle(StyleUtils.mergeStateStyle(gnode.getStyle(), StyleUtils.defaultActiveStyle))\r\n })\r\n return cloned\r\n }\r\n\r\n /**\r\n * 设置GRep显示对象\r\n */\r\n public setGRep(grep: GRep) {\r\n grep.elementId = this.id\r\n if (this.C_GRep === grep) {\r\n grep.clearRenderNode()\r\n }\r\n this.C_GRep = grep\r\n return true\r\n }\r\n\r\n public isElementVisible() {\r\n // TODO 补充完整\r\n return this.visible\r\n }\r\n\r\n /**\r\n * 是否为临时对象\r\n * 临时对象不受事务监管\r\n */\r\n public isTemporary() {\r\n return false\r\n }\r\n\r\n public dontSave(): boolean {\r\n return false\r\n }\r\n\r\n public dontShowView() {\r\n return false\r\n }\r\n\r\n /**\r\n * 属性变化是否应该缓存到视图\r\n */\r\n public propShouldCacheToView(propName: string) {\r\n if (\r\n propName === EN_VIEW_CACHE_PROPS.C_GREP ||\r\n propName === EN_VIEW_CACHE_PROPS.VISIBLE\r\n ) {\r\n if (!this.dontShowView()) return true\r\n }\r\n return false\r\n }\r\n\r\n public clone() {\r\n const ele = this._doc.create(this.constructor as IConstructor<this>)\r\n const data = this.dump()\r\n delete data.id\r\n ele.load(data)\r\n return ele\r\n }\r\n\r\n public onLoad(): void {\r\n this.markGRepDirty()\r\n }\r\n}\r\n","import { Document } from '../document/document';\r\nimport { elementMgr } from '../document/element_mgr';\r\nimport { EN_ModelViewChanged } from '../types/type_define';\r\nimport { IElement, IElementCtor } from './i_element';\r\n\r\nexport const RegisterElement = (ctorStr: string) => {\r\n return function <T extends IElement>(Ctor: IElementCtor<T>) {\r\n Ctor.serializedId = {\r\n ctor: ctorStr,\r\n }\r\n elementMgr.registerElement(ctorStr, Ctor)\r\n Document.canCreate = true\r\n const tmpEle = new Ctor();\r\n Document.canCreate = false;\r\n\r\n const props = Object.keys(tmpEle).filter(key => !key.startsWith('_'))\r\n\r\n props.forEach(propName => {\r\n Object.defineProperty(Ctor.prototype, propName, {\r\n set(this: T, value: unknown) {\r\n const doc = this.getDoc();\r\n const ele = doc?.getElementById(this.id);\r\n\r\n if (ele) {\r\n if (!ele.isTemporary()) {\r\n doc.checkIfCanModifyDoc();\r\n doc.transactionMgr.getCurrentUndoRedoEntity().onElementsUpdated([ele])\r\n this.cache[propName] = value;\r\n } else {\r\n this.db[propName] = value;\r\n }\r\n\r\n if (ele.propShouldCacheToView(propName)) {\r\n doc.cacheForViewElementChanged(EN_ModelViewChanged.ELEMENT_UPDATE, [ele])\r\n }\r\n\r\n } else {\r\n this.db[propName] = value;\r\n }\r\n },\r\n\r\n get(this: T) {\r\n if (this.cache[propName] !== undefined) {\r\n return this.cache[propName]\r\n }\r\n return this.db[propName]\r\n },\r\n })\r\n })\r\n }\r\n}\r\n","import { Element } from '../element';\r\nimport { RegisterElement } from '../element_decorator';\r\n\r\n@RegisterElement('7ac53d95-03ae-484d-9bfd-39755e145a8c')\r\nexport class TmpElement extends Element {\r\n public init() {\r\n return this\r\n }\r\n\r\n public dontSave(): boolean {\r\n return true\r\n }\r\n\r\n public isTemporary(): boolean {\r\n return true\r\n }\r\n}\r\n","import { IDocument } from '../../document/i_document';\r\nimport { GRep } from '../../grep/grep';\r\nimport { DebugUtil } from '../../toolkit/debug_util';\r\nimport { ElementId } from '../element_id';\r\nimport { TmpElement } from './tmp_element';\r\n\r\n/**\r\n * 临时元素绘制器\r\n */\r\nexport class TmpElementPainter {\r\n\r\n /**\r\n * 临时元素id\r\n */\r\n private _tmpElementId: ElementId\r\n\r\n private _tmpGRepRemoved = false\r\n\r\n private _doc: IDocument\r\n\r\n constructor(doc: IDocument) {\r\n this._doc = doc\r\n this._tmpElementId = this._doc.create(TmpElement).init().id\r\n }\r\n\r\n public get tmpElement() {\r\n const ele = this._doc.getElementById(this._tmpElementId)\r\n DebugUtil.assert(ele, 'ele为空', 'wg', '2026-03-15')\r\n return ele\r\n }\r\n\r\n /**\r\n * 绘制临时元素\r\n */\r\n public drawTmpGRep(grep: GRep) {\r\n grep.canPick = false\r\n grep.canSnap = false\r\n this.tmpElement.setGRep(grep)\r\n this._tmpGRepRemoved = false\r\n }\r\n\r\n /**\r\n * 清除临时元素\r\n */\r\n public clearTmp() {\r\n if (this._tmpGRepRemoved) return\r\n // 打开文档时, action中的临时对象是上一个doc的,取不到\r\n if (!this._doc.getElementById(this._tmpElementId)) return\r\n this.drawTmpGRep(GRep.empty)\r\n this._tmpGRepRemoved = true\r\n this._doc.updateView()\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n public destroy() {\r\n this.clearTmp()\r\n this._doc.deleteElementsById(this._tmpElementId)\r\n }\r\n\r\n}\r\n","import { Curve2, Plane, PolyCurve, Polygon, Vec2 } from '@ccpc/math';\r\nimport { GNode } from './gnode';\r\n\r\nexport abstract class GNode2d extends GNode {\r\n public plane: Plane;\r\n\r\n public geo: Vec2 | Curve2 | Polygon | PolyCurve;\r\n\r\n constructor(plane: Plane, geo: Vec2 | Curve2 | Polygon | PolyCurve) {\r\n super();\r\n this.plane = plane.clone();\r\n this.geo = geo;\r\n }\r\n\r\n public abstract clone(): GNode2d;\r\n\r\n protected _copyFrom(another: GNode2d): this {\r\n super._copyFrom(another)\r\n return this\r\n }\r\n}\r\n","import { Curve2, DiscreteParam, Plane } from '@ccpc/math';\nimport type { types } from '@ccpc/math'\nimport { GNode2d } from './gnode2d';\nimport { RenderEdge, RenderNode } from '../render/render_node';\nimport { GNODE_TYPE } from './gnode_type';\nimport { IStyle } from './i_style';\nimport { StyleUtils } from './style_utils';\n\r\nexport class GCurve2d extends GNode2d {\r\n public declare geo: Curve2;\r\n\r\n constructor(plane: Plane, geo: Curve2) {\n super(plane, geo);\n }\n\n public setStyle(style: IStyle) {\n super.setStyle(style)\n if (this._renderNode) {\n this._renderNode.style = StyleUtils.getLineStyle(this.getStyle())\n }\n return this\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GCurve2d\n }\n\r\n // 将二维曲线离散成顺序点列,再映射到所在平面,生成对应的 RenderEdge。\r\n // 【与当前实现差异】\r\n // 当前完整实现里这里还会同步线样式。\r\n // 当前最小化版本未保留 style 体系,因此这里只保留离散后的点数据。\r\n protected _toRenderNodeWithoutMatrix(discreteParams?: DiscreteParam): RenderNode {\n const render = new RenderEdge();\n render.points = this.geo.discrete(discreteParams).map(p => this.plane.getPtAt(p))\n render.style = StyleUtils.getLineStyle(this.getStyle())\n return render\n }\n\r\n // 将二维曲线离散并映射为三维顺序点列。\r\n public discrete(params?: DiscreteParam): types.IXYZ[] {\r\n return this.geo.discrete(params).map(v => this.plane.getPtAt(v));\r\n }\r\n\r\n public clone(cloneGeo?: boolean): GCurve2d {\r\n const curve2d = new GCurve2d(this.plane, cloneGeo ? this.geo.clone() : this.geo)\r\n return curve2d._copyFrom(this)\r\n }\r\n}\r\n","import { alg, DiscreteParam, EN_GEO_TYPE, Plane, PolyCurve } from '@ccpc/math';\nimport { GNode2d } from './gnode2d';\nimport { RenderEdge } from '../render/render_node';\nimport { GNODE_TYPE } from './gnode_type';\nimport { IStyle } from './i_style';\nimport { StyleUtils } from './style_utils';\n\r\nexport class GPolycurve extends GNode2d {\r\n public declare geo: PolyCurve\r\n\r\n constructor(plane: Plane, geo: PolyCurve) {\n super(plane, geo)\n }\n\n public setStyle(style: IStyle) {\n super.setStyle(style)\n if (this._renderNode) {\n this._renderNode.style = StyleUtils.getLineStyle(this.getStyle())\n }\n return this\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GPolycurve\n }\n\n protected _toRenderNodeWithoutMatrix(discreteParams?: DiscreteParam): RenderEdge {\n const render = new RenderEdge()\n const pts = alg.DiscreteTopology.discretePolyline(this.geo, discreteParams)\n if (this.geo.getType() === EN_GEO_TYPE.LOOP && pts.length > 0) {\n pts.push(pts[0].clone())\n }\n render.points = pts.map(p => this.plane.getPtAt(p))\n render.style = StyleUtils.getLineStyle(this.getStyle())\n return render\n }\n\r\n public clone(cloneGeo?: boolean) {\r\n const polyCurve = new GPolycurve(this.plane, cloneGeo ? this.geo.clone() : this.geo)\r\n return polyCurve._copyFrom(this)\r\n }\r\n}\r\n","import { types, Plane, Vec2 } from '@ccpc/math';\r\nimport { GNode2d } from './gnode2d';\nimport { RenderNode, RenderPoint } from '../render/render_node';\nimport { GNODE_TYPE } from './gnode_type';\nimport { IStyle } from './i_style';\nimport { StyleUtils } from './style_utils';\n\r\nexport class GPoint2d extends GNode2d {\r\n public declare geo: Vec2;\r\n\r\n constructor(plane: Plane, geo: Vec2) {\r\n super(plane, geo);\r\n }\r\n\r\n public setStyle(style: IStyle) {\n super.setStyle(style)\n if (this._renderNode) {\n this._renderNode.style = StyleUtils.getPointStyle(this.getStyle())\n }\n return this\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GPoint2d\n }\n\r\n protected _toRenderNodeWithoutMatrix(): RenderNode {\r\n const render = new RenderPoint();\r\n render.point = this.plane.getPtAt(this.geo)\r\n render.style = StyleUtils.getPointStyle(this.getStyle())\r\n return render;\r\n }\r\n\r\n // 返回当前二维点映射到平面后的三维坐标。\r\n public getPoint(): types.IXYZ {\r\n return this.plane.getPtAt(this.geo)\r\n }\r\n\r\n public override clone(cloneGeo?: boolean): GPoint2d {\r\n const gPoint = new GPoint2d(this.plane, cloneGeo ? this.geo.clone() : this.geo)\r\n return gPoint._copyFrom(this)\r\n }\r\n}\r\n","import { alg, DiscreteParam, Plane, Polygon, Vec3 } from '@ccpc/math';\nimport { GNode2d } from './gnode2d';\nimport { RenderMesh, RenderNode } from '../render/render_node';\nimport { DebugUtil } from '../toolkit/debug_util';\nimport { GNODE_TYPE } from './gnode_type';\nimport { IStyle } from './i_style';\nimport { StyleUtils } from './style_utils';\n\r\nexport class GPolygon extends GNode2d {\r\n public declare geo: Polygon;\r\n\r\n constructor(plane: Plane, geo: Polygon) {\n super(plane, geo);\n }\n\n public setStyle(style: IStyle) {\n super.setStyle(style)\n if (this._renderNode) {\n this._renderNode.style = StyleUtils.getFaceStyle(this.getStyle())\n }\n return this\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GPolygon\n }\n\r\n protected _toRenderNodeWithoutMatrix(discreteParams?: DiscreteParam): RenderNode {\r\n return this.toRenderNodeForActive(discreteParams);\r\n }\r\n\r\n public toRenderNodeForActive(discreteParams?: DiscreteParam) {\n const render = new RenderMesh();\n\r\n try {\r\n const mesh2ds = alg.DiscreteTopology.tessPolygon(this.geo, discreteParams);\r\n const { vertices, faces } = mesh2ds;\r\n render.setVerts(\r\n vertices.map(xy => {\r\n return this.plane.getPtAt(xy);\r\n }),\r\n );\r\n if (faces) {\r\n render.setIndices(new Uint32Array(faces));\r\n }\r\n\r\n const normals: Vec3[] = [];\r\n for (let i = 0; i < vertices.length; i++) {\r\n normals.push(this.plane.getNorm());\r\n }\r\n render.setNormals(normals);\r\n\r\n // TODO 暂时不考虑UV\r\n } catch (e) {\n console.error(e);\n DebugUtil.warn(false, 'invalid gface', 'wg', '2026-03-13');\n }\n render.style = StyleUtils.getFaceStyle(this.getStyle())\n return render;\n }\n\r\n public clone(cloneGeo?: boolean): GPolygon {\r\n const gPolygon = new GPolygon(this.plane.clone(), cloneGeo ? this.geo.clone() : this.geo)\r\n return gPolygon._copyFrom(this)\r\n }\r\n}\r\n","import { Plane, Vec2 } from '@ccpc/math';\nimport { GNode2d } from './gnode2d'\nimport { RenderNode, RenderText } from '../render/render_node';\nimport { GNODE_TYPE } from './gnode_type';\nimport { IStyle } from './i_style';\nimport { StyleUtils } from './style_utils';\nexport class GText2d extends GNode2d {\n public position: Vec2 = Vec2.O();\n\n constructor(\n public text: string,\n plane: Plane,\n pos?: Vec2,\n ) {\n super(plane, Vec2.rO());\n if (pos) {\n this.position = pos;\n }\n }\n\n public setStyle(style: IStyle) {\n super.setStyle(style)\n if (this._renderNode) {\n this._renderNode.style = StyleUtils.getTextStyle(this.getStyle())\n }\n return this\n }\n\n public override getType(): GNODE_TYPE {\n return GNODE_TYPE.GText2d\n }\n\n protected _toRenderNodeWithoutMatrix(): RenderNode {\n const render = new RenderText();\n render.text = this.text;\n render.position = this.position.toXYZ();\n render.style = StyleUtils.getTextStyle(this.getStyle())\n return render;\n }\n\n public clone(): GText2d {\n const gText = new GText2d(this.text, this.plane.clone(), this.position)\n gText._copyFrom(this)\n return gText\n }\n}\n","import { GRep } from '../grep/grep';\r\n\r\nexport abstract class IRender {\r\n /**\r\n * 修改完场景后通常调用updat才会真正刷新\r\n */\r\n public abstract updateView(): void\r\n\r\n public abstract updateImmediately(): void\r\n\r\n /**\r\n * 清空高亮\r\n */\r\n public clearActive() {\r\n // TODO 补充完整\r\n }\r\n\r\n /**\r\n * 清空选择集\r\n */\r\n public clearSelection() {\r\n // TODO 补充完整\r\n }\r\n\r\n /**\r\n * 绘制高亮对象\r\n */\r\n public abstract drawActives(_greps: GRep[]): void\r\n\r\n /**\r\n * 绘制选中对象\r\n */\r\n public abstract drawSelections(_greps: GRep[]): void\r\n}\r\n","import { RenderGroup, RenderNode } from './render_node'\n\nexport class RenderNodeUtil {\n public static flatLeafRNodes(rNode: RenderNode): RenderNode[] {\n const result: RenderNode[] = []\n\n if (rNode instanceof RenderGroup) {\n rNode.children.forEach(child => {\n result.push(...this.flatLeafRNodes(child))\n })\n return result\n }\n\n result.push(rNode)\n return result\n }\n}\n","import { IDocument } from '../document/i_document';\r\nimport { IRequest } from './i_request';\r\n\r\nexport abstract class Request implements IRequest {\r\n protected _doc!: IDocument\r\n\r\n public setDoc(doc: IDocument) {\r\n this._doc = doc;\r\n }\r\n\r\n public abstract execute(): unknown\r\n\r\n /**\r\n * 是否参与事务记录\r\n */\r\n public canTransact(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { IConstructor } from '../types/type_guard';\r\nimport { Request } from './request';\r\nimport { requestMgr } from './request_mgr';\r\n\r\n/**\r\n * 请求注册装饰器\r\n * @param requestId 请求id\r\n */\r\nexport function registerRequest(requestId: string) {\r\n return (ctor: IConstructor<Request>) => {\r\n requestMgr.registerRequest(requestId, ctor);\r\n };\r\n}\r\n","import { EN_CoreRequestIds } from '../../types/type_define';\r\nimport { Request } from '../request';\r\nimport { registerRequest } from '../request_decorator';\r\n\r\n@registerRequest(EN_CoreRequestIds.UNDO)\r\nexport class UndoRequest extends Request {\r\n public execute(): void {\r\n this._doc.transactionMgr.undo()\r\n this._doc.updateView()\r\n }\r\n\r\n public canTransact(): boolean {\r\n return false\r\n }\r\n}\r\n","import { EN_CoreRequestIds } from '../../types/type_define';\nimport { Request } from '../request';\nimport { registerRequest } from '../request_decorator';\n\n@registerRequest(EN_CoreRequestIds.REDO)\nexport class RedoRequest extends Request {\n public execute(): void {\n this._doc.transactionMgr.redo()\n this._doc.updateView()\n }\n\r\n public canTransact(): boolean {\r\n return false\r\n }\r\n}\r\n","import { I_SignalCallbackItem, I_SignalEvent, T_SignalCallbackFn } from '../types/type_define';\r\n\r\nexport class Signal<S = unknown, D = unknown> {\r\n public _callbacks: I_SignalCallbackItem<S, D>[] = [];\r\n\r\n constructor(public subject?: S) { }\r\n\r\n /**\r\n * 事件触发\r\n * @param 事件参数\r\n */\r\n public dispatch(data?: D) {\r\n const event: I_SignalEvent<S, D> = {\r\n data,\r\n subject: this.subject,\r\n };\r\n\r\n for (const item of this._callbacks) {\r\n try {\r\n if (item.listener) {\r\n item.fn.call(item.listener, event);\r\n } else {\r\n item.fn(event);\r\n }\r\n } catch (e) {\r\n console.error(e, 'signal error');\r\n }\r\n }\r\n }\r\n\r\n public listen(fn: T_SignalCallbackFn<S, D>, listener?: unknown) {\r\n const idx = this.getCallbackIndex(fn, listener);\r\n if (idx < 0) {\r\n this._callbacks.push({ fn, listener });\r\n }\r\n }\r\n\r\n public unlisten(fn: T_SignalCallbackFn<S, D>, listener?: unknown) {\r\n const idx = this.getCallbackIndex(fn, listener);\r\n if (idx >= 0) {\r\n this._callbacks.splice(idx, 1);\r\n }\r\n }\r\n\r\n public unlistenAll() {\r\n this._callbacks.length = 0;\r\n }\r\n\r\n public dispose() {\r\n this.unlistenAll();\r\n this.subject = undefined;\r\n }\r\n\r\n private getCallbackIndex(fn: T_SignalCallbackFn<S, D>, listener?: unknown) {\r\n return this._callbacks.findIndex(_ => {\r\n return _.fn === fn && _.listener === listener;\r\n });\r\n }\r\n}\r\n","import { T_SignalCallbackFn } from '../types/type_define';\r\nimport { Signal } from './signal';\r\n\r\n/**\r\n * 信号管理工具,便于dispose\r\n */\r\nexport class SignalHook {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _callbacksMap = new Map<Signal<any, any>, T_SignalCallbackFn<any, any>[]>();\r\n\r\n private _listener: unknown;\n\n public get listener(): unknown {\n return this._listener;\n }\n\r\n constructor(_listener?: unknown) {\r\n this._listener = _listener;\r\n }\r\n\r\n public listen<T, K>(signal: Signal<T, K>, callback: T_SignalCallbackFn<T, K>): this {\r\n signal.listen(callback, this._listener);\r\n\r\n let callbacks = this._callbacksMap.get(signal);\r\n if (!callbacks) {\r\n callbacks = [];\r\n this._callbacksMap.set(signal, callbacks);\r\n }\r\n callbacks.push(callback);\r\n return this;\r\n }\r\n\r\n public unlisten(signal: Signal, callback?: T_SignalCallbackFn): this {\r\n const callbacks = this._callbacksMap.get(signal) || [];\r\n const toRemoveCallbacks = callback ? [callback] : callbacks.slice();\r\n\r\n for (const item of toRemoveCallbacks) {\r\n signal.unlisten(item, this._listener);\r\n const idx = callbacks.indexOf(item);\r\n if (idx >= 0) callbacks.splice(idx, 1);\r\n }\r\n\r\n if (callbacks.length === 0) {\r\n this._callbacksMap.delete(signal);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public unlistenAll(): this {\r\n for (const signal of this._callbacksMap.keys()) {\r\n const callbacks = this._callbacksMap.get(signal) || [];\r\n for (const item of callbacks) {\r\n signal.unlisten(item, this._listener);\r\n }\r\n }\r\n this._callbacksMap.clear();\r\n return this;\r\n }\r\n\r\n public dispose() {\r\n this.unlistenAll();\r\n this._listener = undefined;\r\n }\r\n}\r\n"],"names":["ElementId","id","json","EN_VIEW_CACHE_PROPS","MathSymbol","DBGenerator","DebugUtil","value","message","name","time","showMesg","ClassManager","key","val","cls","ElementMgr","ctor","eleCtor","eles","element","force","ele","elementMgr","_IDPool","usedIds","i","e","startIdx","IDPool","EN_TransactionStatus","TransactionBase","doc","parent","status","EN_ModelViewChanged","EN_RNODE_TYPE","EN_DontSavePropPrefix","EN_CoreRequestIds","UndoRedoEntity","modify","other","otherAdded","otherDeleted","otherModifiedProps","v","k","thisId","thisPvs","_","otherPv","thisPv","otherDelElement","propertyName","oldValue","tKey","tVal","_v","oldAdded","oldDeleted","values","del","eleMgr","set","result","changedElements","Transaction","another","TransactionGroup","isRoot","oldName","newName","max","head","first","second","empty","popped","next","pre","transaction","ut","tail","t","undoList","list","size","TransactionMgr","group","RequestMgr","requestId","request","args","req","reqName","commit","requestMgr","DisplayObjectMgr","display","rebuild","update","renderData","remove","RenderNode","m","callback","RenderGroup","child","Ctor","copy","node","RenderPoint","RenderEdge","RenderText","Vec3","RenderMesh","verts","indices","normals","uvs","renderMesh","verts1","length1","verts2","normals1","normals2","uvs1","uvs2","indices1","indices2","n","CMathUtil","mat1","mat2","GNODE_TYPE","_GNode","root","GRep","style","pStyle","canPick","canSnap","discreteParams","mat","parentGlobalMatrix","curNode","clearChildren","clearParent","gnode","GGroup","GNode","index","nodes","render","renderNode","cloneGeo","eId","dirtyProp","equals","target","fieldName","privateName","StateObject","_DisplayObject","_a","data","__decorateClass","DisplayObject","GrepDisplay","NullRender","_greps","ModelChangedCache","type","elements","fElements","modifiedContainer","deleteContainer","highLight","selection","EN_AnchorX","EN_AnchorY","_StyleUtils","base","state","point","line","face","text","StyleUtils","ModelView","grep","container","added","modified","deleted","did","greps","gnodes","isSelection","gMat","cloned","stateStyle","DocSaver","file","trans","newEles","Document","maxId","_Document","brep","eIds","elementsToDelete","eleId","eleIds","filter","ctorStr","evtType","DB","propName","db","val1","val2","newVal","Loader","defualtVal","res1","res2","arr","arr1","item","valType","map","mArr","res","jsonMap","dbMap","dbVal","sArr","setArr","obj","Element","_params","RegisterElement","tmpEle","TmpElement","TmpElementPainter","GNode2d","plane","geo","GCurve2d","p","params","GPolycurve","pts","alg","EN_GEO_TYPE","GPoint2d","GPolygon","mesh2ds","vertices","faces","xy","GText2d","pos","Vec2","gText","IRender","RenderNodeUtil","rNode","Request","registerRequest","UndoRequest","RedoRequest","Signal","subject","event","fn","listener","idx","SignalHook","_listener","signal","callbacks","toRemoveCallbacks"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ccpc/core",
3
- "version": "0.1.27",
3
+ "version": "0.1.28",
4
4
  "description": "Core data model layer for editor",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./index.js",
8
8
  "types": "./types/index.d.ts",
9
9
  "peerDependencies": {
10
- "@ccpc/math": "^0.1.27"
10
+ "@ccpc/math": "^0.1.28"
11
11
  }
12
12
  }