1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > CAD注记层转到SDE Annotation Features(ArcEngine C++实现)(转载)

CAD注记层转到SDE Annotation Features(ArcEngine C++实现)(转载)

时间:2019-10-11 05:13:36

相关推荐

CAD注记层转到SDE Annotation Features(ArcEngine C++实现)(转载)

CAD注记层转到SDE Annotation Features本文会提到两种方式,不过都是要添加一个element,所以,首先给出一个创建element的函数

ITextElementPtr MakeTextElement(CString strText, double x, double y)

{

HRESULT hr;

ITextElementPtr ipTextElement(CLSID_TextElement);

hr = ipTextElement->put_ScaleText(VARIANT_TRUE);

hr = ipTextElement->put_Text(CComBSTR(strText));

IGroupSymbolElementPtr ipGroupSymEle = ipTextElement;

ipGroupSymEle->put_SymbolID(0);

IPointPtr ipPoint(CLSID_Point);

ipPoint->put_X(x);

ipPoint->put_Y(y);

IElementPtr ipElement = ipTextElement;

ipElement->put_Geometry(ipPoint);

return ipTextElement;

}

第一种办法,通过IFDOGraphicsLayer添加Elements的方式实现,实现办法如下

BOOL AddTextElementEx(CString strText, double x, double y)

{

HRESULT hr;

IFeatureWorkspacePtr ipFeatWorkspace = m_ipWorkspace;

if(ipFeatWorkspace == NULL)

return FALSE;

IFeatureClassPtr ipFeatureClass;

hr = ipFeatWorkspace->OpenFeatureClass(CComBSTR(_T("abc")),&ipFeatureClass);

IWorkspaceEditPtr ipWorkspaceEdit = m_ipWorkspace;

if(ipWorkspaceEdit==NULL)

return FALSE;

IDatasetPtr ipDataset(ipFeatureClass);

IFDOGraphicsLayerFactoryPtr ipFDOGLFactory(CLSID_FDOGraphicsLayerFactory);

IWorkspacePtr ipWs;

ipDataset->get_Workspace(&ipWs);

IFeatureWorkspacePtr ipFeatWs(ipWs);

IFeatureDatasetPtr ipFeatDataset;

ipFeatureClass->get_FeatureDataset(&ipFeatDataset);

ILayerPtr ipLayer;

BSTR bstr;

hr = ipDataset->get_Name(&bstr);

hr = ipFDOGLFactory->OpenGraphicsLayer(ipFeatWs,ipFeatDataset,bstr,&ipLayer);

if(FAILED(hr))

return FALSE;IFDOGraphicsLayerPtr ipFDOGLayer(ipLayer);

IElementCollectionPtr ipElementColl;

hr = ipElementColl.CreateInstance(CLSID_ElementCollection);

if(FAILED(hr)||ipElementColl==NULL)

return FALSE;

ITextElementPtr ipTextElement = MakeTextElement(strText,x,y);

hr = ipElementColl->Add((IElementPtr)ipTextElement,-1);

hr = ipFDOGLayer->BeginAddElements();

hr = ipFDOGLayer->DoAddElements(ipElementColl,0);

hr = ipFDOGLayer->EndAddElements();

return TRUE;

}

第二种方式,通过IAnnotationFeature来实现,实现代码如下

BOOL AddTextElement(CString strText, double x, double y)

{

HRESULT hr;

IFeatureWorkspacePtr ipFeatWorkspace = m_ipWorkspace;

if(ipFeatWorkspace == NULL)

return FALSE;

IFeatureClassPtr ipFeatureClass;

hr = ipFeatWorkspace->OpenFeatureClass(CComBSTR(_T("abc")),&ipFeatureClass);

IWorkspaceEditPtr ipWorkspaceEdit = m_ipWorkspace;

if(ipWorkspaceEdit==NULL)

return FALSE;

hr = ipWorkspaceEdit->StartEditing(TRUE);

hr = ipWorkspaceEdit->StartEditOperation();

hr = ipWorkspaceEdit->EnableUndoRedo();

IElementPtr ipElement = MakeTextElement(strText,x , y);

IAnnotationFeaturePtr ipAnnotationFeature = ipFeature;

if(ipAnnotationFeature == NULL)

return FALSE;

hr=ipAnnotationFeature->put_Annotation(ipElement);

ipWorkspaceEdit->DisableUndoRedo();

ipWorkspaceEdit->StopEditOperation();

ipWorkspaceEdit->StopEditing(TRUE);

return TRUE;

}

这两种方法,经过实际测试都可以成功,在导入的时候还需要注意一下空间参考系的问题,需要对应上,特别要注意dwg中的数据是否正确,如果注记的坐标不在参考系范围内,会出现导入失败的现象,我就是因为这个低级的错误,纠结了两天。

参考资料:/iswszheng/archive//03/18/1415496.html

/s/blog_5432e020kzui.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。