HT FOR WEB交互部分代码解释

资料拓展:
选中状态
Graph3dView
中被选中的图元会显示为较暗的状态,变暗系数是由图元style
的brightness
和select.brightness
属性决定,select.brightness
属性默认值为0.7
,最终返回值大于1
变亮,小于1
变暗,等于1
或为空则不变化。
Graph3dView#getBrightness
函数控制最终图元亮度,因此也可以通过重载覆盖该函数自定义选中图元亮度,以下为默认逻辑:
getBrightness: function(data){ var brightness = data.s('brightness'), selectBrightness = this.isSelected(data) ? data.s('select.brightness') : null; if(brightness == null){ return selectBrightness; } if(selectBrightness == null){ return brightness; } return brightness * selectBrightness; },

Graph3dView#getWireframe
函数用于定义图元立体线框效果,默认实现代码如下, 由实现代码可知通过控制wf.*
(wf
为wireframe
的简称)相关参数即可实现显示选中线框的效果。
getWireframe: function(data){ var visible = data.s('wf.visible'); if(visible === true || (visible === 'selected' && this.isSelected(data))){ return { color: data.s('wf.color'), width: data.s('wf.width'), short: data.s('wf.short'), mat: data.s('wf.mat') }; }},

wf.visible
:默认为false
代表不显示,可设置为selected
值代表选中时才显示,或true
值代表一直显示线框
wf.color
:线框颜色
wf.short
:默认值为false
代表显示封闭的立体线框,设置为true
则显示不封闭的短线框
wf.width
:线框宽度,默认值为1
,有些系统下只能显示1
的效果,不同系统能显示的最大值也都有限制
wf.mat
:默认值为空,可通过ht.Default.createMatrix
构建转换矩阵

过滤器

选择过滤器
默认情况所有图元都是可选中,用户可通过设置选择过滤器取消部分图元的可选中功能, 可否选中的最终控制在SelectionModel
模型的filterFunc
过滤器上,也可通过重载GraphView
的isSelectable
函数, 或调用GraphView.setSelectableFunc(func)
的封装函数控制,示例代码如下:
graph3dView.setSelectableFunc(function(data){ return data.a('selectable');});

可见过滤器
默认情况图元都是可见,用户可通过设置可见过滤器隐藏部分图元,示例代码如下:
graph3dView.setVisibleFunc(function(data){ return data.s('all.transparent') === true;});

该示例代码逻辑为:只显示all.transparent
为true
的图元。 Graph3dView#isVisible
函数最终决定图元是否可见,因此也可通过直接重载覆盖该函数自定义:
graph3dView.isVisible = function(data){ return data.s('all.transparent') === true;};

移动过滤器
默认情况图元都是可移动,用户可通过设置移动过滤器固定部分图元,示例代码如下:
graph3dView.setMovableFunc(function(data){ return movableItem.selected;});

该示例代码逻辑为:当movableItem
的selected
为true
时图元才允许移动。 Graph3dView#isMovable
函数最终决定图元可否移动,因此也可通过直接重载覆盖该函数自定义:
graph3dView.isMovable = function(data){ return movableItem.selected;};

旋转过滤器
当Graph3dView#setEditable(true)
设置为可编辑的情况下,默认选中图元允许旋转,可通过如下代码禁止部分图元旋转:
graph3dView.setRotationEditableFunc(function(data){ return data instanceof ht.Shape;});

以上代码的逻辑为:只允许ht.Shape
类型的图元可以旋转。 Graph3dView#isRotationEditable
函数最终决定图元可否旋转,因此也可通过直接重载覆盖该函数自定义:
graph3dView.isRotationEditable: function(data){ return data instanceof ht.Shape;},

改变大小过滤器
当Graph3dView#setEditable(true)
设置为可编辑的情况下,默认选中图元允许改变大小,可通过如下代码禁止部分图元旋转:
graph3dView.setSizeEditableFunc(function(data){ return data instanceof ht.Shape;});

以上代码的逻辑为:只允许ht.Shape
类型的图元可以改变大小。 Graph3dView#isSizeEditable
函数最终决定图元可否改变大小,因此也可通过直接重载覆盖该函数自定义:
graph3dView.isSizeEditable: function(data){ return data instanceof ht.Shape;},

除在视图组件上设置过滤器外,GraphView
和Graph3dView
的内置过滤机制也参考了以下style
属性,用户可直接改变以下style
达到对单个图元的控制效果:
2d.visible
:默认值为true
,控制图元在GraphView
上是否可见
2d.selectable
:默认值为true
,控制图元在GraphView
上是否可选中
2d.movable
:默认值为true
,控制图元在GraphView
上是否可移动
2d.editable
:默认值为true
,控制图元在GraphView
上是否可编辑
2d.move.mode
:默认值为空,控制图元移动范围,可设置为如下参数:xy
:可在xy
平面移动
x
:仅沿x
轴移动
y
:仅沿y
轴移动
任何其他非空值代表不可移动

3d.visible
:默认值为true
,控制图元在Graph3dView
上是否可见
3d.selectable
:默认值为true
,控制图元在Graph3dView
上是否可选中
3d.movable
:默认值为true
,控制图元在Graph3dView
上是否可移动
3d.editable
:默认值为true
,控制图元在Graph3dView
上是否可编辑
3d.move.mode
:默认值为空,参见键盘操作,控制图元移动范围,可设置为如下参数:xyz
:可在三维空间移动
xy
:仅在xy
平面移动
xz
:仅在xz
平面移动
yz
:仅在yz
平面移动
x
:仅沿x
轴移动
y
:仅沿y
轴移动
z
:仅沿z
轴移动
任何其他非空值代表不可移动

所有的动作交互:

  toolbar = new ht.widget.Toolbar([                   
                    {//旋转
                        label: 'Rotatable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setRotatable(this.selected);
                        }
                    },
                    {//缩放
                        label: 'Zoomable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setZoomable(this.selected);
                        }
                    },
                    {//平移
                        label: 'Pannable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setPannable(this.selected);
                        }
                    }, 
                    {
                        label: 'Walkable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setWalkable(this.selected);
                        }
                    },  
                    {
                        label: 'Resettable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setResettable(this.selected);
                        }
                    },
                    {
                        label: 'RectSelectable',
                        type: 'check',
                        selected: true,
                        action: function(){
                            g3d.setRectSelectable(this.selected);
                        }
                    },
                    'separator',                    
                    {
                        label: 'Node Movable',
                        type: 'check',
                        selected: true,
                        action: function(){                        
                            g3d.setMovableFunc(this.selected ? null : function(data){
                                return false;
                            });
                        }                
                    },
                    {
                        label: 'Node Rotatable',
                        type: 'check',
                        selected: true,
                        action: function(){                        
                            g3d.setRotationEditableFunc(this.selected ? null : function(data){
                                return false;
                            });
                        }                
                    },  
                    {
                        label: 'Node Scalable',
                        type: 'check',
                        selected: true,
                        action: function(){                        
                            g3d.setSizeEditableFunc(this.selected ? null : function(data){
                                return false;
                            });
                        }                
                    },
                    {
                        label: 'Editable',
                        type: 'check',
                        selected: true,
                        action: function(){                        
                            g3d.setEditable(this.selected);
                        }                
                    },
                    'separator',   
                    {
                        type: 'toggle',
                        selected: false,
                        label: 'First person mode',
                        action: function(){
                            g3d.setFirstPersonMode(this.selected);                              
                        }
                    }                             
                ]);                                                                                
监听动作事件并在页面显示出来


        rows = new ht.List();
                g3d.mi(function(e){   //mi 增加交互事件监听器是addInteractorListener的缩写                 
                    var text = ' ' + e.kind;
                    if(e.part){
                        text += ' on ' + e.part + ' of ' + e.data.s('label');
                    }
                    text += '<br>';
                    rows.add(text);
                    if(rows.size() > 25){
                        rows.removeAt(0);
                    }
                    text = '';
                    rows.each(function(row){
                        text += row;
                    });
                    div.innerHTML = text;
                    
                });                
鼠标经过图元节点时的明暗度的变化

 /*******************鼠标经过时明暗度的变化************************************/
                g3d.getBrightness = function(data){                   
                    if(data.s('isFocused')){
                        return 0.7;
                    }
                    return null;
                };
                lastFocusData = null;
                g3d.getView().addEventListener('mousemove', function(e){
                    var data = g3d.getDataAt(e);
                    if(data !== lastFocusData){
                        if(lastFocusData){
                            lastFocusData.s('isFocused', false);
                        }
                        if(data){
                            data.s('isFocused', true);
                        }
                        lastFocusData = data;
                    }
                }); 
                
  /*******************************************************/  
获取style列表的方法----鼠标经过图元节点时,把图元节点所有的样式以json字符串的形式显示出来

  g3d.getToolTip = function(e){
                    var data = this.getDataAt(e);
                    if(data){
                        return '<pre>' + JSON.stringify(data.getStyleMap(), null, 4) + '</pre>';
                    }
                    return null;
                };    
双击图元节点,图元节点吸附的相关交互
g3d.onDataDoubleClicked = function(data, e, dataInfo) {
                    if(data.face) {
                        //   getHost()获取和设置吸附的图元对象                  
                        //getAttaches()返回目前吸附到该图元的所有对象,返回ht.List链表对象,无吸附对象时返回空
                        data.getHost().getAttaches().each(function(attach) {
                            if(attach.pop) {
                                toggleData(attach);
                            }
                        });
                    }
                    Animation(data, dataInfo.name);
                    
                };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容