wccppp Posted November 3, 2005 Share Posted November 3, 2005 Hello group, I was experimenting with the latest beta and tried to automate AutoCAD. One question came into mind is can AutoIt catch the event fired by the AutoCAD application? For example, whenever a drawing opening is finished, AutoCAD fire the event. With VBA or lisp, I can do something that I want to. But I have no idea if this can be done with AutoIt. Can someone enlighten me? Thanks very much for your time. Btw, AutoIt looks great, especially now with the COM support in beta. Big thanks to the developer team. -wcc Link to comment Share on other sites More sharing options...
DaleHohm Posted November 3, 2005 Share Posted November 3, 2005 Sure -- Have a look at ObjEvent in the helpfile. Dale Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl MSDN docs: InternetExplorer Object, Document Object, Overviews and Tutorials, DHTML Objects, DHTML Events, WinHttpRequest, XmlHttpRequest, Cross-Frame Scripting, Office object model Automate input type=file (Related) Alternative to _IECreateEmbedded? better: _IECreatePseudoEmbedded Better Better? IE.au3 issues with Vista - Workarounds SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble Link to comment Share on other sites More sharing options...
w0uter Posted November 3, 2005 Share Posted November 3, 2005 (edited) ObjEvent edit: stupid dale. lol. Edited November 3, 2005 by w0uter My UDF's:;mem stuff_Mem;ftp stuff_FTP ( OLD );inet stuff_INetGetSource ( OLD )_INetGetImage _INetBrowse ( Collection )_EncodeUrl_NetStat_Google;random stuff_iPixelSearch_DiceRoll Link to comment Share on other sites More sharing options...
wccppp Posted November 4, 2005 Author Share Posted November 4, 2005 Thanks to both of you, Dale & w0uter for your reply. I did some experiment and didn't get what I want. I know AutoCAD application has an EndOpen event. Here is vba example from AutoCAD help file. Public WithEvents ACADApp As AcadApplication ' Use with Application Event Examples Sub Example_AcadApplication_Events() ' This example intializes the public variable (ACADApp) which will be used ' to intercept AcadApplication Events ' ' The VBA WithEvents statement makes it possible to intercept an generic object ' with the events associated with that object. ' ' Before you will be able to trigger any of the AcadApplication events, ' you will first need to run this procedure. ' We could get the application from the ThisDocument object, but that would ' require having a drawing open, so we grab it from the system. Set ACADApp = GetObject(, "AutoCAD.Application.16") End Sub Private Sub ACADApp_EndOpen(ByVal FileName As String) ' This example intercepts an Application EndOpen event. ' ' This event is triggered when AutoCAD finishes opening a drawing. ' ' To trigger this example event: ' 1) Make sure to run the example that initializes ' the public variable (named ACADApp) linked to this event. ' ' 2) Use AutoCAD to open an existing drawing and wait until the ' operation finishes ' Use the "FileName" variable to determine which drawing file is being opened MsgBox "A drawing was just loaded from: " & FileName End Sub The AutoIt doc says ObjEvent returns either an object or a function name. So how do I know which case it is? Is it an object or a function name? I suppose in my case "EndOpen" will be returned, if the ObjEven returns a function name. If an object is returned, what would it be? Below is the code I tried. I kept getting error saying varible $event used without being declared. I don't know how to fix it. Obviously I'm doing something wrong. Any advice? Sorry for the long post. Thanks a lot. $acad = ObjCreate("AutoCAD.Application") $acad.Visible = True $acad.WindowState = 3 $acad.documents.open ("C:\Drawings\Temp\Drawing1.dwg") $event = ObjEvent($acad, "acadEvent_") $i = 0 ;;the drawing is very small so it can be opened in couple of seconds. while not (IsString($event) and $event = "EndOpen" and $i < 15) sleep(1000) $i += 1 $event = ObjEvent($acad, "acadEvent_") wend $event = "" Exit Func acadEvent_EndOpen() MsgBox (0, "AutoIt Message", "Drawing opened.") EndFunc Link to comment Share on other sites More sharing options...
DaleHohm Posted November 4, 2005 Share Posted November 4, 2005 (edited) Why are you issuing the ObjEvent _after_ doing the documents.open?Also, you use $event 4 times... which occurance is it telling you you are using it without being declared? Is it an Au3Check error or a run-time error?Regarding the return value -- it will be an object unless the first parameter is "AutoIt.Error" and you don't pass the second parameter... then the return is the name of the current error handling function (see Remarks for ObjEvent).DaleEdit: Added info on return value Edited November 4, 2005 by DaleHohm Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl MSDN docs: InternetExplorer Object, Document Object, Overviews and Tutorials, DHTML Objects, DHTML Events, WinHttpRequest, XmlHttpRequest, Cross-Frame Scripting, Office object model Automate input type=file (Related) Alternative to _IECreateEmbedded? better: _IECreatePseudoEmbedded Better Better? IE.au3 issues with Vista - Workarounds SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble Link to comment Share on other sites More sharing options...
wccppp Posted November 4, 2005 Author Share Posted November 4, 2005 Thanks Dale. It is the first one that was causing error. I actually tried adding these lines after$event = ObjEvent($acad, "acadEvent_")If Not IsDeclared ("event") then MsgBox(0,"", "$event is NOT declared") EndIfand sure enough I got the prompt message.My goal is to issue some AutoCAD commands once the drawing has been opened.The error I got was runtime error. The code starts AutoCAD and opens the drawing with no problem. I haven't tried Au3Check yet. Time to explore it. So, if the return value is an object. What is it? The AutoCAD application object? That doesn't make sense to me. Since the variable $acad is for that AutoCAD application.Thanks again.-wccWhy are you issuing the ObjEvent _after_ doing the documents.open?Also, you use $event 4 times... which occurance is it telling you you are using it without being declared? Is it an Au3Check error or a run-time error?Regarding the return value -- it will be an object unless the first parameter is "AutoIt.Error" and you don't pass the second parameter... then the return is the name of the current error handling function (see Remarks for ObjEvent).DaleEdit: Added info on return value Link to comment Share on other sites More sharing options...
DaleHohm Posted November 4, 2005 Share Posted November 4, 2005 I think you might be missing the point a bit here. $event is really not very important other than as a switch to turn the event processing off. Make certain taht you are also reading the Com Event description in the helpfile in the main section heading for Obj/COM Reference and not just what is in ObjEvent:The main line in this script is: $SinkObject=ObjEvent($RecoContext,"MYEvent_").This function takes the object $RecoContext and reroutes it's events to AutoIt functions whose names start with MYEvent_. The Object responsible for the continuous rerouting is $SinkObject. This variable does not require any further attention, unless you want to stop the events. To stop rerouting Events, just assign this variable any non-object value, e.g. $SinkObject=""What is important is that the event handling functions you are creating get called when the specified event fires in the application.Regarding $event being used before it is declared... you say it is the _first_ occurance of $event that is returning that message. That doesn't make sense unless you are also using Opt("MustDeclareVars", 1) -- otherwise using the variable on the left side of an equation is an implicit declaration. So you are either not showing all of your code or you are misinterpreting the output. So, it is helpful to reduce your code to the minimum required to demonstrate the error, but don't leave any out when you post your example. Also, please post the exact messages returned (including AutoIt version and the line numbers and exact warning or error messages) otherwise you will end up wasting a lot of time for those people who are trying to help you.Two more tips 1) it doesn't appear that you are using the SciTe editor for your code -- I highly recommend it. Using Alt-F5 to execute your code in SciTe runs it in the beta, runs Au3Check for you and routes output to the SciTe console to make sharing debug information here easy 2) please put your code examples inside a CODE block for readability. Just prior to your code, place the word CODE enclosed in square brackets and just after, place /CODE enclosed in square brackets.regards,DaleThanks Dale. It is the first one that was causing error. I actually tried adding these lines after$event = ObjEvent($acad, "acadEvent_")If Not IsDeclared ("event") then MsgBox(0,"", "$event is NOT declared") EndIfand sure enough I got the prompt message.My goal is to issue some AutoCAD commands once the drawing has been opened.The error I got was runtime error. The code starts AutoCAD and opens the drawing with no problem. I haven't tried Au3Check yet. Time to explore it. So, if the return value is an object. What is it? The AutoCAD application object? That doesn't make sense to me. Since the variable $acad is for that AutoCAD application.Thanks again.-wcc Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl MSDN docs: InternetExplorer Object, Document Object, Overviews and Tutorials, DHTML Objects, DHTML Events, WinHttpRequest, XmlHttpRequest, Cross-Frame Scripting, Office object model Automate input type=file (Related) Alternative to _IECreateEmbedded? better: _IECreatePseudoEmbedded Better Better? IE.au3 issues with Vista - Workarounds SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble Link to comment Share on other sites More sharing options...
gauravmishra Posted November 19, 2010 Share Posted November 19, 2010 (edited) Folllowing code works You need to have a instance of autocad launched before executing this script (Because i ma using ObjGet) But you can modify the code to use ObjCreate expandcollapse popup$Obj = ObjGet("","AutoCAD.Application.17") If @error Then MsgBox( 0 , "" , "Failed") Exit EndIf $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") $objevent = ObjEvent( $Obj, "MyEvent_","_DAcadApplicationEvents") If @error Then MsgBox( 0 , "" , "Event registration Failed") Exit EndIf $Obj.Documents.Open ("C:\Hello.dwg") Func MyEvent_EndOpen($EventName) MsgBox( 0 , "" , $EventName) EndFunc ; This is my custom defined error handler Func MyErrFunc() Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oMyError.description & @CRLF & _ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _ "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _ "err.source is: " & @TAB & $oMyError.source & @CRLF & _ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _ ) Local $err = $oMyError.number If $err = 0 Then $err = -1 $g_eventerror = $err ; to check for after this function returns Endfunc Edited November 19, 2010 by gauravmishra Link to comment Share on other sites More sharing options...
James Posted November 19, 2010 Share Posted November 19, 2010 Folllowing code works Congratulations You just revived a 5 year old topic. Blog - Seriously epic web hosting - Twitter - GitHub - Cachet HQ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now