flyte 发表于 2017-9-20 00:06:32

命令在命令结束事件中不起作用

**** Hidden Message *****

gile 发表于 2017-9-20 03:54:10

嗨,据我所知
,您不能从事件处理程序调用命令(使用SendStringToExecute,SendCommand或Command)。

flyte 发表于 2017-9-27 01:23:53

在这种情况下,空闲事件可以是你的朋友,确保你的代码从正确的状态运行,只需将你的回调函数添加到列表中,然后在它被调用后删除它。    。
{。
//代码没有在应用程序上下文中运行。
欧特克,AutoCAD . Application services . Application . Idle+= Application _ Idle;。
}。

静态void Application_Idle(对象发送方,EventArgs e)。
{。
欧特克,AutoCAD . Application services . Application . Idle-= Application _ Idle;。
//从应用程序上下文中执行操作。
}。

flyte 发表于 2017-11-1 17:15:12


因此,当用户执行qsave或单击保存工具栏按钮(似乎也发出qsave命令)时,我的命令成功执行。但是,当用户在对话框中提示您退出时是否要保存时,我该如何反应呢?这似乎不会触发命令事件..我该如何解决这个问题?

flyte 发表于 2017-11-1 18:23:03

...实际上,我想我通过连接到e.Document.Database.SaveComplete命令来解决这个问题...所以现在任何保存方法都会触发我的导出,(我排除自动保存)

n.yuan 发表于 2018-1-16 23:51:24

我确实在 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# 中执行此操作?

flyte 发表于 2018-1-17 09:37:30

看看这个:
Autodesk.AutoCAD.ApplicationServices.Document.PopDbMod()/PushDbMod()。
这是ObjectARX参考指南中的引用:
此方法将DBMOD系统变量的当前值复制到堆栈上。这允许您保存DBMOD只读系统变量的当前值,以便通过popDbmod()方法进行后续恢复。
pushDbmod()及其对应物popDbmod()允许您的应用程序修改数据库而无需将其标记为已修改,这是应用程序在编辑会话初始化期间通常所做的。这包括修改数据库头变量或添加和修改正在编辑的数据库中的对象,这都会导致文档系统变量DBMOD中的标志被设置。当DBMOD非零时,当用户尝试退出绘图时,会发布“保存您的绘图?”提示。要避免在应用程序中出现此提示,请在开始以不会导致此查询的方式修改数据库之前,使用pushDbmod()堆叠当前DBMOD值,在此类修改完成后使用popDbmod()恢复DBMOD。
页: [1]
查看完整版本: 命令在命令结束事件中不起作用