Bentley Communities
Bentley Communities
  • Site
  • User
  • Site
  • Search
  • User
  • Welcome
  • Products
  • Support
  • About
  • More
  • Cancel
中国BDN社区
  • Welcome to Bentley Communities
  • Bentley's Communities
  • 中国BDN社区
  • Cancel
中国BDN社区
中国BDN社区-威客 iModel.js若干前端功能开发样例
    • Sign In
    • 中国BDN社区-威客
    • -iTwin.js编程
      • iModel.js Front-End简介
      • iModel.js 样例项目配置与运行
      • iModel.js.UI开发基本介绍
      • iModel.js前端统一选择一致性机制
      • iModel.js基本查询
      • iModel.js若干前端功能开发样例
      • imodel图形显示简单介绍
      • iModel文件的合并等操作
      • Redux基本使用
      • simple-viewer-app源码简单分析
      • TypeScript基本介绍及环境配置
      • 下载视口截图
      • 关于imodel测量单位的转换
      • 关于如何导入与导出imodel中schema文件
      • 基于PresentationRules个性化显示iModel的内容
      • 如何在视窗内添加自定义装饰
      • 如何将2个bim中的图形模型显示在一个视图中
      • 用户选择保存感兴趣的视图
    • +MicroStation CONNECT版SDK的新变化
    • +MicroStation编程技巧
    • +OpenRoads中国版平台开发指南
    • +ORD SDK二次开发编程
    • +一步步学习ABD-CE开发
    • +一步步学习MicroStation CE Addin开发
    • 一步步学习MicroStation CE MDL开发
    • +一步步学习ProjectWise编程
    • 中国优先社区二次开发精华帖汇总
    • +学习Microstation交互式工具开发
    • +过期帖,留存仅供参考
    • +非Bentley社区分享的文章
    • C#、C/C++相关的编程知识汇总

     
     Questions about this article, topic, or product? Click here. 

    iModel.js若干前端功能开发样例

    (iModel.js前端若干功能,开发语言 typescript )

    一、视图功能

    1)   修改视图样式

    修改视图背景

    可以动态修改视图的背景色

    方法:

    1. 获取当前视图;
    2. 复制一个当前视图的样式(displayStyle);
    3. 修改新复制的样式,并将其设置给当前视图;

    示例截图:(默认背景色为白色,现在设置为红色)

    关键代码:

    //获取当前视图;  

    let vp = IModelApp.viewManager.selectedView;

      const distyle = vp?.displayStyle;

    //复制当前视图的样式;

      let style = distyle!.clone();

    //修改新样式的背景色为红色;

      style.backgroundColor = ColorDef.red;

    //将新样式设置给当前视图,即可生效;

      vp!.displayStyle = style;                        

    2)   显示网格,阴影等

    可以动态设置当前视图是否显示网格,阴影等;

    方法:

    1. 获取当前视图;
    2. 复制一个当前视图的ViewFlags;
    3. 修改新复制的ViewFlags,并将其设置给当前视图;

    示例截图:(显示网格和阴影)

    关键代码:

    let vp = IModelApp.viewManager.selectedView;
    
    const flag = vp!.viewFlags;
    
    let f=flag.clone();
    
    f.grid = true;//设置为true显示网格;
    
    f.shadows=true;//设置为true显示阴影;
    
    vp!.viewFlags=f;
     

    3)  根据太阳光时间设置阴影

    可以动态设置:随着每天时间的更新,阴影会随着太阳光而变化(注意,也会随着季节变化)。

    注意:必须在viewFlags.shadows设置为true的情况下,才会出现如下截图效果。

    关键代码:

    public static updateSunTime(time:number){
    
    const vp = IModelApp.viewManager.selectedView;
    
    if (vp && vp.view.is3d()){
    
    const displayStyle=vp.view.getDisplayStyle3d();
    
    displayStyle.setSunTime(time);
    
    vp.displayStyle=displayStyle;
    
    vp.synchWithView();
    
    }
    
    
     

    示例截图:

    4)   设置视图中元素外观

    基本使用

    可以动态的强调,隐藏等选中的元素;

    方法:

    1. 获取当前视图;
    2. 从强调处理处理程序注册或创建一个新的视口;
    3. 执行处理程序;

    关键代码:

      const vp = IModelApp.viewManager.selectedView;

    //创建或者注册视口;

      const emph = EmphasizeElements.getOrCreate(vp);

        //执行处理应用程序,即可生效; 

      emph.hideSelectedElements(vp);

    扩展

    用户可以根据需要扩展自己的特性基类来渲染强调元素。

    关键代码:

    class MyProvider implements FeatureOverrideProvide{
    
    public id:string="MyProvider";
    
    public addFeatureOverrides(
    
    ovrs: FeatureSymbology.Overrides,
    
    vp:Viewport
    
    ):void{
    
    /*扩展代码*/
    
    }}
    
    
    
    然后添加定义的特性类对象:
    
    const vp =IModelApp.viewManager.selectedView;
    
    vp?.addFeatureOverrideProvider(new MyProvider());
    
    可以一下方式查询当前视图是否包含该特性类对象:
    
    let provider=vp!.findFeatureOverrideProviderOfType <MyProvider>(MyProvider);
    
    if(undefined==provider){
    
    //没有包含MyProvider;
    
    }else{
    
    //已经包含MyProvider;
    
    }
     

    5)   聚焦当前选中元素

    可以动态设置聚焦于当前所选中的元素集,并以可配置的动画,顶视图,侧视图等方式呈现。

    方法:

    1. 获取当前视图;
    2. 选择需要聚焦的元素集,并配置呈现方式;
    3. 当前视图触发聚焦;

    关键代码:

      const vp = IModelApp.viewManager.selectedView!;

      const idArray: Id64String[] = ["0x40000000838"];

      const prop: ViewChangeOptions & ZoomToOptions = {

    animateFrustumChange: true, };

    //配置呈现方式以动画形式呈现;

      await vp.zoomToElements(idArray, prop);

     

    6)  为视图添加装饰(Decorator)

    基本使用

    可以为当前活动视图动态添加装饰。

    关键代码:

    IModelApp.viewManager.addDecorator(new AccuSnap());

    注意:AccuSnap是imodel.js已经实现的精确捕捉的一个装饰功能;

    扩展

    Decorator是可扩展装饰子类的接口,用户可以通过该接口实现包含自定义特性的子类;

    class MyDecorator implements Decorator 

    {

    /*扩展代码*/

    }

    //将实现好的装饰子类对象添加到渲染循环中:

    IModelApp.viewManager.addDecorator(new MyDecorator);

     

    7)  裁剪视图

    基本使用

    可以动态设置在裁剪功能,对视图在X,Y,Z方向上分别进行裁剪。

    关键代码:

    async function TestClip(){
    
    const vp = IModelApp.viewManager.selectedView;
    
    IModelApp.tools.run(ViewClipClearTool.toolId);
    
    ViewClipDecorationProvider.create().toggleDecoration(vp!);
    
    if(!vp.view.getViewClip())addExtentsClipRange(vp);}
    
    const addExtentsClipRange =(vp:ScreenViewport)=>{
    
    const range=vp.view.computeFitRange();
    
    range.high.z=(range.high.z+range.low.z)/2.0;
    
    const block:ClipShape=ClipShape.createBlock(
    
    range,
    
    range.isAlmostZeroZ
    
    ?ClipMaskXYZRangePlanes.XAndY
    
    :ClipMaskXYZRangePlanes.All,
    
    false,
    
    false
    
    );
    
    const clip:ClipVector=ClipVector.createEmpty();
    
    clip.appendReference(block);
    
    vp.view.setViewClip(clip);
    
    vp.setupFromView();
    
    const vcdp:ViewClipDecorationProvider=ViewClipDecorationProvider.create();
    
    vcdp.clearDecorationOnDeselect=false;
    
    vcdp.showDecoration(vp);
    
    IModelApp.toolAdmin.startDefaultTool();};
     

     

    示例截图:

    扩展使用

    可以指定选项是分别以垂直于X,Y,Z轴之一的平面进行裁剪。

    如下所示:(以垂直于Y轴的平面进行裁剪)

    二、元素操作

    8) 获取当前选中的元素

    方法:

    获取当前IModelConnection,然后根据该接口通过selectionSet获取当前选中的元素的Id的集合;

    关键代码:

      const imodel = UiFramework.getIModelConnection();

      //elementIdSet存储的是当前选中元素的Id;

      const elementIdSet = imodel!.selectionSet;

     

    三、 工具

    9)     系统工具

    iModel.js前端包含大量的系统工具,例如FitViewTool等,这些系统工具类均继承自Tool,每个工具类均包含一个标识符toolId,该toolId必须保持唯一。例如FitViewTool类的toolId是”View.Fit”。一般在程序初始化的时候,需要预先注册这些工具,然后可以根据需要使用。

    例如,启动Fit工具,代码如下所示:

    IModelApp.tools.run(FitViewTool.toolId);

    常用的系统工具类:

    类名

    toolId

    FitViewTool

    View.Fit

    ViewGlobeSatelliteTool

    View.GlobeSatellite

    ViewGlobeLocationTool

    View.GlobeLocation

    WindowAreaTool

    View.WindowArea

    ViewUndoTool

    View.Undo

    ViewRedoTool

    View.Redo

    …

    …

     

    10) 自定义工具

    用户只需要继承合适的工具基类就可以定制自定义工具类,然后进行注册,使用(注意,注册,使用过程与系统工具一样)。常被继承的基类有InteractiveTool和PrimitiveTool。其中,PrimitiveTool类可用于实现创建或修改几何元素的工具。

    class MyTool extends PrimitiveTool {

      public static toolId = "MyTool";

    /***其他代码****/

    }

     

    //启动自定义工具;

    IModelApp.tools.run(MyTool.toolId);

    • Share
    • History
    • More
    • Cancel
    • Devin Liu Created by Devin Liu
    • When: Mon, Aug 17 2020 12:14 AM
    • Devin Liu Last revision by Devin Liu
    • When: Mon, Aug 17 2020 2:32 AM
    • Revisions: 5
    • Comments: 0
    Recommended
    Related
    Communities
    • Home
    • Getting Started
    • Community Central
    • Products
    • Support
    • Secure File Upload
    • Feedback
    Support and Services
    • Home
    • Product Support
    • Downloads
    • Subscription Services Portal
    Training and Learning
    • Home
    • About Bentley Institute
    • My Learning History
    • Reference Books
    Social Media
    •    LinkedIn
    •    Facebook
    •    Twitter
    •    YouTube
    •    RSS Feed
    •    Email

    © 2023 Bentley Systems, Incorporated  |  Contact Us  |  Privacy |  Terms of Use  |  Cookies