感谢管理员和技术人员阅读, 在学习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;
}
}
}
}