第一节:人工模型加载及拾取
人工模型加载
人工模型是指通过人工建模而得到的数据,一般分为Wrml和C3S两种格式。现在我们主要以C3S格式数据为主。
主要包括添加(创建)、定位、显隐和删除4种操作。
下图是人工模型加载效果:
参数说明
人工模型加载可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
LayerOptionsName | 图层配置对象名称 | string | 模型图层需配置为:ModelLayerOptions |
DataSourceTypeName | 数据源类型 | string | 本地数据需配置为c3s,服务数据需配置为c3ss |
Url | 数据访问路径 | string | 数据目录中的0.c3s/0.c3s.zip文件路径 |
Compress | 是否压缩 | bool | 如果数据后缀为.zip则配置为true,否则配为false |
IsHasTexture | 是否有纹理 | bool | 默认为true,该参数在进行分析时起效 |
TextureLevel | 纹理层数 | int | 模型的纹理层数。默认1层 |
PriorityOffset | 结点调度优先级的偏移值 | float | 默认为0.0,在多图层时可改变图层数据的调度优先级 |
VisualMaxRange | 最大显示距离 | double | 模型最大显示距离,如不设或者设为0,将使用数据默认值 |
EnableBlacklist | 是否开启黑名单 | bool | 是否开启黑名单,如果开启,则数据加载失败时会进入黑名单。默认为false |
BlacklistUpdateTime | 黑名单请求间隔时长 | int | 黑名单重新请求间隔时长。以秒为单位,默认600s |
代码调用示例
JavaScript调用
var modelLayer = null;
var bVisible = true;
var strUrl = "E:\\测试数据\\model\\0.c3s.zip"; //本地压缩c3s数据
//创建模型图层
function createModelLayer(){
if(modelLayer == null){
modelLayer = loadModelLayer(strUrl, "true", true);
}else{
alert("请勿重复创建模型图层!");
}
}
//显隐模型图层
function visibleModelLayer(){
if(modelLayer){
modelLayer.SetVisible(bVisible = !bVisible); //设置图层显隐
}else{
alert("无模型图层,无法显隐!");
}
}
//定位模型图层
function locateModelLayer(){
if(modelLayer){
modelLayer.Locate();//图层定位
}else{
alert("无模型图层,无法定位!");
}
}
//删除模型图层
function removeModelLayer(){
if(modelLayer){
map.RemoveLayer(modelLayer); //删除图层
modelLayer = null;
bVisible = true;
}else{
alert("无模型图层,无需移除!");
}
}
//加载模型图层
function loadModelLayer(url, compress, isLocate){
var tlo = map.CreateLayerOptions("modelOpt");//创建图层配置对象,任意名称
tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
if(url.indexOf('http') === -1){//判断url是本地路径还是服务路径,以便调用不同数据源来加载
tlo.AddConfig("DataSourceTypeName", "c3s");//数据源类型,c3s代表本地数据源
}else{
tlo.AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3ss代表服务数据源
}
tlo.AddConfig("Compress", compress);//是否压缩(根据数据后缀设置)
tlo.AddConfig("PriorityOffset","1.0");//结点调度优先级的偏移值
tlo.AddConfig("VisualMaxRange", "5000");//最大显示距离。如不设或者设为0,将使用数据默认值
tlo.AddConfig("IsHasTexture", "true");//是否有纹理,默认为true,该参数在进行分析时起效
tlo.AddConfig("TextureLevel", "1");//模型纹理层数,默认1层。该值在IsHasTexture为true时起效。
tlo.AddConfig("EnableBlacklist","true");//黑名单机制开关,默认false关闭
tlo.AddConfig("BlacklistUpdateTime","60");//黑名单请求间隔时长,以秒s为单位,默认为600s
tlo.AddConfig("Url", url);//数据路径
var modelLayer = map.CreateLayer("ModelLayer", tlo);//创建模型图层,第一项参数为ModelLayer
map.AddLayer(modelLayer);//添加图层
var id = modelLayer.GetLayerID();//该方法可以拿到图层对象的Id
if(isLocate){
modelLayer.Locate();//图层定位
}
return modelLayer;
}
C++调用
BaseObjectCOMLib::ILayerObjectPtr modelLayer;
std::string ModelPath = "E:\\测试数据\\model\\0.c3s.zip"; //本地压缩c3s数据
//创建模型图层
void Cf0c0ModelDlg::OnBnClickedcreatemodellayer()
{
if(modelLayer)//如果模型图层为空
{
return;
}
char temp_status[MAX_PATH];
GetPrivateProfileStringA("Path", "ModelPath", "", temp_status, MAX_PATH, mIniPath.c_str());
std::string ModelPath(temp_status);
modelLayer=loadModelLayer(ModelPath,"true",true);//加载模型图层
}
//显隐模型图层
void Cf0c0ModelDlg::OnBnClickedvisiblemodellayer()
{
if(!modelLayer)//如果模型图层为空
{
return;
}
static bool gmsVisble = true;
modelLayer->SetVisible(gmsVisble = !gmsVisble); //显隐模型数据
}
//定位模型图层
void Cf0c0ModelDlg::OnBnClickedlocatemodellayer()
{
if(!modelLayer)//如果模型图层为空
{
return;
}
modelLayer->Locate(); //模型图层定位
}
//删除模型图层
void Cf0c0ModelDlg::OnBnClickedremovemodellayer()
{
if(!modelLayer) //如果模型图层为空
{
return;
}
map->RemoveLayer(modelLayer); //删除模型数据
modelLayer=NULL;
}
//加载模型图层
BaseObjectCOMLib::ILayerObjectPtr Cf0c0ModelDlg::loadModelLayer(std::string url, std::string compress,BOOL isLocate)
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("modelOpt"); //创建图层配置对象,任意名称
tlo->AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
if(!url.find("http"))//判断是否网络加载
{
tlo->AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3ss代表服务数据源
}
else
{
tlo->AddConfig("DataSourceTypeName", "c3s"); //数据源类型,c3s代表本地数据源
}
tlo->AddConfig("Url", url.c_str()); //数据路径
tlo->AddConfig("PriorityOffset","1.0");//结点调度优先级的偏移值
tlo->AddConfig("VisualMaxRange", "5000");//最大显示距离。如不设或者设为0,将使用数据默认值
tlo->AddConfig("Compress", compress.c_str()); //是否压缩(根据数据实际情况设置)
tlo->AddConfig("IsHasTexture", "true");//是否有纹理,默认为true,该参数在进行分析时起效
tlo->AddConfig("TextureLevel", "1");//模型纹理层数,默认1层。该值在IsHasTexture为true时起效。
tlo->AddConfig("EnableBlacklist","true");//黑名单机制开关,默认false关闭
tlo->AddConfig("BlacklistUpdateTime","60");//黑名单请求间隔时长,以秒s为单位,默认为600s
BaseObjectCOMLib::ILayerObjectPtr modelLayer = (BaseObjectCOMLib::ILayerObjectPtr)map->CreateLayer("ModelLayer", tlo); //创建模型图层,第一项参数必须为ModelLayer
map->AddLayer(modelLayer); //添加模型图层
if(isLocate)//判断是否定位
{
modelLayer->Locate(); //模型图层定位
}
return modelLayer;//返回模型图层
}
C#调用
ILayerObject modelLayer;//模型图层
bool bVisible;//图层显隐控制
string strUrl = "E:\\测试数据\\model\\0.c3s.zip"; //本地压缩c3s数据
//创建模型图层
private void createModelLayer_Click(object sender, EventArgs e)
{
modelLayer = loadModelLayer(strUrl, "true", true);
}
//显隐模型图层
private void visibleModelLayer_Click(object sender, EventArgs e)
{
if (modelLayer!=null)
{
modelLayer.SetVisible(bVisible = !bVisible);//显隐图层
}
}
//定位模型图层
private void locateModelLayer_Click(object sender, EventArgs e)
{
if (modelLayer != null)
{
modelLayer.Locate();//定位图层
}
}
//删除模型图层
private void removeModelLayer_Click(object sender, EventArgs e)
{
if (modelLayer != null)
{
map.RemoveLayer(modelLayer);//删除图层
modelLayer = null;
bVisible = true;
}
}
//加载模型图层
private ILayerObject loadModelLayer(string url, string compress, bool isLocate)
{
ILayerOptions tlo = map.CreateLayerOptions("modelOpt");//创建图层配置对象,任意名称
tlo.AddConfig("LayerOptionsName", "ModelLayerOptions");//图层配置对象名称, ModelLayerOptions代表模型图层配置对象
if(url.IndexOf("http") == -1){//判断url是本地路径还是服务路径,以便调用不同数据源来加载
tlo.AddConfig("DataSourceTypeName", "c3s");//数据源类型,c3s代表本地数据源
}else{
tlo.AddConfig("DataSourceTypeName", "c3ss");//数据源类型,c3ss代表服务数据源
}
tlo.AddConfig("Compress", compress);//是否压缩(根据数据实际情况设置)
tlo.AddConfig("PriorityOffset", "1.0");//结点调度优先级的偏移值
tlo.AddConfig("VisualMaxRange", "5000");//最大显示距离。如不设或者设为0,将使用数据默认值
tlo.AddConfig("IsHasTexture", "true");//是否有纹理,默认为true,该参数在进行分析时起效
tlo.AddConfig("TextureLevel", "1");//模型纹理层数,默认1层。该值在IsHasTexture为true时起效。
tlo.AddConfig("EnableBlacklist", "true");//黑名单机制开关,默认false关闭
tlo.AddConfig("BlacklistUpdateTime", "60");//黑名单请求间隔时长,以秒s为单位,默认为600s
tlo.AddConfig("Url", url);//数据路径
ILayerObject modelLayer = map.CreateLayer("ModelLayer", tlo);//创建模型图层,第一项参数为ModelLayer
map.AddLayer(modelLayer);//添加图层
var id = modelLayer.GetLayerID();//该方法可以拿到图层对象的Id
if(isLocate){
modelLayer.Locate();//图层定位
}
return modelLayer;
}
人工模型拾取
模型拾取是指通过使用模型拾取响应器,在场景中点击模型,使模型变色并获取模型相关信息的操作。
主要包括添加(创建)、更新、删除和获取结果4种操作
注意:模型拾取响应器可以更新,更新时可对所有参数都进行更新。
下图是人工模型拾取效果:
参数说明
模型拾取响应器可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
PickLayerIdList | 图层ID列表 | int列表 | 传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx 此种格式。图层Id可以通过图层对象的GetLayerId()方法获取 |
PickColor | 颜色透明度 | R,G,B,A | 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0",A的取值必须大于0.2 |
IsChangeColor | 是否变色 | bool | 默认值false,设为true,则PickColor 配置的颜色起效 |
IsGetLayerID | 是否获取所在图层ID | bool | 默认值false,设为true,则回调时返回图层ID |
获取结果说明
模型拾取可以通过响应器对象的GetRespnserResult() 方法获取结果。获取的结果值对象参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
PickPointList | 拾取坐标点位 | x,y,z | 鼠标点击位置与模型相交的交点坐标 |
PickName | 模型名称 | string | 拾取到的模型对象的名称,该值是在数据生产时写入的 |
PickLayerList | 图层对象ID | int | 拾取到的模型所在图层ID。通过该ID可以控制整个图层对象 |
Center | 包围球中心点坐标 | x,y,z | 拾取模型的包围球中心点坐标 |
Radius | 包围球半径 | int | 拾取模型的包围球半径 |
代码调用示例
Javascript调用
var pickModelResponser = null;
//创建模型拾取响应器
function createModelPickResponser(){
if(modelLayer == null){
alert("请先创建模型图层再创建模型拾取响应器!");
}
if(pickModelResponser == null){
var resp = map.CreateResponserOptions("model");//创建响应器配置对象,参数任意名称
resp.AddConfig("PickLayerIdList", modelLayer.GetLayerID());//拾取图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp.AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
resp.AddConfig("IsChangeColor", "true");//是否变色
resp.AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
pickModelResponser = map.CreateResponser("PickModelResponser", resp);//创建响应器对象,PickModelResponser代表模型拾取响应器
pickModelResponser.AddObserver(); //添加监听
map.AddResponser(pickModelResponser); //添加响应器对象
}else{
alert("模型拾取响应器已创建,无需重复创建!");
}
}
//更新模型拾取响应器
function updateModelPickResponser(){
if(pickModelResponser){
var resp = map.CreateResponserOptions("model");//创建响应器配置,参数任意名称
resp.AddConfig("PickLayerIdList", "-1");//传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp.AddConfig("PickColor", "1.0,1.0,0.0,0.5");//拾取颜色
resp.AddConfig("IsChangeColor", "true");//是否变色
resp.AddConfig("IsGetLayerID", "false");//是否需要获取节点所在图层ID
pickModelResponser.UpdateResponserOptions(resp);
}else{
alert("模型拾取响应器不存在,无法更新!");
}
}
//删除模型拾取响应器
function removeModelPickResponser(){
if(pickModelResponser){
map.RemoveResponser("PickModelResponser");
pickModelResponser = null;
}else{
alert("模型拾取响应器已移除,无需重复移除!");
}
}
C++调用
BaseObjectCOMLib::IResponserObjectPtr pickModelResponser;//模型拾取响应器对象
//创建模型拾取响应器
void Cf0c0ModelDlg::OnBnClickedcreatemodelpickresponser()
{
if(!pickModelResponser){
ConfigOptionsCOMLib::IResponserOptionPtr resp =(ConfigOptionsCOMLib::IResponserOptionPtr)map->CreateResponserOptions("model");//创建响应器配置,参数任意名称
resp->AddConfig("PickLayerIdList", "-1");//传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp->AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
resp->AddConfig("IsChangeColor", "true");//是否变色
resp->AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
pickModelResponser = map->CreateResponser("PickModelResponser", resp);//创建模型拾取响应器,第一参必须为PickModelResponser字符串
pickModelResponser->AddObserver(); //添加监听
map->AddResponser(pickModelResponser); //添加响应器
}
}
//更新模型拾取响应器
void Cf0c0ModelDlg::OnBnClickedupdatemodelpickresponser()
{
if(pickModelResponser){
ConfigOptionsCOMLib::IResponserOptionPtr resp =(ConfigOptionsCOMLib::IResponserOptionPtr)map->CreateResponserOptions("model");//创建响应器配置,参数任意名称
resp->AddConfig("PickLayerIdList", "-1");//传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp->AddConfig("PickColor", "1.0,1.0,0.0,0.5");//拾取颜色
resp->AddConfig("IsChangeColor", "true");//是否变色
resp->AddConfig("IsGetLayerID", "false");//是否需要获取节点所在图层ID
pickModelResponser->UpdateResponserOptions(resp);//更新拾取响应器
}
}
//删除模型拾取响应器
void Cf0c0ModelDlg::OnBnClickedremovemodelpickresponser()
{
if(!pickModelResponser)
{
return;
}
map->RemoveResponser("PickModelResponser");
pickModelResponser=NULL;
}
//模型拾取回调
void Cf0c0ModelDlg::FireOnResponserNotifyVpsdkctrl1(LPCTSTR respType, long notifyType)
{
if(pickModelResponser)
{
ConfigOptionsCOMLib::IResponserOptionPtr respOpt = pickModelResponser->GetResponserResult();
CString str = respOpt->GetConfigValueByKey("PickPointList");
CString pickName = respOpt->GetConfigValueByKey("PickName");
CString pickLayerId = respOpt->GetConfigValueByKey("PickLayerList");
CString Center = respOpt->GetConfigValueByKey("Center");
CString Radius = respOpt->GetConfigValueByKey("Radius");
MessageBox(L"拾取点:"+ str+ L"\r\n模型名称:"+pickName+L"\r\n图层id: "+pickLayerId + L"\r\n包围球中心点坐标:"+Center+ L"\r\n包围球半径:"+Radius);
}
}
C#调用
IResponserObject pickModelResponser;//模型拾取响应器对象
//创建模型拾取响应器
private void button1_Click(object sender, EventArgs e)
{
IResponserOption resp = (IResponserOption)map.CreateResponserOptions("model");//创建响应器配置对象,参数任意名称
resp.AddConfig("PickLayerIdList", "-1");//拾取图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp.AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
resp.AddConfig("IsChangeColor", "true");//是否变色
resp.AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
pickModelResponser = map.CreateResponser("PickModelResponser", resp);//创建响应器对象,PickModelResponser代表模型拾取响应器
pickModelResponser.AddObserver(); //添加监听
map.AddResponser(pickModelResponser); //添加响应器对象
}
//更新模型拾取响应器
private void updateModelPickResponser_Click(object sender, EventArgs e)
{
if (pickModelResponser == null)
{
return;
}
IResponserOption resp = (IResponserOption)map.CreateResponserOptions("model");//创建响应器配置对象,参数任意名称
resp.AddConfig("PickLayerIdList", "-1");//拾取图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
resp.AddConfig("PickColor", "1.0,1.0,0.0,0.5");//拾取颜色
resp.AddConfig("IsChangeColor", "true");//是否变色
resp.AddConfig("IsGetLayerID", "false");//是否需要获取节点所在图层ID
pickModelResponser.UpdateResponserOptions(resp);//更新响应器对象
}
//删除模型拾取响应器
private void removeModelPickResponser_Click(object sender, EventArgs e)
{
if (pickModelResponser == null)
{
return;
}
map.RemoveResponser("PickModelResponser");//删除响应器对象
pickModelResponser = null;
}
//模型拾取回调
private void axVPSDKCtrl1_FireOnResponserNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnResponserNotifyEvent e)
{
if (pickModelResponser != null)
{
string str = pickModelResponser.GetResponserResult().GetConfigValueByKey("PickPointList");//获取拾取点位
string pickName = pickModelResponser.GetResponserResult().GetConfigValueByKey("PickName");//获取模型名称
string pickLayerId = pickModelResponser.GetResponserResult().GetConfigValueByKey("PickLayerList");//获取拾取图层Id
string Center = pickModelResponser.GetResponserResult().GetConfigValueByKey("Center");
string Radius = pickModelResponser.GetResponserResult().GetConfigValueByKey("Radius");
MessageBox.Show("str:" + str + " pickName:" + pickName + " pickLayerId:" + pickLayerId + "包围球中心点坐标:"+ Center + "包围球半径:" + Radius);
}
}