Тема: Как скрыть построения lisp функции с глаз пользователя

День добрый! Столкнулся с проблемой: как скрыть построения с глаз пользователя. Как решить проблему сообразить не могу.
Примерно понимаю, как это сделать:
В примере описанном ниже у меня 1-ой запускаеться модальная форма,
в которой происходит заполнение исходных данных. Далее по кнопке
ok закрываеться первая форма и всплывает немодальная форма
говорящая, что идёт формирование чертежа. Acad делается невидимым,
функция lispa делает необходимые построения, после чего Acad делается видимым и
немодальное окно закрывается.

У меня получаеться при отработки кода иначе. Всплывает немодальная форма ->
Acad исчезает -> потом появляется-> форма закрываеться и начинает происходить
построение.

Как сделать так чтоб, только после отработки lisp функции Acad появился и
закрылось немодальное окно?

Как притушить текущий чертёж, чтоб не гасить весь Acad?

'Contains the AutoCAD Type Library
Imports Autodesk.AutoCAD.Interop
'Contains the AutoCAD/ObjectDBX Type Library Imports Autodesk.AutoCAD.Interop.Common Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Windows
Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry



Public Class AdskCommands
    Public ReadOnly Property ThisDrawing() As  _
    AcadDocument
        Get
            Return Autodesk.AutoCAD. _
            ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property

    <Autodesk.AutoCAD.Runtime.CommandMethod("Bottom")> _
    Public Sub myRoutine()
        Dim frm As Dialog1
        Dim frm3 As Dialog3
        frm = New Dialog1
        frm.ShowDialog()
        frm3 = New Dialog3
        If frm.DialogResult = Windows.Forms.DialogResult.OK Then
            frm3.Show()
            Application.MainWindow.Visible = False
            ThisDrawing.SendCommand("(Bottom_reamer) ")
            Application.MainWindow.Visible = True
            frm3.Close()
        End If
    End Sub
End Class

Re: Как скрыть построения lisp функции с глаз пользователя

У тебя жуткая смесь COM и .NET Тебе нужно скрыть построения? Если да, то для этой цели можно через P/Invoke вызвать acedUpdateDisplayPause(true) в начале кода, acedUpdateDisplayPause(false) и acedUpdateDisplay() или Editor.UpdateScreen в конце.

Re: Как скрыть построения lisp функции с глаз пользователя

Именно мне надо скрыть построения. Основная функция написана на lispe, поэтому и получается гремучая смесь. Поскольку .net под рукой нет проверить не могу. Если я не прав прошу не винить - только начинаю изучение.

acedUpdateDisplayPause(true) 
   frm3.Show() 
            Application.MainWindow.Visible = False 
            ThisDrawing.SendCommand("(Bottom_reamer) ") 
            Application.MainWindow.Visible = True 
            frm3.Close() 
acedUpdateDisplayPause(false)
acedUpdateDisplay() 

Надо ли давать ссылку на *.dll при работе P/Invoke в проекте?
Не забыл ли я чего перед aced...?
Не произойдёт ли в этом случае, что сначало дисплей потухнет и
включиться, а только потом начнёться исполнение lisp функции (Bottom_reamer)?
Заранее прошу прощенье, если задаю глупый вопрос, VB.net для меня малознаком.

(изменено: Александр Ривилис, 24 марта 2011г. 12:35:48)

Re: Как скрыть построения lisp функции с глаз пользователя

В любом случае ты написал неправильно. Ищи в гугле что такое P/Invoke. Тебе как минимум понадобится написать объявление функций acedUpdateDisplayPause и acedUpdateDisplay. Это будет на VB.NET приблизительно так (на VB не пишу, так что будешь сам перепроверять):

Imports System.Runtime.InteropServices ' для DllImport
<System.Security.SuppressUnmanagedCodeSecurity(), DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?acedUpdateDisplay@@YAXXZ")> _
Private Shared Sub acedUpdateDisplay()
End Sub
<System.Security.SuppressUnmanagedCodeSecurity(), DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?acedUpdateDisplayPause@@YAX_N@Z")> _
Private Shared Sub acedUpdateDisplayPause(ByVal flagupdate as Boolean)
End Sub
<System.Security.SuppressUnmanagedCodeSecurity(), DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?acedIsUpdateDisplayPaused@@YA_NXZ")> _
Private Shared Function acedIsUpdateDisplayPaused() as Boolean
End Function


Код не проверял.
Можно выполнить lisp-код из .NET без SendCommand. Посмотри здесь: http://www.theswamp.org/index.php?topic … #msg389460 (нужна бесплатная регистрация).

P.S.: А самым правильным будет не полениться и переписать весь lisp-код на .NET

Re: Как скрыть построения lisp функции с глаз пользователя

Большое спасибо за помощь!