第一节:人工模型加载及拾取


人工模型加载

人工模型是指通过人工建模而得到的数据,一般分为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);
    }
}

results matching ""

    No results matching ""