sieben 发表于 2013-4-1 18:48:54

介之推 发表于 2013-4-1 16:01 static/image/common/back.gif
你好,sieben。
你的第二个函数调试通了以后,编译不出问题,我这样调用你的InsertDwg()函数,运行时出错了 ...

我也不明所以,不过应该不是你所说的那一行出错,你的代码或许太简洁了。

清风明月名字 发表于 2013-4-1 18:59:40

上面是什么程序语言啊?不象VBA

介之推 发表于 2013-4-1 19:52:56

本帖最后由 介之推 于 2013-4-1 19:54 编辑

sieben 发表于 2013-4-1 18:48 http://bbs.mjtd.com/static/image/common/back.gif
我也不明所以,不过应该不是你所说的那一行出错,你的代码或许太简洁了。

你好,我调试了,确实是那一行代码出错了。
完整的代码入下: public ObjectId InsertDwg(string fileName, ref string blockName)
      {

            try
            {
                /*
                if (!replace)
                {
                  ObjectId blockId = sn.GetRecordId(sc.db.BlockTableId, blockName);
                  if (blockId != ObjectId.Null)
                        return blockId;
                }
                //*/
                if (fileName == "" || !File.Exists(fileName))
                {
                  Editor se = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                  //se.WriteMessage(ex);
                  se.WriteMessage("File not found");
                  return ObjectId.Null;
                }
                if (!fileName.ToLower().EndsWith(".dwg"))
                {
                  Editor se = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                  //se.WriteMessage(ex);
                  se.WriteMessage("Not dwg file");
                  return ObjectId.Null;
                }                  
            }
            catch (System.Exception ex)
            {
                Editor se = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                //se.WriteMessage(ex);
                se.WriteMessage(ex.StackTrace);
                return ObjectId.Null;
            }
            Database newDB = new Database(false, false);
            bool newDBHasDispose = false;
            try
            {
                Database myDb = HostApplicationServices.WorkingDatabase;

                if (blockName == "")
                {
                  FileInfo fileInfo = new FileInfo(fileName);
                  blockName = fileInfo.Name.Substring(0, fileInfo.Name.Length - 4);
                }
                //newDB.ReadDwgFile(fileName, System.IO.FileShare.Read, true, fileName);
                newDB.ReadDwgFile(fileName, System.IO.FileShare.Read, true, null);
                if (newDB.Insbase.GetAsVector().Length > 0.00001)
                {
                  if (newDB.Insbase.X >= newDB.Extmin.X && newDB.Insbase.X <= newDB.Extmax.X
                      && newDB.Insbase.Y >= newDB.Extmin.Y && newDB.Insbase.Y <= newDB.Extmax.Y)
                  {
                        //Insbase位于图形范围,不进行移动,有可能不符合预期
                        //return sc.db.Insert(blockName, newDB, true);
                        return myDb.Insert(blockName, newDB, true);
                  }
                  else
                  {
                        if (newDB.Extmin.X > newDB.Extmax.X)
                        {
                            //图形范围Extmin Extmax未初始化,不进行移动,有可能不符合预期
                            //return sc.db.Insert(blockName, newDB, true);
                            return myDb.Insert(blockName, newDB, true);
                        }
                        else
                        {
                            Matrix3d tMat = Matrix3d.Displacement(newDB.Insbase.GetAsVector().Negate());
                            newDB.Insbase = Point3d.Origin;
                            //ObjectId blockId = sc.db.Insert(blockName, newDB, true);
                            ObjectId blockId = myDb.Insert(blockName, newDB, true);
                            if (0 >= newDB.Extmin.X && 0 <= newDB.Extmax.X && 0 >= newDB.Extmin.Y && 0 <= newDB.Extmax.Y)
                            {
                              //坐标原点位于图形范围,不进行移动,有可能不符合预期
                              return blockId;
                            }
                            else
                            {
                              //Insbase不位于图形范围 坐标原点也不位于图形范围,将图形从Insbase移到原点,有可能不符合预期
                              //using (Transaction ctrans = sc.db.TransactionManager.StartTransaction())
                              using(Transaction ctrans = myDb.TransactionManager.StartTransaction())
                              {
                                    BlockTableRecord cbtr = (BlockTableRecord)ctrans.GetObject(blockId, OpenMode.ForWrite);
                                    foreach (ObjectId tId in cbtr)
                                    {
                                        Entity ent = (Entity)ctrans.GetObject(tId, OpenMode.ForWrite);
                                        ent.TransformBy(tMat);
                                    }
                                    ctrans.Commit();
                              }
                              return blockId;
                            }
                        }

                  }
                }
                else
                {
                  //Insbase位于原点,不用做任何处理
                  //return sc.db.Insert(blockName, newDB, true);
                  return myDb.Insert(blockName, newDB, true);         //这行出错了,错误信息:eSelfReference
                }
            }
            catch (System.Exception ex)
            {
                Editor se = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                //se.WriteMessage(ex);
                se.WriteMessage(ex.StackTrace + "\n" + ex.Message + "\n" + ex.TargetSite);
                return ObjectId.Null;
            }
            finally
            {
                if (!newDBHasDispose)
                  newDB.Dispose();
            }
      }就是你给我的第二个函数,就是把几个变量名换了,其他都没有动。
调用这个函数的命令如下:
      public void InsertBlock()
      {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            try
            {
                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                  //ImportBlock_DB("test.dwg", "sample");
                  string blockName = "sample"; InsertDwg("test.dwg", ref blockName);

                  trans.Commit();
                }
            }
            catch (System.Exception ex)
            {               
                ed.WriteMessage(ex.StackTrace + "\n" + ex.Message + "\n" + ex.TargetSite);
                return;
            }
                     
      }我用的是AutoCAD2008,难道是版本的问题?

介之推 发表于 2013-4-1 19:55:57

清风明月名字 发表于 2013-4-1 18:59 static/image/common/back.gif
上面是什么程序语言啊?不象VBA

VBA?哈哈,这个真不是VBA呢。哈哈。

sieben 发表于 2013-4-1 20:04:17

你的代码太简洁了,即使调用的函数内部不出错,你的代码也是行不通的

介之推 发表于 2013-4-1 20:33:02

本帖最后由 介之推 于 2013-4-1 20:35 编辑

sieben 发表于 2013-4-1 20:04 http://bbs.mjtd.com/static/image/common/back.gif
你的代码太简洁了,即使调用的函数内部不出错,你的代码也是行不通的
你好,你说的是我的调用函数InsertBlock(){...}太简单了,还是下面调用你的函数的这行代码太简洁了?
string blockName = "sample"; InsertDwg("test.dwg", ref blockName);

如何正确调用呢?请帮帮忙!

sieben 发表于 2013-4-1 22:00:31

介之推 发表于 2013-4-1 20:33 static/image/common/back.gif
你好,你说的是我的调用函数InsertBlock(){...}太简单了,还是下面调用你的函数的这 ...

对,我就是想说你这一行代码太简单了,我怀疑你是不是在用Lisp的语法来写这个代码

sieben 发表于 2013-4-1 22:01:31

另外,这句代码的前面一行和后面一行也是不必要的,甚至是致命的

介之推 发表于 2013-4-1 22:47:37

sieben 发表于 2013-4-1 22:01 static/image/common/back.gif
另外,这句代码的前面一行和后面一行也是不必要的,甚至是致命的

我没有用Lisp啊,不会用Lisp,我只有采用.NET方式开发啊。
我的调用可能太简单了,但我只会这些了。
请问如何在调用你的函数之前做好铺垫?

ScmTools 发表于 2013-4-1 23:07:01

建议LZ还是在看看块表的帮助,然后再来看Sieben提供的代码啊,这样你就容易理解啦
页: 1 [2] 3
查看完整版本: 如何编写代码实现从外部输入块,并插入到当前文件中?