乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 188|回复: 9

先谢谢大家,开发插件遇到的几个小问题,希望大神帮忙解决,谢谢!

[复制链接]

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-14 22:21:00 | 显示全部楼层 |阅读模式
1.加载了自己的程序,出现界面,打开DWG文件,随意点击DWG里的块参照。但是,怎么才能让和点击块参照有联系。。可能我解释的不清楚,上个图希望大家帮忙。 就是希望实现 选取了块参照 就show出面板上的panel
2.这段代码希望大家帮忙看看,我实在是解决不了了。就是希望添加块,添加信息,然后这些信息可以增删改。我用的datatable存储信息,不知道可不可以实现。。另外此代码只能运行成功一下,第二次就有对象错误问题(也就不能连续添加块记录),实在不会解决.代码如下,谢谢大家!万分感谢!
      [CommandMethod("atat")]  //输入此命令可运行
        public void atat()
        {
            Writedata("男","25");
        }
        [CommandMethod("AddAttributeBlock")]                           
        public void AddAttributeBlock(String cbf,string dkbh)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            ObjectId id;
            BlockTableRecord btr = new BlockTableRecord();
               Point3d pt = Pick1("\n指定位置");
               //String cbf = GetString("\n承包方");
               //String dkbh = GetString("地块编号");
            Line li = new Line(pt,new Point3d(0,0,0));//new Point3d(30, 30, 0)
           // Line li = new Line();
           // PromptEntityResult ent;
          //  DBText txt = DBText(pt, str, 5);
            AttributeDefinition ad1 = AttributeDefinition("Length", "L", cbf, new Point3d(pt.X + 3, pt.Y + 3, 0));
            AttributeDefinition ad2 = AttributeDefinition("Length", "L", dkbh, new Point3d(pt.X - 3, pt.Y - 3, 0));
            btr.Name = "LineBlock";
            btr.AppendEntity(li);
            btr.AppendEntity(ad1);
            btr.AppendEntity(ad2);
           // Writedata(str1,str2);
            id =AddToBlockTable(btr);
            ToModelSpace(id, pt, db);
        }
        //创建属性
        public static AttributeDefinition AttributeDefinition(string label, string prompt, string value, Point3d pt)
        {
            AttributeDefinition ad = new AttributeDefinition();
            ad.Constant = false;
            ad.Tag = label;
            ad.Prompt = prompt;
            ad.TextString = value;
            ad.Position = pt;
            return ad;
        }
        //将指定的块定义变成块参照添加到指定的模型空间
        public static ObjectId ToModelSpace(ObjectId blkid, Point3d pt, Database db)
        {
            ObjectId blkrfid = new ObjectId();
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord modelspace = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                BlockTableRecord block = trans.GetObject(blkid, OpenMode.ForRead) as BlockTableRecord;
                BlockReference br = new BlockReference(pt, blkid);//通过块定义 添加块参照
                blkrfid = modelspace.AppendEntity(br);//把块参照添加到块表记录
                trans.AddNewlyCreatedDBObject(br, true);                foreach (ObjectId id in block)
                {
                if (id.ObjectClass.Equals(RXClass.GetClass(typeof(AttributeDefinition))))     
                {
                  AttributeDefinition ad = trans.GetObject(id, OpenMode.ForRead) as AttributeDefinition;
                 AttributeReference ar = new AttributeReference(ad.Position, ad.TextString, ad.Tag, new ObjectId());
                 br.AttributeCollection.AppendAttribute(ar);
                }
               }
                trans.Commit();
            }
            return blkrfid;
        }
        //将块表记录加入到块表中
        public static ObjectId AddToBlockTable(BlockTableRecord Record)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            ObjectId id = new ObjectId();
            using (Transaction transaction = db.TransactionManager.StartTransaction())
            {
                BlockTable table = transaction.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                //BlockTableRecord btr = transaction.GetObject(table.);
                if (table.Has("LineBlock"))
                {
                   id = table["LineBlock"];
                   return id;
                  /* BlockTableRecord btr = new BlockTableRecord();//这几行可以继续添加块参照,但是快参照是空白。什么都没有
                   btr.Name = "aaa";
                   id = table.Add(btr);
                    transaction.AddNewlyCreatedDBObject(btr,true);
                    transaction.Commit();
                    return id;*/
                }
                id = table.Add(Record);
                transaction.AddNewlyCreatedDBObject(Record, true);
                transaction.Commit();
            }
            return id;
        }
        [CommandMethod("WriteData")]//写入数据
        public void Writedata(String fbfbmstr, String cbfbmstr)
        {
            Autodesk..DatabaseServices.DataTable dt = new Autodesk.AutoCAD.DatabaseServices.DataTable();
            dt.TableName = "ParameterTable";
            dt.AppendColumn(CellType.CharPtr, "姓名");
            dt.AppendColumn(CellType.CharPtr, "地址");
            dt.AppendColumn(CellType.CharPtr, "性别");
            dt.AppendColumn(CellType.CharPtr, "年龄");
            DataCellCollection Row = new DataCellCollection();
            DataCell cbf = new DataCell();
            DataCell dkbh = new DataCell();
            DataCell fbfbm = new DataCell();
            DataCell cbfbm = new DataCell();
            string xm = GetString("\n姓名");
            string dz = GetString("\n地址");
            AddAttributeBlock(xm, dz);
            cbf.SetString(xm);
            dkbh.SetString(dz);
            fbfbm.SetString(fbfbmstr);                              
            cbfbm.SetString(cbfbmstr);
          //  Parameter.SetString(GetString("\n输入尺寸"));
            Row.Add(cbf);
            Row.Add(dkbh);
            Row.Add(fbfbm);
            Row.Add(cbfbm);
           // Row.Add(Parameter);
            dt.AppendRow(Row, true);
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            PromptEntityResult ent = ed.GetEntity("\n选择要写数据的对象");
            if (ent.Status == PromptStatus.OK)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    Entity entity = tr.GetObject(ent.ObjectId, OpenMode.ForWrite, true) as Entity;
                    if (entity.ExtensionDictionary == new ObjectId())
                        entity.CreateExtensionDictionary();
                    DBDictionary extensionDic = tr.GetObject(entity.ExtensionDictionary, OpenMode.ForWrite, false) as DBDictionary;
                    extensionDic.SetAt("ParameterTable", dt);
                    tr.AddNewlyCreatedDBObject(dt, true);
                    tr.Commit();
                }
            }
        }
        [CommandMethod("ReadData")]  //读取数据
        public void ReadData()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            Entity entity = null;
            PromptEntityResult ent = ed.GetEntity("\n选择要读取数据的对象");
            if (ent.Status == PromptStatus.OK)
            {
                using (Transaction transaction = db.TransactionManager.StartTransaction())
                {
                    entity = transaction.GetObject(ent.ObjectId, OpenMode.ForRead, true) as Entity;
                    DBDictionary extensionDic = transaction.GetObject(entity.ExtensionDictionary, OpenMode.ForRead) as DBDictionary;
                    Autodesk.AutoCAD.DatabaseServices.DataTable dt = transaction.GetObject(extensionDic.GetAt("ParameterTable"), OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.DataTable;
                    ed.WriteMessage("\n Name:" + dt.GetCellAt(0, 0).Value.ToString());
                    ed.WriteMessage("\n Meterial:" + dt.GetCellAt(0, 1).Value.ToString());
                    ed.WriteMessage("\n Parameter:" + dt.GetCellAt(0, 2).Value.ToString());
                    Autodesk.AutoCAD.DatabaseServices.DataColumn nameColumn = dt.GetColumnAt(0);
                    Autodesk.AutoCAD.DatabaseServices.DataColumn meterialColumn = dt.GetColumnAt(1);
                    Autodesk.AutoCAD.DatabaseServices.DataColumn parameterColumn = dt.GetColumnAt(2);
                    ed.WriteMessage("\n Meterial:" + meterialColumn.GetCellAt(0).ToString());
                    ed.WriteMessage("\n Meterial:" + parameterColumn.GetCellAt(0).Value.ToString());
                    transaction.Commit();
                }
            }
        }
回复

使用道具 举报

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-14 22:24:00 | 显示全部楼层

在线等,希望大家可以帮帮忙,小弟能力有限,只能麻烦大家了~ 环境CAD2010+VS2008
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2015-4-14 23:13:00 | 显示全部楼层
数据放在字典没错
但一般都是存储成一条记录
像你这样放在datatable....应该是前所未闻的
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2015-4-14 23:15:00 | 显示全部楼层
如果数据比较简单 用扩展数据xdata也行
回复

使用道具 举报

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-14 23:52:00 | 显示全部楼层

谢谢!!我看的书是深入浅出.net cad二次开发。 xdata只有三行文字的介绍,实在无力。可以先帮忙解决第一个问题吗?Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            PromptSelectionResult i = ed.SelectPrevious();
            if (i.Status == PromptStatus.OK)
            {
                         this.panel1.Location = new Point(0,0);
            this.panel1.Visible = true;
            }
            else
            {
            this.panel1.Location = new Point(-10000,-10000);
            }
我在帖子里搜索到说用SelectPrevious,写了这个 ,不过运行之后没有显示出panel,另外 扩展数据xdata 是不是 -3  ??
回复

使用道具 举报

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-14 23:54:00 | 显示全部楼层

飞狐哥,我该怎么做呢?可以给个思路吗 我只是把那本“深入浅出”代码以及实例做了一遍,具体该怎么联系起来,没有一点思路 可以教教我吗? 其实要输入的数据全在块参照里,修改也在块参照,显示也是通过块参照,可以教我怎么做吗?谢谢!
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2015-4-15 08:12:00 | 显示全部楼层
建议你先把基础的东西搞清楚 而不是直接Copy代码
置顶帖的指南翻译版 你可以看看 里面的代码很多
回复

使用道具 举报

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-15 09:05:00 | 显示全部楼层

好的,谢谢啊
回复

使用道具 举报

2

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2015-4-19 01:19:00 | 显示全部楼层

谢谢飞狐哥,问题已经解决。不过第一个问题解决了一半,操作显得麻烦不通畅,暂时研究其他重要点的功能,谢谢你·
回复

使用道具 举报

0

主题

275

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
275
发表于 2015-4-19 22:02:00 | 显示全部楼层
和界面关联据说用绑定是正解
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-28 18:53 , Processed in 2.549321 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表