从单元库中插入的复杂元素如图复杂元素的子元素有cellheader,Dimension 等。遍历复杂元素获取cellheader, 再次遍历cellheader获得TextNodeElement,尝试修改TextNodeElement的TextElement的内容并替换。尝试了多种方式都没有成功。以下是我尝试过的代码,麻烦帮忙指正。方法一》ReplaceInModel报错,方法二》Rewrite报错, 方法三》ReplaceCurrentElement报错
app.ActiveSettings.Level = app.ActiveDesignFile.Levels[lvl_Erkundung_DS.Name]; BIM.Point3d scale = app.Point3dOne(); Matrix3d matrix3d = app.Matrix3dIdentity(); BIM.CellElement ds = app.CreateCellElement2("01_DS_mit_Anmerkung", Koordinaten, scale, false, matrix3d); //01_DS_mit_Anmerkung ds.ResetElementEnumeration(); var subEls_ds = ds.GetSubElements(); while (subEls_ds.MoveNext()) { var subEle_ds = subEls_ds.Current; if (subEle_ds.Type == BIM.MsdElementType.CellHeader) { BIM.CellElement cellElCur = subEle_ds as BIM.CellElement; var subEls_cellEle = cellElCur.GetSubElements(); while (subEls_cellEle.MoveNext())//遍历Cellheader子元素 { var subEl_cellEle = subEls_cellEle.Current; //MessageBox.Show(subElCur.Type.ToString()); if (BIM.MsdElementType.TextNode == subEl_cellEle.Type) { BIM.TextNodeElement curTxtNodeEle = subEl_cellEle as BIM.TextNodeElement; Element TxtNodeEle = ConvertToDgnNetEle(curTxtNodeEle); BME.TextNodeElement textNodeElem = TxtNodeEle as BME.TextNodeElement; BIM.ElementEnumerator subEles_TxtNode = curTxtNodeEle.GetSubElements(); //Methode 3: //BIM.TextNodeElement newTextNode = app.CreateTextNodeElement2(curTxtNodeEle, curTxtNodeEle.Origin, curTxtNodeEle.Rotation); //for (int i = 0; i < curTxtNodeEle.TextLinesCount; i++) //{ // MessageBox.Show((curTxtNodeEle.TextLinesCount).ToString()); // newTextNode.AddTextLine(m_pktnr); //} //cellElCur.ReplaceCurrentElement(newTextNode); ////Methode 2: //while (subEles_TxtNode.MoveNext()) //{ // var subEle_TxtNode = subEles_TxtNode.Current; // if (subEle_TxtNode.Type == BIM.MsdElementType.Text) // { // BIM.TextElement oldTextEl = subEle_TxtNode.AsTextElement(); // oldTextEl.Text = m_pktnr; // oldTextEl.Rewrite(); // } //} //Methode 1 while (subEles_TxtNode.MoveNext())//遍历TextNode子元素 { var subEle_TxtNode = subEles_TxtNode.Current; if (BIM.MsdElementType.Text == subEle_TxtNode.Type) { Element oldTxtEle = ConvertToDgnNetEle(subEle_TxtNode); BME.TextElement oldtxtelement = oldTxtEle as BME.TextElement; BME.TextHandlerBase txtHandlerBase = oldtxtelement as BME.TextHandlerBase; BME.TextEdit oldtxtEdit = txtHandlerBase.AsTextEdit(); TextQueryOptions options = new TextQueryOptions(); TextPartIdCollection collId = txtHandlerBase.GetTextPartIds(options); foreach (TextPartId id in collId) { BN.TextBlock oldtxtBlock = txtHandlerBase.GetTextPart(id); //BN.Caret caretStart = oldtxtBlock.CreateStartCaret(); //BN.Caret caretEnd = oldtxtBlock.CreateEndCaret(); oldtxtBlock.AppendText(m_pktnr); BME.TextHandlerBase newtxtHandlerBase = TextHandlerBase.CreateElement(null, oldtxtBlock); BME.TextEdit newtextEdit = newtxtHandlerBase.AsTextEdit(); BME.TextElement newtextElement = newtxtHandlerBase as BME.TextElement; oldtxtEdit.ReplaceTextPart(id, oldtxtBlock); //oldtxtEdit.AddToModel(); oldtxtEdit.ReplaceInModel(newtextElement); } } } } } } } //Methode 3: //ds.Redraw(); //ds.Rewrite();
可否提供一个含有这样元素的DGN文件供我们分析?另外,我正好找到以前用VBA写过的一个例子,恰巧是修改Cell中的TextNode的供您参考。我看您用的C# 也正好是VBA这套Interop接口,方法名称都是能对应上的。
符老师 方法三就是参考的您的这个代码。这是复杂单元 cell.dgn 谢谢
您这个文件是如何上传的?我这边无法下载,我试了其他帖子下的链接都是正常的。