(iModel.js前端若干功能,开发语言 typescript )
可以动态修改视图的背景色
方法:
示例截图:(默认背景色为白色,现在设置为红色)
关键代码:
//获取当前视图;
let vp = IModelApp.viewManager.selectedView;
const distyle = vp?.displayStyle;
//复制当前视图的样式;
let style = distyle!.clone();
//修改新样式的背景色为红色;
style.backgroundColor = ColorDef.red;
//将新样式设置给当前视图,即可生效;
vp!.displayStyle = style;
可以动态设置当前视图是否显示网格,阴影等;
方法:
示例截图:(显示网格和阴影)
关键代码:
let vp = IModelApp.viewManager.selectedView; const flag = vp!.viewFlags; let f=flag.clone(); f.grid = true;//设置为true显示网格; f.shadows=true;//设置为true显示阴影; vp!.viewFlags=f;
可以动态设置:随着每天时间的更新,阴影会随着太阳光而变化(注意,也会随着季节变化)。
注意:必须在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();
}
示例截图:
可以动态的强调,隐藏等选中的元素;
方法:
关键代码:
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;
}
可以动态设置聚焦于当前所选中的元素集,并以可配置的动画,顶视图,侧视图等方式呈现。
方法:
关键代码:
const vp = IModelApp.viewManager.selectedView!;
const idArray: Id64String[] = ["0x40000000838"];
const prop: ViewChangeOptions & ZoomToOptions = {
animateFrustumChange: true, };
//配置呈现方式以动画形式呈现;
await vp.zoomToElements(idArray, prop);
可以为当前活动视图动态添加装饰。
关键代码:
IModelApp.viewManager.addDecorator(new AccuSnap());
注意:AccuSnap是imodel.js已经实现的精确捕捉的一个装饰功能;
Decorator是可扩展装饰子类的接口,用户可以通过该接口实现包含自定义特性的子类;
class MyDecorator implements Decorator
{
/*扩展代码*/
}
//将实现好的装饰子类对象添加到渲染循环中:
IModelApp.viewManager.addDecorator(new MyDecorator);
可以动态设置在裁剪功能,对视图在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轴的平面进行裁剪)
方法:
获取当前IModelConnection,然后根据该接口通过selectionSet获取当前选中的元素的Id的集合;
关键代码:
const imodel = UiFramework.getIModelConnection();
//elementIdSet存储的是当前选中元素的Id;
const elementIdSet = imodel!.selectionSet;
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 |
|
… |
… |
用户只需要继承合适的工具基类就可以定制自定义工具类,然后进行注册,使用(注意,注册,使用过程与系统工具一样)。常被继承的基类有InteractiveTool和PrimitiveTool。其中,PrimitiveTool类可用于实现创建或修改几何元素的工具。
class MyTool extends PrimitiveTool {
public static toolId = "MyTool";
/***其他代码****/
}
//启动自定义工具;
IModelApp.tools.run(MyTool.toolId);