AutoCAD.net: 实现AutoCAD Undo操作

      在命令行输入"UNDO",会看到"Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]",本文就利用"BEgin/End/Mark/Back”在ARX开发中实现Undo的操作。

 1. Undo 操作的结构:

  • _BEgin
  • _Mark
  • _Undo
  • _End

 2. 注意事项:

  • 一组{_BEgin, _End}为一个操作单元,其内部不能再嵌套另一个{_BEgin, _End}。
  • {_BEgin, _End}不能嵌在任何Transaction内部,但其内部可以嵌任意多个Transaction. 
  • 最好一个_Mark标识一个Transaction.

3. SampleCode

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Runtime;
using ArxApp = Autodesk.AutoCAD.ApplicationServices.Application;
using ObjectArxNet.Commons;

namespace ObjectArxNet.Test
ExpandedBlockStart.gifContractedBlock.gif
{
    
public class Undo
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        [CommandMethod(
"My_Undo")]
        
public void InitCommand()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Document doc 
= Application.DocumentManager.MdiActiveDocument;
            Database db 
= doc.Database;
            Editor ed 
= doc.Editor;

            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
//Use pick first
                PromptSelectionResult selectionRes = ed.SelectImplied();
                
bool usePickfirst = false;

                
if (selectionRes.Status == PromptStatus.OK)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
// If there was a pickfirst set, clear it
                    ed.SetImpliedSelection(new ObjectId[0]);

                    ObjectId[] objIds 
= selectionRes.Value.GetObjectIds();
                    
if (objIds != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        usePickfirst 
= objIds.Length > 0;
                    }

                }


                
//Selection Options
                PromptSelectionOptions selOpt = new PromptSelectionOptions();
                selOpt.MessageForAdding 
= Consts.KEY_SELECT;
                selOpt.MessageForRemoval 
= Consts.KEY_SELECT;

                
//Keyword Options
                PromptKeywordOptions optManual = new PromptKeywordOptions("\nSelect aligning mode");
                optManual.Keywords.Add(Consts.KEY_AUTO_SELECT, Consts.KEY_AUTO_SELECT, Consts.KEY_AUTO_SELECT_DIS);
                optManual.Keywords.Add(Consts.KEY_INSERT, Consts.KEY_INSERT, Consts.KEY_INSERT_DIS);
                optManual.Keywords.Add(Consts.KEY_UNDO, Consts.KEY_UNDO, Consts.KEY_UNDO);
                optManual.Keywords.Add(Consts.KEY_EXIT, Consts.KEY_EXIT, Consts.KEY_EXIT);
                optManual.AllowNone 
= false;
                optManual.Keywords.Default 
= Consts.KEY_AUTO_SELECT;

                PromptResult res 
= null;

                
if (usePickfirst)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Tools.RunCommand(
"_.UNDO""_BEgin");
                    res 
= ed.GetKeywords(optManual);
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Tools.RunCommand(
"_.UNDO""_BEgin");
                    PromptSelectionResult selRes 
= ed.GetSelection(selOpt); //, filter
                    if (selRes.Status == PromptStatus.OK)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        ObjectId[] objIds 
= selRes.Value.GetObjectIds();
                        
if (objIds != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            res 
= ed.GetKeywords(optManual);
                        }

                    }

                }


                
while (res != null && res.Status == PromptStatus.OK)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
switch (res.StringResult)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
case Consts.KEY_AUTO_SELECT:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                Tools.RunCommand(
"_.UNDO""_Mark");
                                Tools.WriteLine(
string.Format("DO: {0}", Consts.KEY_AUTO_SELECT));

                                res 
= ed.GetKeywords(optManual);
                                
break;
                            }

                        
case Consts.KEY_INSERT:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                Tools.RunCommand(
"_.UNDO""_Mark");
                                Tools.WriteLine(
string.Format("DO: {0}", Consts.KEY_INSERT));

                                res 
= ed.GetKeywords(optManual);
                                
break;
                            }

                        
case Consts.KEY_REMOVE:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                Tools.RunCommand(
"_.UNDO""_Mark");
                                Tools.WriteLine(
string.Format("DO: {0}", Consts.KEY_REMOVE));

                                res 
= ed.GetKeywords(optManual);
                                
break;
                            }

                        
case Consts.KEY_UNDO:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                Tools.RunCommand(
"_.UNDO""_Back");
                                Tools.WriteLine(
string.Format("DO: {0}", Consts.KEY_UNDO));

                                doc.TransactionManager.QueueForGraphicsFlush();
                                res 
= ed.GetKeywords(optManual);
                                
break;
                            }

                        
case Consts.KEY_EXIT:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                Tools.RunCommand(
"_.UNDO""_End");//end the last
                                Tools.WriteLine(string.Format("DO: {0}", Consts.KEY_EXIT));
                                doc.TransactionManager.QueueForGraphicsFlush();

                                Tools.RunCommand(
"_.UNDO""_BEgin");//begin the next
                                PromptSelectionResult selRes = ed.GetSelection(selOpt); //, filter
                                if (selRes.Status == PromptStatus.OK)
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
{
                                    ObjectId[] objIds 
= selRes.Value.GetObjectIds();
                                    
if (objIds != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                                    
{
                                        res 
= ed.GetKeywords(optManual);
                                    }

                                }

                                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
{
                                    
return;
                                }

                                
break;
                            }

                        
default:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                doc.TransactionManager.QueueForGraphicsFlush();
                                res 
= ed.GetKeywords(optManual);
                                
break;
                            }

                    }

                }

            }

            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Tools.RunCommand(
"_.UNDO""_End");
                ed.SelectionAdded 
-= new SelectionAddedEventHandler(callback_SelectionAdded);
            }

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AutoCAD C# 中实现撤销(Undo)实体的操作,可以使用 `Transaction` 类来创建一个事务,然后在事务中执行实体的操作,以便可以通过 `TransactionManager.Undo()` 方法来撤销这些操作。以下是一个示例代码: ```csharp // 获取 AutoCAD 当前文档的数据库对象 Database db = Application.DocumentManager.MdiActiveDocument.Database; // 开始一个新事务 using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 选择实体 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptEntityOptions peo = new PromptEntityOptions("\n选择实体:"); PromptEntityResult per = ed.GetEntity(peo); if (per.Status != PromptStatus.OK) { return; } Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite); // 在事务中修改实体 // ... // 提交事务 tr.Commit(); // 撤销事务 db.TransactionManager.QueueForUndo(tr); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { // 处理异常 ed.WriteMessage("\n" + ex.Message); tr.Abort(); } } ``` 在上面的示例中,我们首先选择了一个实体,然后在事务中修改了该实体。在提交事务之后,我们将事务添加到撤销队列中,以便可以通过 `TransactionManager.Undo()` 方法来撤销该事务。注意,我们使用了 `QueueForUndo()` 方法来将事务添加到撤销队列中,而不是直接调用 `Undo()` 方法,这是因为在事务中可能会有多个实体的操作,而我们只想撤销这些操作中的某一个。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值