前两天项目开发中,忽然一个Imagelabel的参数不会调了,但是前段时间可是很熟悉的。好吧,好记性不如烂笔头!
1. 模型弹出窗调试
这里的模型弹出框指涉及到模型操作的,比如监听模型选定事件、根据窗口数据定位模型等,或者说是需要关联模型对象的窗口。
<object id="sgworld" classid="clsid:3a4f9199-65a8-11d5-85c1-0001023952c1" style="visibility: hidden; height: 0"></object>
由于使用Te插件API弹出的窗口,无法直接通过浏览器F12进行调试,因此我们通常使用下面两种方式。
- 浏览器 + Te Pro
桌面Te打开对应的模型FLY文件,浏览器直接访问弹出窗口,这样弹出窗口直接获取到桌面Te的模型对象,就可以实现通过浏览器F12窗口对弹出窗口的调试。
- 浏览器 + Visual Studio
另外一种方式,在Javascript代码中添加debugger预设断点。执行到断点处,程序提示选用Visual Studio进行弹出窗口内代码调试。
==缓存清理:Te插件中的弹出窗口,如果发现普通的清理缓存方法无效时,需要清理浏览器缓存文件==
3. FLY更新
如果同名FLY更新发布的服务器后,发现加载的还是以前的FLY文件,同样需要使用上面提到的缓存清理办法。不管是桌面TE打开FLY还是浏览器页面加载FLY,上面的缓存清理办法同样有效。
4. ImageLabel缩放比例
ImageLabel标签可以通过设置Scale控制图片显示比例,达到最好的显示效果,避免出现很远就看到标签或者很近时标签很大的情况。
5. 透明窗体
通过TE插件的弹出窗口APIWindow.ShowPopup
无法直接弹出具有透明背景的弹出框:
- TE插件的弹出窗口API
Window.ShowPopup
弹出普通HTML窗口:无法实现,IPopupMessage701
无接口支持 - 在Te插件
<object>
所在html页面,增加iframe,普通div
会被插件遮盖。这种方式虽然可以在模型上方覆盖html窗口,但是无法设置背景透明。网上提供的
Iframe设置allowtransparency="true"
src链接页面body设置background="transparent"
均无效。
<div id="tool" style="width: 100%; background-color: transparent;">
<iframe id="toolbar" name="toolbar"
style="position: absolute; visibility: inherit; top: 0px; left: 6px; height: 30px; width: 100%; z-Index: 9999;background-color:transparent;"
allowtransparency="true"
src="toolbartest.html"></iframe>
</div>
<object id="TerraExplorer3DWindowEx" classid="CLSID:3a4f9196-65a8-11d5-85c1-0001023952c1"
style="position:absolute;left: 0px; top: 0px; right: 0px; bottom: 0px;width:100%;height:100%"></object>
- 透明窗体插件
使用泰瑞提供的另外一个网页透明窗体插件可以实现透明窗体。
6. Feature渲染
Feature渲染是经常用到的一个操作,比如鼠标悬浮、选定等事件,一般都是通过修改Feature颜色实现。但是Feature的获取依赖于FLY中添加图层,分为3dml和shp,不同图层feature获取方法如下:
function getFeature(sgworld, layerId, featureId) {
try {
var layer = sgworld.ProjectTree.GetObject(layerId);
var feature = null;
//shp图层
if (layer.ObjectType === 36) {
feature = layer.FeatureGroups.Item(0).ExecuteGetDataSourceFeatureIdQuery(featureId);
}
//3dml mesh feature图层
else if (layer.ObjectType === 39) {
feature = layer.ExecuteGetDataSourceFeatureIdQuery(featureId);
}
//3dml mesh 图层
else if (layer.ObjectType === 38) {
feature = layer.FeatureLayers.Item(0).ExecuteGetDataSourceFeatureIdQuery(featureId);
}
return feature;
} catch (e) {
return null;
}
}
7. 视频插件不兼容
海康视频可以通过单窗口url功能,通过模型的接口IWindow701.ShowPopup
直接弹出视频画面。但是由于Te6.6插件是32位版本,Te7.0.1只支持64位。因此可以在Te6.6版本正常使用,Te7.0.1无法正常弹出。
无法直接接入,需要使用EasyDarwin等视频服务器进行转发,然后通过JS插件进行播放。项目中使用过ckplayerJS插件,存在的问题是支持H.264视频格式,不支持H.265视频格式。
最后还使用过EasyDarwin+VLC插件的方案,但是VLC插件易卡死的问题也没有解决。
目前方案:Te7.0.1 + 海康单窗口URL + 弹出浏览器Tab页
8. TePro操作分类
其实不管在二维地图中还是三维模型中,我们抛开业务后,操作逻辑也就那么几种。所以,我们刚做三维时,使用的基础平台不成熟,有很多厂家来推销平台。我们在选择平台的标准,平台是否支持三种基本的操作逻辑:
;根据数据查模型,要求平台提供根据标识信息查询、操作对应模型对象的能力;空间查询,平台支持根据空间点位信息查询区域内设备。这是我们在三维平台中要求支持三种基本操作。
- 根据模型查数据
要求平台能够支持单个模型对象的选择,并能够在事件响应中获取模型对象的ID等标识信息。当然这里的对象ID最好是建模人员建模时生成的,这样可以保证关联信息的稳定性。如果使用平台自动生成的ID,则每次更新发布模型,ID都会发生变化,关联信息的维护将会耗费很大精力。
- 根据数据查模型
要求平台提供API支持根据模型的标识ID等信息,进行模型的操作,比如显示隐藏和修改色彩、大小、位置等,这样便于实现二三维联动功能、数据驱动模型渲染的功能。
- 区域查询
区域查询,在二维地图中我们是画一个面查询面内的兴趣点,在空间中我们可以根据业务需要,画一个面查询投影到该面内的模型对象,或者画一个立体图形查询根据该空间相关的模型对象。
9. ObjectID,LayerID,FeatureID,BimID,GroupPath
- ObjectID:图层添加到FLY文件时,自动生成的模型对象ID,每次重新添加图层都会发生变化,Te插件接口
ITerraExplorerObject701.ID
。 - LayerID:图层添加到FLY文件时,自动生成的图层对象ID,每次重新添加图层都会发生变化,Te插件接口
IFeatureLayer701.ID
或I3DMLFeatureLayer701.ID
。 - FeatureID:建模人员导出模型时,自动生成的模型对象序号(0-n),同一模型文件内唯一,建模软件中增加、删除模型后导出时会发生变化,非增删类修改或者重新导出不会发生变化,Te插件接口
IFeature701.DataSourceFeatureID
。 - BimID:建模人员建模时,自动生成的模型对象唯一标识,后续修改、导出不会发生变化,Te插件无直接对应的接口,一般可以通过
IFeature701.FeatureAttributes.GetFeatureAttribute("FileName").Value
,其中包含BimID。