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中的数据是否正确,如果注记的坐标不在参考系范围内,会出现导入失败的现象,我就是因为这个低级的错误,纠结了两天。
参考资料: