mohnston 发表于 2006-11-1 19:54:05

永无止境的命令

我一直在通过观看 BeginCommand、ObjectAdd 和 EndCommand 事件来捕捉到将某些项目添加到绘图中的过程。在触发 EndCommand 事件时,我将处理感兴趣的项目。
现在,在 2007 年,默认情况下,“复制”命令设置为“多个”。
因此,如果用户启动 copy 命令,则会触发 begin 命令事件。
当他们单击目标时,将为每个添加的对象触发对象添加事件。
如果他们点击鼠标右键或输入键,则将触发endcommand事件,一切都很好。
但是,如果他们在丢弃项目一次或多次后按 Escape 键,则 endcommand 事件永远不会触发。
在我看来,每个开始的命令都应该结束。即使通过取消命令结束。
有没有人找到解决这个新问题的方法?
**** Hidden Message *****

Bryco 发表于 2006-11-1 20:38:24

尝试一下并适应它。它消除了所有的错误陷阱。
基本原则是:在命令开始时设置一个布尔值,然后在命令结束时将其设置为false。如果begincommand的布尔值为真,则endcommand不会被触发。
Option Explicit
Private PrevLayer As AcadLayer
Private CmdActive As Boolean
Function EscPrompt() As Boolean
    Dim varCancel As Variant
    varCancel = ThisDrawing.GetVariable("LASTPROMPT")
    If InStr(1, varCancel, "*Cancel*")0 Or _
      InStr(1, varCancel, "")0 Then 'this takes care of vbarun, toolbarsetc w/ ^C^C
      If CmdActive > 0 Then
            EscPrompt = True
      End If
    End If
   
End Function
Public Property Get oPrevLayer() As AcadLayer
    If IsObject(PrevLayer) Then
      If PrevLayer Is Nothing Then
            Set oPrevLayer = ThisDrawing.Layers("0")
            Set PrevLayer = ThisDrawing.ActiveLayer
      End If
    End If
    Set oPrevLayer = PrevLayer
End Property
Public Property Let oPrevLayer(l As AcadLayer)
    Set PrevLayer = l
End Property
Public Sub AcadDocument_BeginCommand(ByVal CommandName As String)
    Dim oLayer As AcadLayer
      
    If CmdActive Then
      If EscPrompt Then
            ThisDrawing.ActiveLayer = oPrevLayer
      End If
    End If
Select Case UCase(CommandName)
   ' blnActive = False
      
      Case "BHATCH"
            Set oLayer = ThisDrawing.Layers("T-Hatch")
            CmdActive = True
            ThisDrawing.ActiveLayer = oLayer
            
    End Select
   
End Sub
Private Sub AcadDocument_EndCommand(ByVal CommandName As String)
If CmdActive Then CmdActive = False
    Select Case UCase(CommandName)
      Case "BHATCH"
            ThisDrawing.ActiveLayer = oPrevLayer
      
      Case Else
            Exit Sub
    End Select
   
   Set PrevLayer = Nothing
End Sub

启动Hatch命令时,绘制矩形并观察图层特性管理器。后来试着逃跑。修复不是直接的,画另一个矩形并观察它的变化。

Bryco 发表于 2006-11-4 14:06:30

马克,如果你没有答案,我发现布尔技术可以很好地处理多个命令。
它需要一个集合集,并且ObjectAdded子中给出的项目被添加到这个集合中。
页: [1]
查看完整版本: 永无止境的命令