Browse Source

Merge remote-tracking branch 'origin/master'

张维新 4 years ago
parent
commit
534f56da99

+ 13 - 4
docs/.vuepress/components/example/web/graph/DrawLine1.vue

@@ -1,19 +1,28 @@
 <template>
-    <canvas id="DrawLine1" width="800" height="200" />
+    <canvas id="drawLine1" width="800" height="100" />
 </template>
 
 <script lang="ts">
-    import { SCanvasView, SPainter } from "@saga-web/draw/lib";
+    import { SCanvasView, SColor, SPainter } from "@saga-web/draw/lib";
 
     class TestView extends SCanvasView {
 
         constructor() {
-            super("DrawLine1")
+            super("drawLine1")
         }
 
         onDraw(canvas: SPainter): void {
+            // 清除画布
+            canvas.clearRect(0,0,800,100);
+
             // 在此编写绘制操作相关命令
-            canvas.drawLine(0,0, 200, 200);
+            canvas.drawLine(0,0, 100, 100);
+
+            canvas.pen.lineWidth = 1;
+            canvas.pen.dashOffset = new Date().getTime()/50%60;
+            canvas.pen.lineDash = [10,50];
+            canvas.drawLine(200, 50, 400, 50);
+            this.update();
         }
     }
 

+ 48 - 0
docs/.vuepress/components/example/web/graph/DrawLine2.vue

@@ -0,0 +1,48 @@
+<template>
+    <canvas id="drawLine2" width="800" height="100" />
+</template>
+
+<script lang="ts">
+    import { SCanvasView, SColor, SPainter } from "@saga-web/draw/lib";
+
+    class TestView extends SCanvasView {
+
+        constructor() {
+            super("drawLine2")
+        }
+
+        onDraw(canvas: SPainter): void {
+            // 在此编写绘制操作相关命令
+            canvas.drawLine(0,0, 100, 100);
+
+            canvas.pen.lineWidth = 1;
+
+            canvas.pen.color = SColor.Blue;
+            for (let i = 0; i < 360; i += 10) {
+                let q = i * Math.PI / 180;
+                canvas.drawLine(
+                    200,
+                    50,
+                    200 + 50 * Math.cos(q),
+                    50 + 50 * Math.sin(q));
+            }
+
+            canvas.pen.color = SColor.Red;
+            for (let i = 0; i < 360; i += 10) {
+                let q1 = i * Math.PI / 180;
+                let q2 = (i + 120) * Math.PI / 180;
+                canvas.drawLine(
+                    350 + 50 * Math.cos(q1),
+                    50 + 50 * Math.sin(q1),
+                    350 + 50 * Math.cos(q2),
+                    50 + 50 * Math.sin(q2));
+            }
+        }
+    }
+
+    export default {
+        mounted() {
+            new TestView();
+        }
+    }
+</script>

+ 24 - 0
docs/.vuepress/components/example/web/graph/DrawPolyline1.vue

@@ -0,0 +1,24 @@
+<template>
+    <canvas id="drawPolyline1" width="800" height="100" />
+</template>
+
+<script lang="ts">
+    import {SCanvasView, SColor, SPainter, SPoint} from "@saga-web/draw/lib";
+
+    class TestView extends SCanvasView {
+        arr:SPoint[]=[new SPoint(10,10),new SPoint(10,40),new SPoint(30,30)]
+        constructor() {
+            super("drawPolyline1")
+        }
+
+        onDraw(canvas: SPainter): void {
+            canvas.drawPolyline(this.arr);
+        }
+    }
+
+    export default {
+        mounted() {
+            new TestView();
+        }
+    }
+</script>

+ 53 - 0
docs/.vuepress/components/example/web/graph/DrawRect1.vue

@@ -0,0 +1,53 @@
+<template>
+    <canvas id="drawRect1" width="800" height="180" />
+</template>
+
+<script lang="ts">
+    import { SCanvasView, SColor, SPainter, SPoint, SRect, SSize } from "@saga-web/draw/lib";
+
+    class TestView extends SCanvasView {
+
+        constructor() {
+            super("drawRect1")
+        }
+
+        onDraw(canvas: SPainter): void {
+            canvas.clearRect(0,0,800,200);
+
+            canvas.pen.color = SColor.Blue;
+            canvas.brush.color = SColor.Red;
+            canvas.drawRect(10, 10, 80, 80);
+
+            canvas.pen.color = SColor.Transparent;
+            canvas.brush.color = SColor.Red;
+            canvas.drawRect(new SPoint(110, 10), new SSize(80, 80));
+
+            canvas.pen.color = SColor.Blue;
+            canvas.brush.color = SColor.Transparent;
+            canvas.drawRect(new SRect(210, 10, 80, 80));
+
+            canvas.pen.lineWidth = 1;
+            canvas.pen.color = SColor.Blue;
+            canvas.brush.color = SColor.Transparent;
+            for (let i = 1; i < 100; i += 10) {
+                canvas.drawRect(310 + i, i, 80, 80);
+            }
+
+            canvas.pen.lineWidth = 2;
+            canvas.pen.color = SColor.Blue;
+            canvas.brush.color = SColor.Red;
+            let k = new Date().getTime()/100%10;
+            for (let i = 1; i < k*10; i += 10) {
+                canvas.drawRect(510 + i, i, 80, 80);
+            }
+
+            this.update();
+        }
+    }
+
+    export default {
+        mounted() {
+            new TestView();
+        }
+    }
+</script>

+ 193 - 0
docs/.vuepress/components/example/web/graph/scene/ClockItem.vue

@@ -0,0 +1,193 @@
+<template>
+    <canvas id="clockItem1" width="400" height="400" />
+</template>
+
+<script lang="ts">
+    import { SColor, SPainter, SRect } from "@saga-web/draw";
+    import { SGraphyItem, SGraphyScene, SGraphyView } from "@saga-web/graphy";
+
+    class ClockItem extends SGraphyItem {
+        /** 宽度 */
+        width = 100;
+        /** 高度 */
+        height = 100;
+
+        /** 半径 */
+        get radius(): number {
+            return Math.min(this.width, this.height) / 2.0;
+        }
+
+        /**
+         * 构造函数
+         *
+         * @param   parent      指向父Item
+         * @param   width       宽度
+         * @param   height      高度
+         */
+        constructor(parent: SGraphyItem | null, width: number, height: number) {
+            super(parent);
+            this.width = width;
+            this.height = height;
+        }
+
+        /**
+         * 对象边界区域
+         *
+         * @return  边界区域
+         */
+        boundingRect(): SRect {
+            return new SRect(0, 0, this.width, this.height);
+        }
+
+        /**
+         * Item绘制操作
+         *
+         * @param   canvas      画布
+         */
+        onDraw(canvas: SPainter): void {
+            canvas.translate(this.width / 2, this.height / 2);
+            const t = new Date();
+            this.drawScale(canvas);
+            this.drawHour(canvas, t.getHours(), t.getMinutes(), t.getSeconds());
+            this.drawMinute(canvas, t.getMinutes(), t.getSeconds());
+            this.drawSecond(canvas, t.getSeconds() + t.getMilliseconds() / 1000.0);
+
+            this.update();
+        }
+
+        /**
+         * 绘制表刻度
+         *
+         * @param   canvas      画布
+         */
+        private drawScale(canvas: SPainter): void {
+            const scaleLength = Math.max(this.radius / 10.0, 2.0);
+            const scaleLength1 = scaleLength * 1.2;
+            const strokeWidth = Math.max(this.radius / 100.0, 2.0);
+            const strokeWidth1 = strokeWidth * 2.0;
+
+            canvas.save();
+            canvas.pen.color = SColor.Blue;
+
+            for (let i = 1; i <= 12; i++) {
+                // 12小时刻度
+                canvas.pen.lineWidth = strokeWidth1;
+                canvas.drawLine(
+                    0,
+                    -this.radius,
+                    0,
+                    -this.radius + scaleLength1
+                );
+
+                if (this.radius >= 40) {
+                    // 如果半度大于40显示分钟刻度
+                    canvas.rotate((6 * Math.PI) / 180);
+                    for (let j = 1; j <= 4; j++) {
+                        // 分钟刻度
+                        canvas.pen.lineWidth = strokeWidth;
+                        canvas.drawLine(
+                            0,
+                            -this.radius,
+                            0,
+                            -this.radius + scaleLength
+                        );
+                        canvas.rotate((6 * Math.PI) / 180);
+                    }
+                } else {
+                    canvas.rotate((30 * Math.PI) / 180);
+                }
+            }
+
+            canvas.restore();
+        }
+
+        /**
+         * 绘制时针
+         *
+         * @param   canvas      画布
+         * @param   hour        时
+         * @param   minute      分
+         * @param   second      秒
+         */
+        private drawHour(
+            canvas: SPainter,
+            hour: number,
+            minute: number,
+            second: number
+        ): void {
+            canvas.save();
+            canvas.pen.color = SColor.Black;
+            canvas.rotate(
+                ((hour * 30.0 + (minute * 30.0) / 60 + (second * 30.0) / 3600) *
+                    Math.PI) /
+                180
+            );
+            canvas.drawLine(
+                0,
+                this.radius / 10.0,
+                0,
+                -this.radius / 2.0
+            );
+            canvas.restore();
+        }
+
+        /**
+         * 绘制秒针
+         *
+         * @param   canvas      画布
+         * @param   minute      分
+         * @param   second      秒
+         */
+        private drawMinute(canvas: SPainter, minute: number, second: number): void {
+            canvas.save();
+            canvas.pen.color = SColor.Black;
+            canvas.rotate(((minute * 6 + (second * 6) / 60.0) * Math.PI) / 180);
+            canvas.drawLine(
+                0,
+                this.radius / 10.0,
+                0,
+                (-this.radius * 2.0) / 3.0
+            );
+            canvas.restore();
+        }
+
+        /**
+         * 绘制秒针
+         *
+         * @param   canvas      画布
+         * @param   second      秒
+         */
+        private drawSecond(canvas: SPainter, second: number): void {
+            canvas.save();
+            canvas.pen.color = SColor.Red;
+            canvas.rotate((second * 6 * Math.PI) / 180);
+            canvas.drawLine(
+                0,
+                this.radius / 5.0,
+                0,
+                -this.radius + this.radius / 10.0
+            );
+            canvas.restore();
+        }
+    }
+
+    class TestView extends SGraphyView {
+        clock1 = new ClockItem(null, 300, 300);
+
+        constructor() {
+            super("clockItem1");
+            this.scene = new SGraphyScene();
+            this.scene.addItem(this.clock1);
+        }
+    }
+
+    export default {
+        mounted(): void {
+            new TestView();
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>

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

@@ -50,7 +50,8 @@ module.exports = {
                     {
                         text: "Web开发",
                         items: [
-                            { text: "系统图引擎", link: "/dev/saga-graphy/" }
+                            { text: "图形引擎", link: "/dev/saga-graphy/" },
+                            { text: "建筑信息图", link: "/dev/saga-big/" }
                         ]
                     },
                     {
@@ -83,7 +84,8 @@ module.exports = {
                     {
                         text: "Web开发",
                         items: [
-                            { text: "图形引擎", link: "http://adm.sagacloud.cn:8080/api/web/graphy/" }
+                            { text: "图形引擎", link: "http://adm.sagacloud.cn:8080/api/web/graphy/" },
+                            { text: "建筑信息图", link: "http://adm.sagacloud.cn:8080/api/web/big/" }
                         ]
                     },
                     {

+ 47 - 0
docs/dev/data-center/relations/belongs/Sh2Bd.md

@@ -0,0 +1,47 @@
+竖井关联的建筑
+
+# 计算流程
+    
+    根据竖井关联的空间关系来推导
+    
+# 处理流程
+    1. 竖井包含有业务空间, 并且业务空间有所属建筑
+    
+# 函数
+
+```
+
+CREATE OR REPLACE FUNCTION "public"."rel_sh2bd"("project_id" varchar)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+try:
+    # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
+    with plpy.subtransaction():
+        delete_plan = plpy.prepare("delete from  r_sh_in_bd rel where rel.project_id = $1 and sign = 2", ["text"])
+        delete_plan.execute([project_id])
+        join_plan = plpy.prepare("select distinct shsp.sh_id shaft_id, spbd.building_id building_id from relationship.r_sh2sp shsp inner join r_sp_in_bd spbd on shsp.sp_id = spbd.space_id where shsp.project_id = $1 and spbd.project_id = $1", ["text"])
+        rel = join_plan.execute([project_id])
+        for row in rel:
+            shaft_id = row['shaft_id']
+            building_id = row['building_id']
+            try:
+                plan = plpy.prepare("insert into r_sh_in_bd(shaft_id, building_id, project_id, sign) values($1, $2, $3, 2)", ["text", "text", "text"])
+                plan.execute([shaft_id, building_id, project_id])
+            except Exception as ex:
+                pass
+except Exception as e:
+    plpy.warning(e)
+    return False
+else:
+    return True
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+
+
+select public.rel_sh2bd('Pj1102290002')
+```
+
+## 入参
+    1. 项目id
+## 例子
+    select public.rel_sh2bd('Pj1102290002');

+ 1 - 1
docs/dev/data-center/relations/belongs/Sp2Sp.md

@@ -22,7 +22,7 @@ try:
     with plpy.subtransaction():
         delete_plan = plpy.prepare("delete from r_spatial_connection where project_id = $1 and sign = 2", ["text"])
         delete_plan.execute([project_id])
-        space_data_plan = plpy.prepare("SELECT id, project_id, floor_id, object_type, bim_location, outline FROM zone_space_base where project_id = $1 and outline is not null and floor_id is not null order by floor_id, object_type", ["text"])
+        space_data_plan = plpy.prepare("SELECT sp.id, sp.project_id, rel.floor_id, sp.object_type, sp.bim_location, sp.outline FROM zone_space_base sp inner join r_sp_in_fl rel on rel.space_id = sp.id where sp.project_id = $1 and rel.project_id = $1 and outline is not null order by floor_id, object_type", ["text"])
         space_data = space_data_plan.execute([project_id])
         rel_data = calc_space_adjacent(space_data)
         for single_rel in rel_data:

+ 48 - 0
docs/dev/data-center/relations/belongs/Sp2Sp2.md

@@ -0,0 +1,48 @@
+业务空间邻接关系
+## 前置条件
+    1. 业务空间有所在楼层
+    2. 业务空间有外轮廓
+## 处理流程
+    1. 查出所有有所在楼层, 并且外轮廓不是null的业务空间
+    2. 根据所在楼层, 业务空间分区来将业务空间分组
+    3. 计算每个分组内的业务空间的相邻关系
+    计算相邻算法:
+    1. 首先判断围成业务空间的线段, 两两空间之间是否有近似平行的线段(线段偏转误差小于1度)
+        1). 近似平行判断: 首先获取两个线段的斜率, 再计算斜率的反正切(即与x轴的角度, 不过是以pi为单位), 再判断两个角度差的绝对值是否小于1度
+    2. 如果有近似平行的线段, 判断是否相互有投影在线段上, 有投影在线段上, 则认为是两平行线段有重合部分, 业务空间有相邻的可能性
+    3. 在判断互相有投影点在对方线段上之后, 判断投影线的长度, 是否小于250mm(墙的最大厚度), 如果小于250mm则认为两空间相邻
+## 函数
+```
+create or replace function public.rel_sp2sp1(project_id character varying) returns boolean
+as
+$$
+from relations.src.business_space_adjacent.adjacent import calc_space_adjacent
+try:
+    # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
+    with plpy.subtransaction():
+        delete_plan = plpy.prepare("delete from r_spatial_connection where project_id = $1 and sign = 2", ["text"])
+        delete_plan.execute([project_id])
+        space_data_plan = plpy.prepare("SELECT id, project_id, floor_id, object_type, bim_location, outline FROM zone_space_base where project_id = $1 and outline is not null and floor_id is not null order by floor_id, object_type", ["text"])
+        space_data = space_data_plan.execute([project_id])
+        rel_data = calc_space_adjacent(space_data)
+        for single_rel in rel_data:
+            delete_duplicate_plan = plpy.prepare("delete from r_spatial_connection where space_id_one = $1 and space_id_two = $2", ["text", "text"])
+            delete_duplicate_plan.execute([single_rel['space_id_one'], single_rel['space_id_two']])
+            insert_plan = plpy.prepare("insert into r_spatial_connection(project_id, location_one, location_two, space_id_one, space_id_two, sign, graph_type, floor_id, zone_type) values($1, $2, $3, $4, $5, 2, 'SpaceNeighborhood', $6, $7)", ["text", "text", "text", "text", "text", "text", "text"])
+            insert_plan.execute([project_id, single_rel['location_one'], single_rel['location_two'], single_rel['space_id_one'], single_rel['space_id_two'], single_rel['floor_id'], single_rel['zone_type']])
+except Exception as e:
+    plpy.warning(e)
+    return False
+else:
+    return True
+$$
+LANGUAGE 'plpython3u' VOLATILE;
+
+
+select public.rel_sp2sp1('Pj1101050001')
+```
+
+## 入参
+    1. 项目id
+## 例子
+    select public.rel_sp2sp1('Pj1102290002');

+ 10 - 7
docs/dev/data-center/relations/belongs/Sy2Bd.md

@@ -11,9 +11,8 @@
 ## 函数
 ~~~
 -- 系统所在建筑
-create or replace function public.rel_sy2bd(project_id character varying) returns boolean
-as
-$$
+CREATE OR REPLACE FUNCTION "public"."rel_sy2bd"("project_id" varchar)
+  RETURNS "pg_catalog"."bool" AS $BODY$
 try:
     # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
     with plpy.subtransaction():
@@ -31,15 +30,19 @@ try:
             sys_set.add(building)
         for sid, sys_set in sy2bd.items():
             for building in sys_set:
-                plan = plpy.prepare("insert into r_sy_in_bd(sys_id, building_id, project_id, sign) values($1, $2, $3, 2)", ["text", "text", "text"])
-                plan.execute([sid, building, project_id])
+                try:
+                    plan = plpy.prepare("insert into r_sy_in_bd(sys_id, building_id, project_id, sign) values($1, $2, $3, 2)", ["text", "text", "text"])
+                    plan.execute([sid, building, project_id])
+                except Exception as ex:
+                    pass
 except Exception as e:
     plpy.warning(e)
     return False
 else:
     return True
-$$
-LANGUAGE 'plpython3u' VOLATILE;
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
 ~~~
 
 ## 入参

+ 13 - 5
docs/dev/data-center/relations/belongs/Sy2Sp.md

@@ -13,38 +13,46 @@
 create or replace function public.rel_sy2sp(project_id character varying) returns boolean
 as
 $$
+CREATE OR REPLACE FUNCTION "public"."rel_sy2sp"("project_id" varchar)
+  RETURNS "pg_catalog"."bool" AS $BODY$
 try:
     input_tables = ['r_eq_in_sp_zone_air_conditioning', 'r_eq_in_sp_zone_clean', 'r_eq_in_sp_zone_domestic_water_supply', 'r_eq_in_sp_zone_fire', 'r_eq_in_sp_zone_function',
         'r_eq_in_sp_zone_general', 'r_eq_in_sp_zone_heating', 'r_eq_in_sp_zone_lighting', 'r_eq_in_sp_zone_network', 'r_eq_in_sp_zone_power_supply', 'r_eq_in_sp_zone_security', 'r_eq_in_sp_zone_tenant']
+    input_tables = ['relationship.r_eq2sp']
     output_tables = ['r_sy_in_sp_zone_air_conditioning', 'r_sy_in_sp_zone_clean', 'r_sy_in_sp_zone_domestic_water_supply',
         'r_sy_in_sp_zone_fire', 'r_sy_in_sp_zone_function', 'r_sy_in_sp_zone_general', 'r_sy_in_sp_zone_heating', 'r_sy_in_sp_zone_lighting',
         'r_sy_in_sp_zone_network', 'r_sy_in_sp_zone_power_supply', 'r_sy_in_sp_zone_security', 'r_sy_in_sp_zone_tenant']
+    output_tables = ['relationship.r_sy2sp']
     # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
     with plpy.subtransaction():
         for i in range(len(output_tables)):
-            delete_plan = plpy.prepare("delete from {0} where project_id = $1 and sign = 2".format(output_tables[i]), ["text"])
+            delete_plan = plpy.prepare("delete from {0} where project_id = $1 and sign = 2 and type = 'sy2sp'".format(output_tables[i]), ["text"])
             delete_plan.execute([project_id])
-            join_plan = plpy.prepare("select sy.sys_id, rel.space_id from r_sy_eq sy inner join {0} rel on sy.equip_id = rel.equip_id where rel.project_id = $1 and sy.project_id = $1".format(input_tables[i]), ["text"])
+            join_plan = plpy.prepare("select sy.sys_id, rel.sp_id space_id, zone_type from r_sy_eq sy inner join {0} rel on sy.equip_id = rel.eq_id where rel.project_id = $1 and sy.project_id = $1 and rel.type = 'eq2sp_in'".format(input_tables[i]), ["text"])
             rel = join_plan.execute([project_id])
             sy2sp = dict()
+            zone_type_map = dict()
             for row in rel:
                 sys = row['sys_id']
                 space = row['space_id']
+                space_zone = row['zone_type']
+                zone_type_map[space] = space_zone
                 if sys not in sy2sp:
                     sy2sp[sys] = set()
                 space_set = sy2sp[sys]
                 space_set.add(space)
             for sid, space_set in sy2sp.items():
                 for space in space_set:
-                    plan = plpy.prepare("insert into {0}(sys_id, space_id, project_id, sign) values($1, $2, $3, 2)".format(output_tables[i]), ["text", "text", "text"])
+                    plan = plpy.prepare("insert into {0}(sy_id, sp_id, project_id, type, zone_type, sign) values($1, $2, $3, 'sy2sp', '{1}', 2)".format(output_tables[i], zone_type_map[space]), ["text", "text", "text"])
                     plan.execute([sid, space, project_id])
 except Exception as e:
     plpy.warning(e)
     return False
 else:
     return True
-$$
-LANGUAGE 'plpython3u' VOLATILE;
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
 ```
 
 ## 输入

+ 2 - 0
docs/dev/saga-big/README.md

@@ -0,0 +1,2 @@
+# 建筑信息图
+

+ 1 - 5
docs/dev/saga-graphy/README.md

@@ -1,5 +1 @@
-系统图引擎
-1,绘图引擎
-2,场景管理
-3,楼层平面图
-4,系统图
+# 图形引擎

+ 3 - 0
docs/dev/saga-graphy/feng-map/typeIdMap.md

@@ -0,0 +1,3 @@
+# 地图要素分类编码
+
+

+ 4 - 0
docs/dev/saga-graphy/graphy-engine/clip.md

@@ -0,0 +1,4 @@
+# 裁剪
+::: details 目录
+[[toc]]
+:::

+ 4 - 0
docs/dev/saga-graphy/graphy-engine/custom-engine.md

@@ -0,0 +1,4 @@
+# 自定义引擎
+::: details 目录
+[[toc]]
+:::

+ 26 - 0
docs/dev/saga-graphy/graphy-engine/draw.md

@@ -14,4 +14,30 @@
 :::
 
 ## 折线
+<example-web-graph-DrawPolyline1 /> 
 
+::: details 查看代码
+
+<<< @/docs/.vuepress/components/example/web/graph/DrawPolyline1.vue
+
+:::
+
+## 矩形
+
+<example-web-graph-DrawRect1 /> 
+
+::: details 查看代码
+
+<<< @/docs/.vuepress/components/example/web/graph/DrawRect1.vue
+
+:::
+
+## 圆
+
+
+
+## 椭圆
+
+## 多边形
+
+## 路径

+ 1 - 5
docs/dev/saga-graphy/graphy-engine/gradient.md

@@ -1,11 +1,7 @@
 # 渐变
 
-::: details 点击查看代码
-<<< @/docs/.vuepress/components/ExampleWebGraphyDrawLine.vue
-:::
-
 渐变是一种有规律性的变化;引擎中分为线性渐变和放射性渐变
-41856
+
 渐变实现结构图
 
 ![渐变结构](./img/jianbianjiegou.png)

+ 5 - 0
docs/dev/saga-graphy/graphy-engine/style.md

@@ -0,0 +1,5 @@
+# 颜色与样式
+::: details 目录
+[[toc]]
+:::
+

+ 4 - 0
docs/dev/saga-graphy/graphy-engine/transform.md

@@ -0,0 +1,4 @@
+# 变形
+::: details 目录
+[[toc]]
+:::

+ 10 - 1
docs/dev/saga-graphy/index.js

@@ -4,10 +4,13 @@ const content = [
         path: "/dev/saga-graphy/graphy-engine/",
         children: [
             ["/dev/saga-graphy/graphy-engine/draw", "绘制形状"],
+            ["/dev/saga-graphy/graphy-engine/style", "颜色与样式"],
             ["/dev/saga-graphy/graphy-engine/text", "绘制文字"],
             ["/dev/saga-graphy/graphy-engine/image", "绘制图片"],
             ["/dev/saga-graphy/graphy-engine/gradient", "渐变"],
             ["/dev/saga-graphy/graphy-engine/composite", "融合"],
+            ["/dev/saga-graphy/graphy-engine/transform", "变型"],
+            ["/dev/saga-graphy/graphy-engine/clip", "裁剪"],
             ["/dev/saga-graphy/graphy-engine/arrow", "绘图指令-绘制带有箭头的线段"],
         ]
     },
@@ -15,7 +18,13 @@ const content = [
         title: "场景管理",
         path: "/dev/saga-graphy/scene-manage/",
         children: [
-
+            {
+                title: "图元素实例",
+                path: "/dev/saga-graphy/scene-manage/items/",
+                children: [
+                    ["/dev/saga-graphy/scene-manage/items/clock", "时钟"],
+                ]
+            }
         ]
     },
     {

+ 1 - 0
docs/dev/saga-graphy/scene-manage/items/README.md

@@ -0,0 +1 @@
+Item

+ 10 - 0
docs/dev/saga-graphy/scene-manage/items/clock.md

@@ -0,0 +1,10 @@
+# 时钟实例
+::: details 目录
+[[toc]]
+:::
+
+<example-web-graph-scene-ClockItem />
+
+::: details 查看代码
+<<< @/docs/.vuepress/components/example/web/graph/scene/ClockItem.vue
+:::

+ 1 - 1
package.json

@@ -13,7 +13,7 @@
   },
   "dependencies": {
     "@saga-web/base": "^2.1.9",
-    "@saga-web/draw": "^2.1.80",
+    "@saga-web/draw": "^2.1.82",
     "@saga-web/graphy": "^2.1.52",
     "axios": "^0.18.1",
     "element-ui": "^2.12.0",