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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值