关闭绘图时设置默认图层
大家好,我做错了什么,但我不知道是什么!我想要做的是在几个关闭的文档上设置一个默认层(在这个例子中是层0)。它没有把好的层,但在功能区,该层是空白的(见图片)。下面是我的代码: private void btntraiter 2 _ Click(object sender,EventArgs e)。{。
bool Ok2Continue = true。
。
for(int I = 0;我。
{。
Database db =新数据库(false,true);。
使用(数据库)。
{。
字符串文件名= dwgLst,GetKey(i),ToString();。
。
尝试{ db,ReadDwgFile(文件名,文件共享。ReadWrite,false,“”;}。
。
catch (Autodesk,AutoCAD . runtime . exception ex){ ok 2 continue = false;}。
。
if (Ok2Continue)。
{。
使用(事务tr = db,transaction manager . start transaction())。
{。
listLayerID = listDWGLayerID;。
ObjectId id = ObjectId,Null。
if (listLayerID,contains key(" 0 "))id = listLayerID[" 0 "];。
dbClayer = id。
trcommit();。
}。
}。
。
尝试{ db,另存为(文件名,真,数据库。原始版本,db。security参数);}。
捕捉{ MessageBox,Show("Error "," Error ");}。
}。
dbdispose();。
}。
}。
我已经用调试模式进行了检查,以确保我应用了有效的层id,它确实如此。它应该可以工作,因为一切都很好,但后来我做了一些改变,现在它不能工作了!它甚至适用于所有其他属性,如textstyle、leaderstyle、dimstyle...感谢您的宝贵帮助!。
**** Hidden Message ***** 您好,
看起来您没有提交事务。 我的错误,代码很长,所以我做了一个简短的版本,我忘了保留那行。 我确实提交了交易。我将更正我的原始帖子。
如果使用 mdiActiveDocument 中的 TransactionManager 而不是 Database 对象,它是否有效?
Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction()
尝试在每个循环中更改工作数据库,私有空btnTraiter2_Click(对象发送者,EventArgs e)。
{。
//存储当前工作数据库。
var电流工作Db=HostApplicationServices.WorkingDatabase;。
。
对于(int i=0; i。
{。
使用(数据库db=新数据库(false, true))。
{。
string fileName=dwgLst.GetKey(i). ToString();。
。
尝试。
{。
db.ReadDwgFile(fileName,FileOpenMode.OpenForReadAndAllShare, false, "");。
。
使用(事务tr=db.TransactionManager.StartTransaction())。
{。
listLayerID=listDWGLayerID;。
ObjectId id=ObjectId.Null;。
if(listLayerID.ContainsKey("0"))id=listLayerID["0"];。
//将侧数据库设置为工作数据库。
HostApplicationServices.WorkingDatabase=db;。
db.Clayer=id;。
tr.Commit();。
}。
。
db.SaveAs(fileName, true,db.OriginalFileVersion,db.SecurityParameters);。
} // 。
。
捕获{MessageBox.Show("错误","错误"); }。
}。
。
//恢复工作数据库。
HostApplicationServices.WorkingDatabase/div>。
}。
}PS:我从您的代码中删除了一些无用的说明。
嗨,阿图克,
感谢您的回答。它仍然做同样的事情。
嗨,吉尔,
感谢您的回答。 我收到错误。 看起来您正在为每个文件使用ObjectIds(listLayerID)列表,这是不可靠的,可能是您收到此错误的原因。
ObjectIds是会话中的唯一标识符,但它们在会话之间是不持久的(它们在创建数据库时被构建为唯一的)。
您应该改用层名称并获取新创建的ObjectId:db.layerTable。 我也很困惑,为什么你创建一个新的数据库,检查它的readall/share,然后在设置图层时切换到工作数据库。为什么不一直使用工作数据库呢?下面是我用来在活动数据库中设置层的代码 /// 。
///将层设置为当前层,如果它不存在则创建它。
/// 。
/// 层的名称,。
/// 颜色,。
/// 是否要打印创建的层。
/// 如果layername有效,则为True,否则为false。
public static bool set layer(string layer name,short color=7,bool print=true)。
{。
if(IsValidSymbolName(layer name))。
{。
ObjectId layID = ObjectId,Null。
使用(事务tr = Active,document . transaction manager . start transaction())。
{。
layer table layer table =(layer table)tr,GetObject(活动,Database.LayerTableId,OpenMode。for read);。
如果(!分层表,Has(layerName))。
{。
LayerTableRecord new layer = new LayerTableRecord 。
{。
Name = layerName,。
Color = Color,FromColorIndex(ColorMethod,ByAci,color),。
isplotable = print 。
};。
图层表,upgrade open();。
layID=layerTable,add(new layer);。
trAddNewlyCreatedDBObject(new layer,true);。
}。
否则。
{。
layID = layer table;。
}。
LayerTableRecord层记录= (LayerTableRecord) tr,GetObject((layer table),OpenMode。for write);。
if (layerRecord,IsFrozen)。
{。
层记录,IsFrozen = false。
} 。
尝试一下。
{。
激活,Database . Clayer = layID。
}。
catch(系统,例外e)。
{。
AID _应用程序,handle error(e);。
}。
trcommit();。
}。
}。
否则。
{。
激活,write message(" \ n无效的层名:"+层名");。
}。
返回IsValidSymbolName(layer name);。
}。
活动时,文档是mdiActiveDocument。
吉尔,容易多了,现在工作正常!谢谢!
Atook,我不习惯与亲密的dwg一起工作,我认为这是要走的路。 感谢您的代码和帮助!
页:
[1]