首页 / 浏览问题 / 组件GIS / 问题详情
IObject 开发 无法读取三维信息, 无法获取正确属性
5EXP 2022年09月26日

感谢管理员和技术人员阅读, 在学习IObject的时候又遇到一个难题, 还请有空了指点一下. 我的目标是获取到数据库记录的三维信息, 数据库内只有一条记录为UGGeoModelPro, 里面包含了三维信息和属性.


遇到的问题1, 无法正确获取三维形体, 我尝试了以下的两种方式:
1. UGGeoModelPro读取模型成功后, 能看到外包等信息, 但调用成员函数GetTriMesh返回的数据都是空的. 这个是正常的吗? 三维模型至少也应该有网格面吧?
2. 上述的例子通过调试发现程序填充了ModelNode下的PagePatch容器. 通过模型的GetModelNode获取UGModelNode对象后, 通过UGModelNode::GetDataPatches方法能获取到与数据库记录数对应的UGModelPagedPatch对象, 希望通过UGModelPagedPatch中GetSkeletons方法进一步解读三维信息. 但可惜是, 反馈的GetSkeletons, 只有一个名字, 对应skeleton指针都是空值. 我的理解是PagePatch是用来刻画LOD(细节显示等级)的数据结构, 下属的Skeleton应该能获取到三维信息, 结果又撞墙了.

第二个问题, 无法获取数据库的值
可以获取字段定义, 但通过字段名称返回的Variant都是空的.

以下是写的参考代码:

UGFeature* pUGFeture = pVecDS->GetFeatureEx(i);
if (pUGFeture)
{
    if (pUGFeture->GetGeometry() && pUGFeture->GetGeometry()->GetType() == UGGeometry::GeoModelPro)
    {
        UGGeoModelPro* pModel = (UGGeoModelPro*)pUGFeture->GetGeometry();
        UGModelNode* pNode = pModel->GetModelNode();

        // 读取node下的所有Patch, 从调试的情况来看, 唯一被填充的数据容器.
        auto vctLods = pNode->GetDataPatches();

        // 遍历
        std::for_each(vctLods.begin(), vctLods.end(), [](UGModelPagedPatch* pPatch) {
            
            std::map<UGString, UGModelSkeletonPtr> mapEntity;
            pPatch->GetSkeletons(mapEntity);

            // 遍历每一个skeleton
            std::for_each(mapEntity.begin(), mapEntity.end(), [](auto& valueItem) {
                    if (valueItem.second.IsNull())
                    {
                        wcout << _T("发现空的skeleton: ") << (LPCTSTR)valueItem.first << endl; // Node里的Skeleton都是只有名字, 对应的空指针
                    } 
                });
            });

        wcout << _T("Boundary: ") << pModel->GetBoundingBox() << endl;
        wcout << _T("GetSubCount: ") << pModel->GetSubCount() << endl;

        UGVertexDataPackage* pVertexDataPackage = new UGVertexDataPackage();
        UGArray<UGIndexPackage*> arrIndexPackage;

        pModel->GetTriMesh(pVertexDataPackage, arrIndexPackage); 
        // 这里获取的pVertexDataPackage, arrIndexPackage都是空的, 没数据
        
        delete pVertexDataPackage;
        
        
        // 打印属性
        auto pFields = pUGFeture->GetFieldDefines();
        if (pFields)
        {
            // 遍历字段定义
            for (int i = 0; i < pFields->GetSize(); ++ i)
            {
                UGString sName = (*pFields)[i].m_strName;
                UGVariant var; pUGFeture->GetValue(sName, var);
                
                // 获取的字段对应值都是空的
                wcout << _T("字段: ") << (LPCTSTR)sName << _T(" 值: ") << (LPCTSTR)var.ToString() << endl;
            }
        }
    }
}

2 个回答

你好,请问你用SuperMap C++组件是用于正式的项目开发,还是仅仅只是学习呢?因为目前c++组件不推荐用三维相关功能,很多功能和业务是在上层组件java和.net两款组件中实现的,c++组件很多三维相关的功能不支持,一般三维相关建议使用java和.net两款组件
4,555EXP 名扬四海 2022年09月26日
谢谢回答, 我换.NET试试
您好,请问您具体是想获取什么信息呢?三维模型结构这块如果想要操作或者获取,建议使用java或者.net组件,如果您用的是.net或者java组件的话。

超图这边的模型结构是,模型对象是GeoModel3D,模型对象的几何信息存储在GeoModel3D的model里面。

模型本身是由骨架、材质、纹理构成,典型的骨架结构模型,而不是多边形面结构模型。

骨架由该骨架独立中心坐标系的顶点串构成,模型材质是模型的直接渲染的信息,纹理包括普通图片纹理和特殊的pbr纹理。

模型结构这块的理解,您可以在使用iDesktop桌面端,查看模型对象的属性中几何信息以及三维场景中对具体的模型对象右键编辑模型/材质等,

通过这些应用功能来复制理解模型结构后,来确定您业务上具体是需要什么信息。

希望可以帮助到您。
5,467EXP 登峰造极 2022年09月26日
好的, 谢谢您的回复, 我安装一个IDesktop的客户端学习一下, 开发语言我换成C#再试试.
...