瀏覽代碼

目录改造;添加编辑器文档

haojianlong 4 年之前
父節點
當前提交
cd8009f356
共有 41 個文件被更改,包括 1130 次插入41 次删除
  1. 2 2
      docs/.vuepress/components/example/graph/MapDemo.vue
  2. 13 0
      docs/.vuepress/components/edit/items/line.vue
  3. 0 0
      docs/.vuepress/components/engine/shape/Circle1.vue
  4. 0 0
      docs/.vuepress/components/engine/shape/DrawLine1.vue
  5. 0 0
      docs/.vuepress/components/engine/shape/DrawLine2.vue
  6. 0 0
      docs/.vuepress/components/engine/shape/DrawPolyline1.vue
  7. 0 0
      docs/.vuepress/components/engine/shape/DrawRect1.vue
  8. 0 0
      docs/.vuepress/components/engine/style/shadow.vue
  9. 0 0
      docs/.vuepress/components/scene/Align.vue
  10. 0 0
      docs/.vuepress/components/scene/Undo1.vue
  11. 0 0
      docs/.vuepress/components/scene/items/ClockItem.vue
  12. 0 0
      docs/.vuepress/components/scene/items/ImageItem.vue
  13. 0 0
      docs/.vuepress/components/scene/items/PolylineItem.vue
  14. 0 0
      docs/.vuepress/components/scene/items/SEditLine.vue
  15. 0 0
      docs/.vuepress/components/scene/items/SEditPolygon.vue
  16. 0 0
      docs/.vuepress/components/scene/items/SImgTextItem.vue
  17. 0 0
      docs/.vuepress/components/scene/items/TextItem.vue
  18. 4 2
      docs/.vuepress/config.js
  19. 92 0
      docs/guides/big/items/src/SColumnItem.ts
  20. 138 0
      docs/guides/big/items/src/SDoorItem.ts
  21. 246 0
      docs/guides/big/items/src/SSpaceItem.ts
  22. 113 0
      docs/guides/big/items/src/SVirtualWallItem.ts
  23. 92 0
      docs/guides/big/items/src/SWallItem.ts
  24. 84 0
      docs/guides/big/items/src/SWindowItem.ts
  25. 255 0
      docs/guides/big/items/src/ZoneItem.ts
  26. 45 0
      docs/guides/big/items/wall.md
  27. 2 2
      docs/guides/big/mapDemo.md
  28. 0 0
      docs/guides/edit/README.md
  29. 1 0
      docs/guides/edit/items/line.md
  30. 8 8
      docs/guides/engine/draw.md
  31. 1 1
      docs/guides/engine/style.md
  32. 14 6
      docs/guides/index.js
  33. 2 2
      docs/guides/scene/align.md
  34. 3 3
      docs/guides/scene/items/clock.md
  35. 3 3
      docs/guides/scene/items/editLine.md
  36. 2 2
      docs/guides/scene/items/editPolygon.md
  37. 2 2
      docs/guides/scene/items/editPolyline.md
  38. 2 2
      docs/guides/scene/items/image.md
  39. 1 1
      docs/guides/scene/items/imgText.md
  40. 3 3
      docs/guides/scene/items/text.md
  41. 2 2
      docs/guides/scene/undo.md

+ 2 - 2
docs/.vuepress/components/example/graph/MapDemo.vue

@@ -15,8 +15,8 @@
             return{
                 view:null,
                 scene:null,
-                map1: require('../../../../public/assets/map/1.json'),
-                map2: require('../../../../public/assets/map/2.json'),
+                map1: require('../../../public/assets/map/1.json'),
+                map2: require('../../../public/assets/map/2.json'),
             }
         },
         mounted(){

+ 13 - 0
docs/.vuepress/components/edit/items/line.vue

@@ -0,0 +1,13 @@
+<template>
+    <div>1</div>
+</template>
+
+<script>
+    export default {
+        name: "line"
+    }
+</script>
+
+<style scoped>
+
+</style>

docs/.vuepress/components/example/graph/Circle1.vue → docs/.vuepress/components/engine/shape/Circle1.vue


docs/.vuepress/components/example/graph/DrawLine1.vue → docs/.vuepress/components/engine/shape/DrawLine1.vue


docs/.vuepress/components/example/graph/DrawLine2.vue → docs/.vuepress/components/engine/shape/DrawLine2.vue


docs/.vuepress/components/example/graph/DrawPolyline1.vue → docs/.vuepress/components/engine/shape/DrawPolyline1.vue


docs/.vuepress/components/example/graph/DrawRect1.vue → docs/.vuepress/components/engine/shape/DrawRect1.vue


docs/.vuepress/components/example/graph/style/shadow.vue → docs/.vuepress/components/engine/style/shadow.vue


docs/.vuepress/components/example/graph/scene/Align.vue → docs/.vuepress/components/scene/Align.vue


docs/.vuepress/components/example/graph/scene/Undo1.vue → docs/.vuepress/components/scene/Undo1.vue


docs/.vuepress/components/example/graph/scene/ClockItem.vue → docs/.vuepress/components/scene/items/ClockItem.vue


docs/.vuepress/components/example/graph/scene/ImageItem.vue → docs/.vuepress/components/scene/items/ImageItem.vue


docs/.vuepress/components/example/graph/scene/PolylineItem.vue → docs/.vuepress/components/scene/items/PolylineItem.vue


docs/.vuepress/components/example/graph/scene/SEditLine.vue → docs/.vuepress/components/scene/items/SEditLine.vue


docs/.vuepress/components/example/graph/scene/SEditPolygon.vue → docs/.vuepress/components/scene/items/SEditPolygon.vue


docs/.vuepress/components/example/graph/scene/SImgTextItem.vue → docs/.vuepress/components/scene/items/SImgTextItem.vue


docs/.vuepress/components/example/graph/scene/TextItem.vue → docs/.vuepress/components/scene/items/TextItem.vue


+ 4 - 2
docs/.vuepress/config.js

@@ -58,9 +58,11 @@ module.exports = {
                     {
                         text: "引擎",
                         items: [
+                            {text: "安装", link: "/guides/base/"},
                             {text: "图形引擎", link: "/guides/engine/"},
                             {text: "场景管理", link: "/guides/scene/"},
-                            {text: "建筑信息", link: "/guides/big"}
+                            {text: "楼层平面图", link: "/guides/big/"},
+                            {text: "系统图", link: "/guides/system-diagram/"}
                         ]
                     },
                 ]
@@ -74,7 +76,7 @@ module.exports = {
             }
         ],
         displayAllHeaders: true,
-        sidebarDepth: 1,
+        sidebarDepth: 0,
         sidebar: {
             "/setup/" : setupContent,
             "/guides/": graphContent

+ 92 - 0
docs/guides/big/items/src/SColumnItem.ts

@@ -0,0 +1,92 @@
+import {SGraphItem} from "@persagy-web/graph/lib";
+import {Column} from "@persagy-web/big/lib/types/floor/Column";
+import {SPainter, SPoint, SRect} from "@persagy-web/draw/lib";
+import {ItemColor, ItemOrder} from "@persagy-web/big/lib";
+
+/**
+ * 柱子item
+ *
+ * @author  郝建龙
+ */
+export class SColumnItem extends SGraphItem {
+    /** 柱子数据    */
+    data: Column;
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+    /** 柱子轮廓线坐标list  */
+    private readonly pointArr: SPoint[][] = [];
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      柱子数据
+     */
+    constructor(parent: SGraphItem | null, data: Column) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.columnOrder;
+        let tempArr = this.data.OutLine;
+        if (tempArr && tempArr.length) {
+            this.minX = tempArr[0][0].X;
+            this.maxX = this.minX;
+            this.minY = -tempArr[0][0].Y;
+            this.maxY = this.minY;
+            this.pointArr = tempArr.map((t): SPoint[] => {
+                return t.map(
+                    (it): SPoint => {
+                        let x = it.X,
+                            y = -it.Y;
+                        if (x < this.minX) {
+                            this.minX = x;
+                        }
+                        if (y < this.minY) {
+                            this.minY = y;
+                        }
+                        if (x > this.maxX) {
+                            this.maxX = x;
+                        }
+                        if (y > this.maxY) {
+                            this.maxY = y;
+                        }
+                        return new SPoint(x, y);
+                    }
+                );
+            });
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.pen.color = ItemColor.columnColor;
+        painter.pen.lineWidth = painter.toPx(1);
+        painter.brush.color = ItemColor.columnColor;
+        this.pointArr.forEach((t): void => {
+            painter.drawPolygon(t);
+        });
+    } // Function onDraw()
+} // Class SColumnItem

+ 138 - 0
docs/guides/big/items/src/SDoorItem.ts

@@ -0,0 +1,138 @@
+import { Door } from "../../types/floor/Door";
+import { SPainter, SPoint, SRect } from "@persagy-web/draw/lib";
+import { SMathUtil } from "../../utils/SMathUtil";
+import { ItemOrder } from "../..";
+import { ItemColor } from "../..";
+import { SGraphItem } from "@persagy-web/graph/lib";
+
+/**
+ * 门item
+ *
+ * @author  郝建龙
+ */
+export class SDoorItem extends SGraphItem {
+    /** 门数据 */
+    data: Door;
+    /** 门轮廓线坐标list  */
+    private readonly pointArr: SPoint[] = [];
+    /** 门长度 */
+    private readonly r: number = 0;
+    /** 角度  */
+    private readonly ang: number = 0;
+    /** 旋转点 */
+    private readonly p: SPoint = new SPoint(0, 0);
+    /** 旋转起始角度,结束角度+Math.PI/2 */
+    private readonly startAng: number = -Math.PI / 2;
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      门数据
+     */
+    constructor(parent: SGraphItem | null, data: Door) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.doorOrder;
+        if (this.data.OutLine.length) {
+            this.pointArr = this.data.OutLine[0].map(
+                (t): SPoint => {
+                    let x = t.X,
+                        y = -t.Y;
+                    if (x < this.minX) {
+                        this.minX = x;
+                    }
+                    if (y < this.minY) {
+                        this.minY = y;
+                    }
+                    if (x > this.maxX) {
+                        this.maxX = x;
+                    }
+                    if (y > this.maxY) {
+                        this.maxY = y;
+                    }
+                    return new SPoint(t.X, -t.Y);
+                }
+            );
+
+            let p1 = this.pointArr[0],
+                p2 = this.pointArr[1];
+            // 旋转点
+            this.p = p1;
+            const HX = (this.data.HandDirection.X = Number(
+                this.data.HandDirection.X.toFixed()
+            ));
+            const HY = (this.data.HandDirection.Y = Number(
+                this.data.HandDirection.Y.toFixed()
+            ));
+            const FX = (this.data.FaceDirection.X = Number(
+                this.data.FaceDirection.X.toFixed()
+            ));
+            const FY = (this.data.FaceDirection.Y = Number(
+                this.data.FaceDirection.Y.toFixed()
+            ));
+            // 向量点乘 => x1 * x2 + y1 * y2,大于0同向
+            let dotProduct = (p2.x - p1.x) * HX + (p2.y - p1.y) * -HY;
+            if (dotProduct > 0) {
+                this.p = p2;
+                p2 = p1;
+                p1 = this.p;
+            }
+            // 两点间距离
+            this.r = SMathUtil.pointDistance(p1.x, p1.y, p2.x, p2.y);
+            // 门朝向角度
+            let fo = Math.atan(-FY / FX);
+            this.ang = FX > 0 ? fo : fo + Math.PI;
+            // 向量叉乘 => x1 * y2 - x2 * y1,小于0是顺时针
+            let direction = (p2.x - p1.x) * -FY - (p2.y - p1.y) * FX;
+            if (direction > 0) {
+                this.startAng = 0;
+            }
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.translate(this.p.x, this.p.y);
+        painter.rotate(this.ang);
+        painter.pen.lineWidth = 100;
+        painter.pen.color = ItemColor.doorColor;
+        painter.drawLine(0, 0, this.r, 0);
+        painter.pen.lineDash = [50, 100];
+        painter.pen.lineWidth = painter.toPx(1);
+        // painter.drawArc(
+        //     -this.r,
+        //     -this.r,
+        //     this.r * 2,
+        //     this.r * 2,
+        //     this.startAng,
+        //     this.startAng + Math.PI / 2
+        // );
+    } // Function onDraw()
+} // Class SDoorItem

+ 246 - 0
docs/guides/big/items/src/SSpaceItem.ts

@@ -0,0 +1,246 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+import {
+    SColor,
+    SPainter,
+    SPath2D,
+    SPoint,
+    SPolygonUtil,
+    SRect,
+    STextAlign
+} from "@persagy-web/draw/lib";
+import { Space } from "../../types/floor/Space";
+import { SMouseEvent } from "@persagy-web/base/lib";
+import { ItemOrder } from "../..";
+import { ItemColor } from "../..";
+import { SGraphItem } from "@persagy-web/graph/lib";
+
+/**
+ * 模型空间item
+ *
+ * @author  郝建龙
+ */
+export class SSpaceItem extends SGraphItem {
+    /** 空间所有数据  */
+    data: Space;
+    /** 空间轮廓线坐标list  */
+    readonly pointArr: SPoint[][] = [];
+    /** X坐标最小值  */
+    minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    maxY = Number.MIN_SAFE_INTEGER;
+    /** path对象      */
+    private path = new SPath2D();
+    /** 高亮状态    */
+    private _highLightFlag: boolean = false;
+    get highLightFlag(): boolean {
+        return this._highLightFlag;
+    } // Get highLightFlag
+    set highLightFlag(value: boolean) {
+        this._highLightFlag = value;
+        this.update();
+    } // Set highLightFlag
+    /** 是否显示名字  */
+    private _showBaseName: boolean = false;
+    get showBaseName(): boolean {
+        return this._showBaseName;
+    } // Get showBaseName
+    set showBaseName(value: boolean) {
+        this._showBaseName = value;
+        this.update();
+    } // Set showBaseName
+    /** 是否名字大小  */
+    private _nameSize: number = 10;
+    get nameSize(): number {
+        return this._nameSize;
+    } // Get nameSize
+    set nameSize(value: number) {
+        this._nameSize = value;
+        this.update();
+    } // Set nameSize
+    /** 名字是否缩放  */
+    private _nameTransform: boolean = false;
+    get nameTransform(): boolean {
+        return this._nameTransform;
+    } // Get nameTransform
+    set nameTransform(value: boolean) {
+        this._nameTransform = value;
+        this.update();
+    } // Set nameTransform
+    /** 名字颜色    */
+    private _nameColor: string = "#000000";
+    get nameColor(): string {
+        return this._nameColor;
+    } // Get nameColor
+    set nameColor(value: string) {
+        this._nameColor = value;
+        this.update();
+    } // Set nameColor
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      空间数据
+     */
+    constructor(parent: SGraphItem | null, data: Space) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.spaceOrder;
+        let tempArr = this.data.OutLine;
+        this.name = data.Name || "";
+        if (tempArr && tempArr.length) {
+            this.minX = tempArr[0][0].X;
+            this.maxX = this.minX;
+            this.minY = -tempArr[0][0].Y;
+            this.maxY = this.minY;
+            this.pointArr = tempArr.map((t): SPoint[] => {
+                let temp = t.map(
+                    (it): SPoint => {
+                        let x = it.X,
+                            y = -it.Y;
+                        if (x < this.minX) {
+                            this.minX = x;
+                        }
+                        if (y < this.minY) {
+                            this.minY = y;
+                        }
+                        if (x > this.maxX) {
+                            this.maxX = x;
+                        }
+                        if (y > this.maxY) {
+                            this.maxY = y;
+                        }
+                        return new SPoint(x, y);
+                    }
+                );
+                this.path.polygon(temp);
+                return temp;
+            });
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    // /**
+    //  * 鼠标单击事件
+    //  *
+    //  * @param	event         事件参数
+    //  * @return	boolean
+    //  */
+    // onMouseDown(event: SMouseEvent): boolean {
+    //     console.log("spaceDown");
+    //     this.$emit("click", event);
+    //     return true;
+    // } // Function onMouseDown()
+
+    // /**
+    //  * 鼠标移动事件
+    //  *
+    //  * @param event 事件参数
+    //  */
+    // onMouseMove(event: SMouseEvent): boolean {
+    //     return false;
+    // } // Function onMouseMove()
+
+    // /**
+    //  * 鼠标抬起事件
+    //  *
+    //  * @param	event         事件参数
+    //  * @return	boolean
+    //  */
+    // onMouseUp(event: SMouseEvent): boolean {
+    //     console.log("spaceUp");
+    //     return false;
+    // } // Function onClick()
+
+    /**
+     * 判断点是否在区域内
+     *
+     * @param x
+     * @param y
+     */
+    contains(x: number, y: number): boolean {
+        let arr = this.pointArr;
+        if (arr.length < 1 || !SPolygonUtil.pointIn(x, y, arr[0])) {
+            return false;
+        }
+
+        for (let i = 1; i < arr.length; i++) {
+            if (SPolygonUtil.pointIn(x, y, arr[i])) {
+                return false;
+            }
+        }
+        return true;
+    } // Function contains()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.pen.color = ItemColor.spaceBorderColor;
+        if (this.selected) {
+            painter.brush.color = ItemColor.selectColor;
+        } else if (this.highLightFlag) {
+            painter.brush.color = ItemColor.spaceHighColor;
+        } else {
+            painter.brush.color = ItemColor.spaceColor;
+        }
+        painter.pen.lineWidth = painter.toPx(1);
+        painter.drawPath(this.path);
+
+        if (this.showBaseName) {
+            if (this.name && this.name != "null") {
+                painter.brush.color = new SColor(this.nameColor);
+                if (this.nameTransform) {
+                    painter.font.size = this.nameSize;
+                } else {
+                    painter.font.size = painter.toPx(this.nameSize);
+                }
+                // painter.font.size = 500;
+                painter.font.textAlign = STextAlign.Center;
+                painter.drawText(
+                    this.name,
+                    this.data.Location.Points[0].X,
+                    -this.data.Location.Points[0].Y
+                );
+            }
+        }
+    } // Function onDraw()
+} // Class SSpaceItem

+ 113 - 0
docs/guides/big/items/src/SVirtualWallItem.ts

@@ -0,0 +1,113 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+import { SPainter, SPoint, SRect } from "@persagy-web/draw/lib";
+import { VirtualWall } from "../../types/floor/VirtualWall";
+import { ItemOrder } from "../..";
+import { ItemColor } from "../..";
+import { SGraphItem } from "@persagy-web/graph/lib";
+
+/**
+ * 墙item
+ *
+ * @author  郝建龙
+ */
+export class SVirtualWallItem extends SGraphItem {
+    /** 虚拟墙数据   */
+    data: VirtualWall;
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+    /** 虚拟墙轮廓线坐标list  */
+    private readonly pointArr: SPoint[][] = [];
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      虚拟墙数据
+     */
+    constructor(parent: SGraphItem | null, data: VirtualWall) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.virtualWallOrder;
+        let tempArr = this.data.OutLine;
+        if (tempArr && tempArr.length) {
+            this.minX = tempArr[0][0].X;
+            this.maxX = this.minX;
+            this.minY = -tempArr[0][0].Y;
+            this.maxY = this.minY;
+            this.pointArr = tempArr.map((t): SPoint[] => {
+                return t.map(
+                    (it): SPoint => {
+                        let x = it.X,
+                            y = -it.Y;
+                        if (x < this.minX) {
+                            this.minX = x;
+                        }
+                        if (y < this.minY) {
+                            this.minY = y;
+                        }
+                        if (x > this.maxX) {
+                            this.maxX = x;
+                        }
+                        if (y > this.maxY) {
+                            this.maxY = y;
+                        }
+                        return new SPoint(x, y);
+                    }
+                );
+            });
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.pen.lineWidth = painter.toPx(1);
+        painter.pen.color = ItemColor.virtualWallColor;
+        painter.pen.lineDash = [20, 20];
+        this.pointArr.forEach((t): void => {
+            painter.drawPolyline(t);
+        });
+    } // Function onDraw()
+} // Class SVirtualWallItem

+ 92 - 0
docs/guides/big/items/src/SWallItem.ts

@@ -0,0 +1,92 @@
+import { SPainter, SPoint, SRect } from "@persagy-web/draw/lib";
+import { SGraphItem } from "@persagy-web/graph/lib";
+import { Wall } from "@persagy-web/big/lib/types/floor/Wall";
+import { ItemColor, ItemOrder } from "@persagy-web/big/lib";
+
+/**
+ * 墙item
+ *
+ * @author  郝建龙
+ */
+export class SWallItem extends SGraphItem {
+    /** 墙数据 */
+    data: Wall;
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+    /** 墙轮廓线坐标list  */
+    private readonly pointArr: SPoint[][] = [];
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      墙数据
+     */
+    constructor(parent: SGraphItem | null, data: Wall) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.wallOrder;
+        let tempArr = this.data.OutLine;
+        if (tempArr && tempArr.length) {
+            this.minX = tempArr[0][0].X;
+            this.maxX = this.minX;
+            this.minY = -tempArr[0][0].Y;
+            this.maxY = this.minY;
+            this.pointArr = tempArr.map((t): SPoint[] => {
+                return t.map(
+                    (it): SPoint => {
+                        let x = it.X,
+                            y = -it.Y;
+                        if (x < this.minX) {
+                            this.minX = x;
+                        }
+                        if (y < this.minY) {
+                            this.minY = y;
+                        }
+                        if (x > this.maxX) {
+                            this.maxX = x;
+                        }
+                        if (y > this.maxY) {
+                            this.maxY = y;
+                        }
+                        return new SPoint(x, y);
+                    }
+                );
+            });
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.pen.color = ItemColor.wallColor;
+        painter.pen.lineWidth = painter.toPx(1);
+        painter.brush.color = ItemColor.wallColor;
+        this.pointArr.forEach((t): void => {
+            painter.drawPolygon(t);
+        });
+    } // Function onDraw()
+} // Class SWallItem

+ 84 - 0
docs/guides/big/items/src/SWindowItem.ts

@@ -0,0 +1,84 @@
+
+import { SPainter, SPoint, SRect } from "@persagy-web/draw/lib";
+import { Casement } from "../../types/floor/Casement";
+import { ItemOrder } from "../..";
+import { ItemColor } from "../..";
+import { SGraphItem } from "@persagy-web/graph/lib";
+
+/**
+ * 窗户item
+ *
+ * @author  郝建龙
+ */
+export class SWindowItem extends SGraphItem {
+    /** 窗户数据    */
+    data: Casement;
+    /** 窗户轮廓线坐标list  */
+    private readonly pointArr: SPoint[] = [];
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      窗户数据
+     */
+    constructor(parent: SGraphItem | null, data: Casement) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.windowOrder;
+        if (this.data.OutLine.length) {
+            this.pointArr = this.data.OutLine[0].map(
+                (t): SPoint => {
+                    let x = t.X,
+                        y = -t.Y;
+                    if (x < this.minX) {
+                        this.minX = x;
+                    }
+                    if (y < this.minY) {
+                        this.minY = y;
+                    }
+                    if (x > this.maxX) {
+                        this.maxX = x;
+                    }
+                    if (y > this.maxY) {
+                        this.maxY = y;
+                    }
+                    return new SPoint(t.X, -t.Y);
+                }
+            );
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter       painter对象
+     */
+    onDraw(painter: SPainter): void {
+        painter.pen.color = ItemColor.windowColor;
+        painter.pen.lineWidth = painter.toPx(1);
+        painter.drawPolyline(this.pointArr);
+    } // Function onDraw()
+} // Class SWindowItem

+ 255 - 0
docs/guides/big/items/src/ZoneItem.ts

@@ -0,0 +1,255 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+import {
+    SColor,
+    SPainter,
+    SPath2D,
+    SPoint,
+    SPolygonUtil,
+    SRect
+} from "@persagy-web/draw/lib";
+import { SMouseEvent } from "@persagy-web/base/lib";
+import { Zone } from "../../types/floor/Zone";
+import { ItemColor, ItemOrder, Transparency } from "../..";
+import { SGraphItem } from "@persagy-web/graph/lib";
+
+/**
+ * 业务空间item
+ *
+ * @author  郝建龙
+ */
+export class SZoneItem extends SGraphItem {
+    /** 空间所有数据  */
+    data: Zone;
+    /** 空间轮廓线坐标list  */
+    readonly pointArr: SPoint[][][] = [];
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
+    /** path    */
+    private pathList: SPath2D[] = [];
+    /** 点击位置坐标  */
+    private clickPoint: SPoint | undefined;
+    /** 选中时的颜色  */
+    private selectColor: SColor = ItemColor.selectColor;
+    /** 不可选时的颜色  */
+    private unselectColor: SColor = ItemColor.zoneUnselectColor;
+    /** 高亮状态    */
+    private _highLightFlag: boolean = false;
+    get highLightFlag(): boolean {
+        return this._highLightFlag;
+    } // Get highLightFlag
+    set highLightFlag(value: boolean) {
+        this._highLightFlag = value;
+        this.update();
+    } // Set highLightFlag
+    /** 透明度 */
+    _transparency: number = 20;
+    get transparency(): number {
+        return this._transparency;
+    } // Get transparency
+    set transparency(value: number) {
+        this._transparency = value;
+        this.update();
+    } // Set transparency
+    /** 受影响状态   */
+    _isInfected: boolean = false;
+    get isInfected(): boolean {
+        return this._isInfected;
+    } // Get isInfected
+    set isInfected(value: boolean) {
+        this._isInfected = value;
+        this.update();
+    } // Set isInfected
+    /** 受影响的业务空间填充颜色    */
+    private infectedColor: SColor = ItemColor.zoneInfectedColor;
+    /** 受影响的业务空间边框颜色    */
+    private infectedBorder: SColor = ItemColor.zoneInfectedBorder;
+
+    /**
+     * 构造函数
+     *
+     * @param parent    指向父对象
+     * @param data      空间数据
+     */
+    constructor(parent: SGraphItem | null, data: Zone) {
+        super(parent);
+        this.data = data;
+        this.zOrder = ItemOrder.zoneOrder;
+        this.highLightFlag = data.HighLightFlag || false;
+        this.transparency = data.Transparency || 20;
+        this.isInfected = data.Infected || false;
+        if (
+            this.data.OutLine.length &&
+            this.data.OutLine[0] &&
+            this.data.OutLine[0].length
+        ) {
+            let tempArr = this.data.OutLine;
+            this.minX = tempArr[0][0][0].X;
+            this.maxX = this.minX;
+            this.minY = -tempArr[0][0][0].Y;
+            this.maxY = this.minY;
+            // 处理轮廓点数组,同时计算最大最小值
+            this.pointArr = tempArr.map((t): SPoint[][] => {
+                let sPath = new SPath2D();
+                let tempArr = t.map((it): SPoint[] => {
+                    let array = it.map(
+                        (item): SPoint => {
+                            let x = item.X,
+                                y = -item.Y;
+                            if (x < this.minX) {
+                                this.minX = x;
+                            }
+                            if (y < this.minY) {
+                                this.minY = y;
+                            }
+                            if (x > this.maxX) {
+                                this.maxX = x;
+                            }
+                            if (y > this.maxY) {
+                                this.maxY = y;
+                            }
+                            return new SPoint(x, y);
+                        }
+                    );
+                    sPath.polygon(array);
+                    return array;
+                });
+                this.pathList.push(sPath);
+                return tempArr;
+            });
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
+     * 鼠标单击事件
+     *
+     * @param   event   事件参数
+     * @return  boolean
+     */
+    onMouseDown(event: SMouseEvent): boolean {
+        if (this.selectable) {
+            this.selected = !this.selected;
+            this.clickPoint = new SPoint(event.x, event.y);
+        }
+        this.$emit("click", event);
+        return true;
+    } // Function onMouseDown()
+
+    /**
+     * 鼠标抬起事件
+     *
+     * @param   event   事件参数
+     * @return  boolean
+     */
+    onMouseUp(event: SMouseEvent): boolean {
+        return false;
+    } // Function onMouseUp()
+
+    /**
+     * 判断点是否在区域内
+     *
+     * @param x
+     * @param y
+     */
+    contains(x: number, y: number): boolean {
+        // return true;
+        for (let j = 0; j < this.pointArr.length; j++) {
+            let arr = this.pointArr[j];
+            if (arr.length < 1 || !SPolygonUtil.pointIn(x, y, arr[0])) {
+                continue;
+            }
+            if (arr.length == 1) {
+                return true;
+            }
+            let flag = false;
+            for (let i = 1; i < arr.length; i++) {
+                if (SPolygonUtil.pointIn(x, y, arr[i])) {
+                    flag = true;
+                    break;
+                }
+            }
+            if (flag) {
+                continue;
+            }
+            return true;
+        }
+        return false;
+    } // Function contains()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   painter painter对象
+     * @param   rect    绘制区域
+     */
+    onDraw(painter: SPainter, rect?: SRect): void {
+        painter.pen.color = SColor.Transparent;
+        if (!this.selectable) {
+            painter.brush.color = this.unselectColor;
+        } else {
+            if (this.selected) {
+                painter.brush.color = this.selectColor;
+            } else if (this.highLightFlag) {
+                painter.brush.color = new SColor(this.data.Color);
+            } else if (this.isInfected) {
+                painter.brush.color = this.infectedColor;
+                // painter.pen.color = this.infectedBorder;
+            } else {
+                painter.brush.color = new SColor(
+                    `${this.data.Color}${Transparency[this.transparency]}`
+                );
+            }
+        }
+        painter.pen.lineWidth = painter.toPx(1);
+        this.pathList.forEach((t): void => {
+            painter.drawPath(t);
+        });
+        painter.brush.color = SColor.Black;
+        painter.font.size = painter.toPx(10);
+        if (this.clickPoint) {
+            painter.drawText(
+                this.data.RoomLocalName,
+                this.clickPoint.x,
+                this.clickPoint.y
+            );
+        }
+    } // Function onDraw()
+} // Class ZoneItem

+ 45 - 0
docs/guides/big/items/wall.md

@@ -0,0 +1,45 @@
+# 墙 Item 示例
+::: details 目录
+[[toc]]
+:::
+
+## 源代码
+
+::: details 查看代码
+
+<<< @/docs/guides/big/items/src/SWallItem.ts
+
+:::
+
+## 代码说明
+    
+### 数据说明
+```
+    Walls:[
+        {
+            LevelId: '',                        // 层id
+            Location: {X:0,Y:0,Z:0},            // 位置
+            ModelId: '',                        // 模型id
+            Name: '',                           // 名称
+            OutLine: [
+                [{X:0,Y:0,Z:0},...],            // 外轮廓 
+                ...                             // 内轮廓
+            ],                                  // 轮廓线
+            SourceId: '',                       // 对应Revit模型id
+            Tag: '',                            // 补充信息
+            Width: 200,                         // 厚度
+        },
+        ...
+    ]
+```
+墙是一段一段组成的;每段墙都可能挖洞; outline 中第一项是外轮廓,从第二项开始均为内轮廓,内轮廓即为挖洞;外轮廓数据顺时针排序,内轮廓为逆时针排序;
+
+### 计算边界矩阵
+不能在绘制的时候计算,因为绘制是高频调用方法,尽量不要在绘制方法中做大量计算工作;
+
+计算方法一般在数据变化的时候做,如果只是展示的话,则只需要在构造函数中计算一次;
+
+### Y轴取反
+revit 坐标使用的是数学坐标系, Y 轴方向是向上的, canvas 坐标使用的绘图坐标系, Y 轴方向是向下的;
+ 
+数据是通过 revit 模型导出

+ 2 - 2
docs/guides/big/mapDemo.md

@@ -3,8 +3,8 @@
 [[toc]]
 :::
 
-<example-graph-MapDemo/>
+<big-MapDemo/>
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/mapDemo.vue
+<<< @/docs/.vuepress/components/big/mapDemo.vue
 :::

+ 0 - 0
docs/guides/edit/README.md


+ 1 - 0
docs/guides/edit/items/line.md

@@ -0,0 +1 @@
+# 线

+ 8 - 8
docs/guides/engine/draw.md

@@ -5,41 +5,41 @@
 
 ## 直线
 
-<example-graph-DrawLine1 /> 
+<engine-shape-DrawLine1 /> 
 
 ::: details 查看代码
 
-<<< @/docs/.vuepress/components/example/graph/DrawLine1.vue
+<<< @/docs/.vuepress/components/engine/shape/DrawLine1.vue
 
 :::
 
 ## 折线
 
-<example-graph-DrawPolyline1 /> 
+<engine-shape-DrawPolyline1 /> 
 
 ::: details 查看代码
 
-<<< @/docs/.vuepress/components/example/graph/DrawPolyline1.vue
+<<< @/docs/.vuepress/components/engine/shape/DrawPolyline1.vue
 
 :::
 
 ## 矩形
 
-<example-graph-DrawRect1 /> 
+<engine-shape-DrawRect1 /> 
 
 ::: details 查看代码
 
-<<< @/docs/.vuepress/components/example/graph/DrawRect1.vue
+<<< @/docs/.vuepress/components/engine/shape/DrawRect1.vue
 
 :::
 
 ## 圆
 
-<example-graph-Circle1 /> 
+<engine-shape-Circle1 /> 
 
 ::: details 查看代码
 
-<<< @/docs/.vuepress/components/example/graph/Circle1.vue
+<<< @/docs/.vuepress/components/engine/shape/Circle1.vue
 
 
 ## 椭圆

+ 1 - 1
docs/guides/engine/style.md

@@ -89,5 +89,5 @@ SColor 内置了一些常用颜色。见下表:
 
 ## 阴影
 
-<example-graph-style-shadow /> 
+<engine-style-shadow /> 
 

+ 14 - 6
docs/guides/index.js

@@ -5,7 +5,6 @@ const content = [
     },
     {
         title: "绘图引擎",
-        path: "/guides/",
         children: [
             ["/guides/engine/draw", "绘制形状"],
             ["/guides/engine/style", "颜色与样式"],
@@ -20,11 +19,9 @@ const content = [
     },
     {
         title: "场景管理",
-        path: "/guides/scene/",
         children: [
             {
                 title: "图元素实例",
-                path: "/dev/graph/scene/items/",
                 children: [
                     ["/guides/scene/items/clock", "时钟"],
                     ["/guides/scene/items/text", "文本"],
@@ -40,9 +37,14 @@ const content = [
         ]
     },
     {
-        title: "楼层平面图",
-        path: "/guides/big/",
+        title: "建筑信息图",
         children: [
+            {
+                title: "底图 Item 示例",
+                children: [
+                    ["/guides/big/items/wall", "墙"]
+                ]
+            },
             ["/guides/big/workLine", "工作流程"],
             ["/guides/big/downloadFile", "手工下载楼层底图文件"],
             ["/guides/big/jsonFile", "json数据格式"],
@@ -52,11 +54,17 @@ const content = [
     },
     {
         title: "系统图",
-        path: "/guides/system-diagram/",
         children: [
             ["/guides/system-diagram/json-file", "json数据格式"]
         ]
     },
+    {
+        title: "编辑器",
+        path: "/guides/edit/",
+        children: [
+            ["/guides/edit/items/line", "线"]
+        ]
+    },
 ];
 
 module.exports = content;

+ 2 - 2
docs/guides/scene/align.md

@@ -4,10 +4,10 @@
 [[toc]]
 :::
 
-<example-graph-scene-Align />
+<scene-Align />
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/Align.vue
+<<< @/docs/.vuepress/components/scene/Align.vue
 :::
 
 ::: tip 注

+ 3 - 3
docs/guides/scene/items/clock.md

@@ -3,8 +3,8 @@
 [[toc]]
 :::
 
-<example-graph-scene-ClockItem />
+<scene-items-ClockItem />
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/ClockItem.vue
-:::
+<<< @/docs/.vuepress/components/scene/items/ClockItem.vue
+:::

+ 3 - 3
docs/guides/scene/items/editLine.md

@@ -3,7 +3,7 @@
 [[toc]]
 :::
 
-<example-graph-scene-SEditLine/>
+<scene-items-SEditLine/>
 
 ::: tip 注
 1、可以通过双击直线在编辑状态和展示状态来回切换,<br/>
@@ -11,5 +11,5 @@
 :::
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/SEditLine.vue
-:::
+<<< @/docs/.vuepress/components/scene/items/SEditLine.vue
+:::

+ 2 - 2
docs/guides/scene/items/editPolygon.md

@@ -3,7 +3,7 @@
 [[toc]]
 :::
 
-<example-graph-scene-SEditPolygon />
+<scene-items-SEditPolygon />
 
 ::: tip 注
 1、可以通过双击table在编辑状态和展示状态来回切换,<br/>
@@ -13,5 +13,5 @@
 :::
 
 ::: details 查看代码
-@/docs/.vuepress/components/example/graph/scene/SEditPolygon.vue
+@/docs/.vuepress/components/scene/items/SEditPolygon.vue
 :::

+ 2 - 2
docs/guides/scene/items/editPolyline.md

@@ -1,6 +1,6 @@
 # 可编辑折线示例
 
-<example-graph-scene-PolylineItem/>
+<scene-items-PolylineItem/>
 
 ::: tip 注
 1、enter完成创建 <br/>
@@ -11,5 +11,5 @@
 
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/PolylineItem.vue
+<<< @/docs/.vuepress/components/scene/items/PolylineItem.vue
 :::

+ 2 - 2
docs/guides/scene/items/image.md

@@ -3,8 +3,8 @@
 [[toc]]
 :::
 
-<example-graph-scene-ImageItem/>
+<scene-items-ImageItem/>
 
 ::: details 查看代码
-@/docs/.vuepress/components/example/graph/scene/ImageItem.vue
+@/docs/.vuepress/components/scene/items/ImageItem.vue
 :::

+ 1 - 1
docs/guides/scene/items/imgText.md

@@ -3,4 +3,4 @@
 [[toc]]
 :::
 
-<example-graph-scene-SImgTextItem/>
+<scene-items-SImgTextItem/>

+ 3 - 3
docs/guides/scene/items/text.md

@@ -3,8 +3,8 @@
 [[toc]]
 :::
 
-<example-graph-scene-TextItem />
+<scene-items-TextItem />
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/TextItem.vue
-:::
+<<< @/docs/.vuepress/components/scene/items/TextItem.vue
+:::

+ 2 - 2
docs/guides/scene/undo.md

@@ -3,8 +3,8 @@
 [[toc]]
 :::
 
-<example-graph-scene-Undo1 />
+<scene-Undo1 />
 
 ::: details 查看代码
-<<< @/docs/.vuepress/components/example/graph/scene/Undo1.vue
+<<< @/docs/.vuepress/components/scene/Undo1.vue
 :::