- 积分
- 25214
- 明经币
- 个
- 注册时间
- 2003-6-27
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2013-3-31 08:06:12
|
显示全部楼层
/// <summary>
/// 将dwg文件作为图块引入
/// 备注:
/// 1,不生成块参考
/// 2,应对文件Insbase不是原点的情况 2011.04.23
/// Version : 2011.04.23 Sieben
/// </summary>
/// <param name="fileName">dwg文件全名</param>
/// <param name="blockName">生成的块记录名,输入空字符串时将使用文件名作为块记录名(不含扩展名)</param>
/// <param name="replace">若对应的块记录名已存在,是否替换</param>
/// <returns>若成功返回块记录的ObjectId,否则返回ObjectId.Null </returns>
static public ObjectId InsertDwg(string fileName, ref string blockName, bool replace)
{
try
{
if (!replace)
{
ObjectId blockId = sn.GetRecordId(sc.db.BlockTableId, blockName);
if (blockId != ObjectId.Null)
return blockId;
}
if (fileName == "" || !File.Exists(fileName))
return ObjectId.Null;
if (!fileName.ToLower().EndsWith(".dwg"))
return ObjectId.Null;
}
catch (System.Exception ex)
{
se.WriteMessage(ex);
return ObjectId.Null;
}
Database newDB = new Database(false, false);
bool newDBHasDispose = false;
try
{
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);
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);
}
else
{
if (newDB.Extmin.X > newDB.Extmax.X)
{
//图形范围Extmin Extmax未初始化,不进行移动,有可能不符合预期
return sc.db.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);
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())
{
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);
}
}
catch (System.Exception ex)
{
se.WriteMessage(ex);
return ObjectId.Null;
}
finally
{
if (!newDBHasDispose)
newDB.Dispose();
}
} |
|