命令在命令结束事件中不起作用
**** Hidden Message ***** 嗨,据我所知,您不能从事件处理程序调用命令(使用SendStringToExecute,SendCommand或Command)。 在这种情况下,空闲事件可以是你的朋友,确保你的代码从正确的状态运行,只需将你的回调函数添加到列表中,然后在它被调用后删除它。 。
{。
//代码没有在应用程序上下文中运行。
欧特克,AutoCAD . Application services . Application . Idle+= Application _ Idle;。
}。
。
静态void Application_Idle(对象发送方,EventArgs e)。
{。
欧特克,AutoCAD . Application services . Application . Idle-= Application _ Idle;。
//从应用程序上下文中执行操作。
}。
因此,当用户执行qsave或单击保存工具栏按钮(似乎也发出qsave命令)时,我的命令成功执行。但是,当用户在对话框中提示您退出时是否要保存时,我该如何反应呢?这似乎不会触发命令事件..我该如何解决这个问题? ...实际上,我想我通过连接到e.Document.Database.SaveComplete命令来解决这个问题...所以现在任何保存方法都会触发我的导出,(我排除自动保存) 我确实在 SaveComplete 事件期间触发了我的导出:
public void Initialize()
{
Application.DocumentManager.DocumentCreated += DocumentManager_DocumentCreated;
foreach (Document doc in Application.DocumentManager)
{
doc.Database.SaveComplete += OnDatabaseSaveComplete;
}
}
和我的事件处理程序:
private void OnDatabaseSaveComplete(object sender, DatabaseIOEventArgs e)
{
// ignore when the document is being auto saved
if (e.FileName.Contains(".sv$"))
return;
Document doc = Application.DocumentManager.MdiActiveDocument;
var currentFilename = doc.Name;
if ((currentFilename.Contains("-CSA-")) ||
(currentFilename.Contains("-S-")) ||
(currentFilename.Contains("-B-")) ||
(currentFilename.Contains("-F-")))
{
ExportTo3dDwf();
}
}
和 ExportTo3dDwf 分离所有外部参照并解冻所有层...但我的意图是不修改数据库。我想在分离外部参照和解冻图层之前保持 DWG 不变,以准备导出到 dwf。
所以我正在使用这里找到的一些漂亮的例程..这就是我解冻所有层的方式:
public static void ThawAll()
{
Database db = HostApplicationServices.WorkingDatabase;
LayerTableRecord layer;
string curLayer = (string)Application.GetSystemVariable("CLayer");
using (Transaction tr = db.TransactionManager.StartTransaction())
{
LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
foreach (ObjectId layerId in lt)
{
layer = tr.GetObject
(layerId, OpenMode.ForWrite) as LayerTableRecord;
if (layer.Name != curLayer)
layer.IsFrozen = false;
}
tr.Commit();
Application.DocumentManager.MdiActiveDocument.Editor.Regen();
}
}
那么我怎么能做到这一点,而不是保存/修改DWG?我尝试过删除提交,但它仍然修改了DWG。
在一些旧的LISP中,我看到
(acad-push-dbmod)
以防止保存对图形的更改。如何在 C# 中执行此操作?
看看这个:
Autodesk.AutoCAD.ApplicationServices.Document.PopDbMod()/PushDbMod()。
这是ObjectARX参考指南中的引用:
此方法将DBMOD系统变量的当前值复制到堆栈上。这允许您保存DBMOD只读系统变量的当前值,以便通过popDbmod()方法进行后续恢复。
pushDbmod()及其对应物popDbmod()允许您的应用程序修改数据库而无需将其标记为已修改,这是应用程序在编辑会话初始化期间通常所做的。这包括修改数据库头变量或添加和修改正在编辑的数据库中的对象,这都会导致文档系统变量DBMOD中的标志被设置。当DBMOD非零时,当用户尝试退出绘图时,会发布“保存您的绘图?”提示。要避免在应用程序中出现此提示,请在开始以不会导致此查询的方式修改数据库之前,使用pushDbmod()堆叠当前DBMOD值,在此类修改完成后使用popDbmod()恢复DBMOD。
页:
[1]