悬赏已过期 后悬赏过期
悬赏

从ACAD移植,保存文件后再打开,读取单元格类型是ObjectId的值报’System.NotImplementedException’

邀请:

读取单元格类型是ObjectId的值报’System.NotImplementedException’。

如果是在当前文件中设置后,直接读取,是可以的。但是保存文件后,再打开再读,就会报错。

 

private void SaveDataTableButton_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt.TableName = "CavityAttr";

            dt.AppendColumn(CellType.CharPtr, "cavity");
            dt.AppendColumn(CellType.CharPtr, "x");
            dt.AppendColumn(CellType.CharPtr, "y");
            dt.AppendColumn(CellType.CharPtr, "wdith");
            dt.AppendColumn(CellType.CharPtr, "height");
            dt.AppendColumn(CellType.ObjectId, "id");

            foreach (ListViewItem item in cavityAttrListView.Items)
            {
                DataCellCollection Row = new DataCellCollection();
                DataCell Cavity = new DataCell();
                DataCell X = new DataCell();
                DataCell Y = new DataCell();
                DataCell Wdith = new DataCell();
                DataCell Height = new DataCell();
                DataCell Id = new DataCell();
                Cavity.SetString(item.SubItems[0].Text);
                X.SetString(item.SubItems[1].Text);
                Y.SetString(item.SubItems[2].Text);
                Wdith.SetString(item.SubItems[3].Text);
                Height.SetString(item.SubItems[4].Text);
                ObjectId id = (ObjectId)item.SubItems[0].Tag;
                Id.SetObjectId(id);

                Row.Add(Cavity);
                Row.Add(X);
                Row.Add(Y);
                Row.Add(Wdith);
                Row.Add(Height);
                Row.Add(Id);
                dt.AppendRow(Row, true);
            }

            Document doc = AZcad.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (DocumentLock lockDoc = doc.LockDocument())
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    DBDictionary dict = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary;
                    ObjectId dicId = dict.SetAt("CavityAttr", dt);
                    dict.UpgradeOpen();
                    tr.AddNewlyCreatedDBObject(dt, true);
                    tr.Commit();
                }
                doc.SendStringToExecute("_qsave\n", false, true, true);
                MessageBox.Show("保存成功");
            }
        }        
		
		
	// 从文件读取DataTable
	public static Dictionary<string, string> ReadDataTable(string dwgFile)
        {
	    Dictionary<string, string> cavityAttrInfo = new Dictionary<string, string>();
            using (Database blockDb = new Database(false, true))
            {

                blockDb.ReadDwgFile(dwgFile, System.IO.FileShare.Read, true, null);
                blockDb.CloseInput(true);

                using (Transaction tr = blockDb.TransactionManager.StartTransaction())
                {
                    DBDictionary nod = tr.GetObject(blockDb.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;

                    if (nod.Contains("CavityAttr"))
                    {
                        ObjectId myDataId = nod.GetAt("CavityAttr");
                        DataTable dt = tr.GetObject(myDataId, OpenMode.ForRead) as DataTable;
                        for (int row = 0; row < dt.NumRows; row++)
                        {
                            string cavity = dt.GetCellAt(row, 0).Value.ToString();
                            string x = dt.GetCellAt(row, 1).Value.ToString();
                            string y = dt.GetCellAt(row, 2).Value.ToString();
                            string width = dt.GetCellAt(row, 3).Value.ToString();
                            string height = dt.GetCellAt(row, 4).Value.ToString();
                            ObjectId tid = ObjectId.Null;
                            if (dt.NumColumns > 5)
                            {
                                tid = (ObjectId)dt.GetCellAt(row, 5).Value;
                            }
                            if (tid != ObjectId.Null)
                            {
                                DBObject obj = tr.GetObject(tid, OpenMode.ForRead) as DBObject;
                                if (obj is DBText)
                                {
                                    DBText t = (DBText)obj;
                                    cavity = t.TextString;
                                }
                            }
                            cavityAttrInfo[cavity] = string.Format("{0},{1},{2},{3}", x, y, width, height);
                        }
                    }
                    tr.Commit();
                }
            }
            return cavityAttrInfo;
        }
收藏0
分享
您的回答

回答

默认排序 时间排序
图片审查中...
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
复制链接
微信扫码
已复制到剪贴板