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提供的代码啊,这样你就容易理解啦