DgnDocument doc = DgnDocument.CreateForLocalFile(FullFileName.Text); DgnFile dgnFile= DgnFile.Create(doc, DgnFileOpenMode.PreferableReadWrite).DgnFile; StatusInt si = StatusInt.Success; DgnFileStatus status=dgnFile.LoadDgnFile(out si); if (status == DgnFileStatus.Success) { dgnModels = dgnFile.GetAllLoadedModels(); foreach (DgnModel dgnModel in dgnModels) { ModelNames.Items.Add(dgnModel.ModelName); } } //上述代码中用到的自定义方法 public static List<DgnModel> GetAllLoadedModels(this DgnFile dgnFile) { List<DgnModel> models = new List<DgnModel>(); IEnumerator<DgnModel> modelEnumerator = dgnFile.GetLoadedModelsCollection().GetEnumerator(); while(modelEnumerator.MoveNext()) { models.Add(modelEnumerator.Current); } return models; }
dgnFile.GetAllLoadedModels仅能得到DGN文件中被装载的模型,那些从未被打开过的模型是不能获得的。请改用GetModelIndexCollection获得DGN文件中所有的模型索引,再根据这个索引得到模型名。
这样做的目的是为了节省内存,文件打开时仅仅装载上次最后打开时的那个模型(Save Settings能保存住这个设置,否则的话,会默认打开DGN文件中的Default模型),其他的模型都不装载。
请测试一下如下代码:
foreach (ModelIndex mi in dgnFile.GetModelIndexCollection()) MessageBox.Show(mi.Name);
符老师,我注意到了只能获取已经装载的模型,因此,我有一行loaddgnfile的命令。我没有表述完全我的需求,我想列出外部文件model名称,然后遍历model中的元素。有没有办法打开文件,然后装载所有模型,根据getallloadedmodel来获取所有模型呢。
在我上面代码的基础上,在foreach循环中对于每个mi调用dgnFile.LoadModelById来装载这些未被装入内存中的模型。LoadDgnFile也仅仅是将Dgn文件装入内存,前面讲过,它仅会装载上次默认打开的最后一个模型,其他模型不会装载。
Answer Verified By: cao li