当前位置: 首页 > news >正文

iTwin Tools函数拆解

写一个工具大部分是extend PrimitiveTool

一个Tool中主要的函数

isCompatibleViewport

是否是合适的ViewPort,如是否是二维View,或者三维View才执行Tool

public isCompatibleViewport(vp: Viewport | undefined,isSelectedViewChange: boolean): boolean {return (super.isCompatibleViewport(vp, isSelectedViewChange) &&undefined !== vp &&vp.view.isSpatialView());}

requireWriteableTarget

是否需要写iModel

 public requireWriteableTarget(): boolean {return false;
}

onPostInstall & setupAndPromptForNextAction

工具启动后执行的逻辑,如打开精确捕捉等,示例如下

 public override async onPostInstall() {await super.onPostInstall();this.setupAndPromptForNextAction();}protected setupAndPromptForNextAction(): void {IModelApp.accuSnap.enableSnap(this.wantAccuSnap);this.provideToolAssistance();}

鼠标动作

onMouseMotion

鼠标运动时

下面示例代码表示如果选中元素或者在包围盒内,则鼠标跟随变成十字,其余为默认圆圈

public async onMouseMotion(_ev: BeButtonEvent): Promise<void> {if (undefined === _ev.viewport || this.allowOutsideProjectExtents)  return; // Shouldn't really happenconst hit = await IModelApp.locateManager.doLocate(new LocateResponse(), true, _ev.point, _ev.viewport, _ev.inputSource);this._hit = hit; // Save the hit object for later use.if (hit?.isElementHit) {IModelApp.toolAdmin.setCursor("crosshair");} else {if (_ev.viewport.iModel.projectExtents.containsPoint(_ev.point)) {IModelApp.toolAdmin.setCursor("crosshair");} else {IModelApp.toolAdmin.setCursor("default");}}}
onDataButtonDown

鼠标左键

可以用于触发绘制,插入Marker,计算等等,如:

  public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {this.points.push(ev.point.clone());this.setupAndPromptForNextAction();if (!this.isDynamicsStarted)this.beginDynamics();return EventHandled.No;}
onResetButtonUp

鼠标右键

一般用于退出工具,如:

public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {if (undefined === this._origin)await this.exitTool(); // exit to select tool if we haven't gotten first point...elseawait this.onReinitialize(); // Calls onRestartTool...return EventHandled.No;}

getToolPromotionMessage

提示信息,iTwin UI的框架下,如:

public getToolPromotionMessage() {const promptMainInstruction = "这是一个提示";const promptLeftClickTap = "鼠标左键提示";const promptRightClickTap = "鼠标右键提示";const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, promptMainInstruction);const mouseInstructions = [];const touchInstructions = [];mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, promptLeftClickTap, false, ToolAssistanceInputMethod.Mouse));mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, promptRightClickTap, false, ToolAssistanceInputMethod.Mouse));touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, promptLeftClickTap, false, ToolAssistanceInputMethod.Touch));const sections = [ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel),ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel),];const instructions = ToolAssistance.createInstructions(mainInstruction, sections);IModelApp.notifications.setToolAssistance(instructions);} // This is the message that appears in the status bar when the tool is active

accuSnap

打开精确捕捉

IModelApp.accuSnap.enableSnap(true);

允许捕捉到元素

IModelApp.accuSnap.enableLocate(true);

ToolAdmin

    IModelApp.toolAdmin.setCursor("crosshair"); // 设置鼠标为跟随为十字 undefined为去掉鼠标跟随,wait为转圈等待,default为圆圈IModelApp.toolAdmin.setLocateCircleOn(false); // 不显示鼠标跟随的圆圈await IModelApp.toolAdmin.doUndoOperation(); // undoawait IModelApp.toolAdmin.doRedoOperation(); // redo

相关文章:

  • Hiera:一款简洁的层次化视觉transformer
  • 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
  • 楼宇自控怎样推动能源高效利用与建筑设备的科学管理
  • 【python】 循环语句(while)
  • 【Linux网络】应用层自定义协议与序列化
  • 10天学会嵌入式技术之51单片机-day-3
  • 文件的物理结构和逻辑结构的区分
  • 编译原理实验(四)———— LR(1)分析法
  • 《小型支付商城系统》学习记录
  • 【matlab】地图上的小图
  • 解决方案:远程shell连不上Ubuntu服务器
  • 阿里云人工智能大模型MCP协议
  • 薪技术|0到1学会性能测试第19课-参数化技术之导入数据
  • 正计数为倒计数(STC89C52单片机)
  • 实践项目开发-hbmV4V20250407-React+Taro多端项目依赖冲突解决方案
  • ESP8266_ESP32 Smartconfig一键配网功能
  • python全栈-flask
  • 【CUDA 】第5章 共享内存和常量内存——5.2 共享内存的数据分布(2)
  • 七、小白如何用Pygame制作一款跑酷类游戏(碰撞检测)
  • Python第二周作业
  • 抢抓消费旺季:五一假期,多地党政主官调研外贸优品展销活动
  • 阿根廷发生5.6级地震,震源深度30公里
  • 巴菲特股东大会前瞻:执掌伯克希尔60年,巨轮将驶向何方
  • 五一当天1372对新人在沪喜结连理,涉外婚姻登记全市铺开
  • 车展之战:国产狂飙、外资反扑、智驾变辅助
  • 证监会:坚决拥护党中央对王建军进行纪律审查和监察调查的决定