admin管理员组文章数量:1574127
1、问题背景
最近接手同事留下的一个加载DWG的问题。测试时发现传入DWG文件路径,打开的时候死活报错。
如图:
2、分析步骤
1)怀疑是ArcEngine未授权,于是添加授权代码进行测试,未能解决。
2)使用AccessWorkspaceFactory打开.mdb文件进行测试,发现可以打开。
3)是不是组件版本的问题呢?修改组件引用方式,修改版本,不能解决。
4)发现CadWorkspaceFactory位于ESRI.ArcGIS.DataSourcesFile命名空间下,于是想起打开FileGDB、Shapefile的方式,即传入的应该是文件夹路径。于是修改测试代码,发现可以解决问题。
3、解决办法
如图:
即:CadWorkspaceFactory打开的的文件路径应当是目标DWG文件所在的文件夹,而在使用FeatureWorkspace对象打开要素类即OpenFeatureClass时,其参数才是具体的“文件名+要素类类型”的形式。
4、一点思考
刚开始时觉得ArcEngine中打开DWG文件的方式很怪异,即明明写着OpenFromFile,其参数不是文件路径,而是文件夹路径,OpenFeatureClass时明明只需要指定FeatureClass的类型是点、线、面或注记,却还要在前面加上文件名,真是十分别扭。
结合平时使用C++进行ArcEngine开发的经历,忽然觉得这样也有其合理之处,理由如下:
1)DataSourcesFile本身就已经告诉我们了,我要加载的文件(这一点与基于C++进行ArcEngine开发的方式是一致的)所在的文件夹,而非PGDB。如加载FileGDB时,其参数虽以.gdb结尾,但本身就是一个文件夹,而不是.mdb文件这样的文件路径。
2)打开不同类型的文件,使用不同的WorkspaceFactory引擎,各个引擎之间的参数是不同的。
HRESULT hr;
IWorkspaceFactoryPtr ipWorkspaceFactory;
if (FissDataTypeFGDB == m_nDataType)
{
hr = ipWorkspaceFactory.CreateInstance(CLSID_FileGDBWorkspaceFactory);
}
else if (FissDataTypePGDB == m_nDataType)
{
hr = ipWorkspaceFactory.CreateInstance(CLSID_AccessWorkspaceFactory);
}
else if (FissDataTypeShape == m_nDataType)
{
hr = ipWorkspaceFactory.CreateInstance(CLSID_ShapefileWorkspaceFactory);
}
if (FAILED(hr) || NULL == ipWorkspaceFactory)
{
return FALSE;
}
3)细心很重要。
版权声明:本文标题:ArcGIS读取DWG文件路径问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727766113a1128492.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论