Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  AutoCAD Event von VB6 aus abfragen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  AutoCAD Event von VB6 aus abfragen (1348 mal gelesen)
Huebi
Mitglied
Vermessungsing.


Sehen Sie sich das Profil von Huebi an!   Senden Sie eine Private Message an Huebi  Schreiben Sie einen Gästebucheintrag für Huebi

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 22. Okt. 2009 18:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo liebe VBA-ler,

ich bin gerade dabei ein paar VBA-Progrämmchen auf VB6 umzustricken und dabei auf das Problem gestoßen, dass ich AutoCAD-Events (in diesem Fall das Event "AcadDocument_EndCommand") zugreifen muss.

Ich bin noch nicht besonders fit mit VB und daher frage ich Euch hier, wie das funktionieren könnte.

Für sachdienliche Hinweise, wäre ich sehr dankbar!

Der Hübi :-)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 22. Okt. 2009 18:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

wenn Du mit VB6 arbeitest, dann hast Du über 'CreateObject' oder 'GetObject' eine Verbindung zur AutoCAD-Application, in dieser gibt's eine Collection of Documents und an jedes kannst Du Dich dranhängen.

Wie das aber jetzt in Deinen bestehenden Code hineinpasst, kann wohl effizienter beschrieben werden, wenn Du den Teil herzeigst, wo Du's brauchst.

- alfred -

------------------
www.hollaus.at

Huebi
Mitglied
Vermessungsing.


Sehen Sie sich das Profil von Huebi an!   Senden Sie eine Private Message an Huebi  Schreiben Sie einen Gästebucheintrag für Huebi

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 23. Okt. 2009 07:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,
Hallo alle anderen,

ja dann stell ich hier mal ein Fragment des Programmes ein. Der Sinn der Sache ist der, dass ich von einer externen Schnittstelle Daten einlesen möchte und anhand dieser Daten in AutoCAD neue Elemente erzeuge.
Da die Daten jedoch "reinkommen" ohne darauf Rücksicht zu nehmen, ob in AutoCAD gerade ein Befehl ausgeführt wird oder nicht, möchte ich eben abfragen, ob AutoCAD für das Ausführen eines Befehles "bereit" ist (in diesem Fall wird's der Befehl InsertBlock sein).

Ich hab's mal auf ganz simpel umgestrickt. Unter VB6 eine Form angelegt und dort einen CommandButton gelegt.
Gemäß dem Fall, in AutoCAD wird gerade ein Befhel ausgeführt, soll der Zählen für AnzahlKlicks hochgezählt werden und sobald AutoCAD "frei" ist, soll eine Messagebox gestartet werden.
Die AutoCAD-Applikation hab ich sehr *hmmm* frei definiert. Ich möchte mich ungern auf eine AutoCAD-Version festlegen und denke, dass das auch so klappen sollte (hat's zumindest bei allen vorher umgestrickten Progrämmchen).

Code:

Option Explicit

Public Acad_App As Object
Public AcadName As String
Public ThisDrawing As Variant
Public AnzKlicks As Integer

Private Sub Command1_Click()
  AnzKlicks = AnzKlicks + 1
End Sub

Private Sub Form_Load()

  AnzKlicks = 0
 
  'AutoCAD öffnen
  On Error Resume Next
  Set Acad_App = GetObject(, "AutoCAD.Application")
  If Acad_App Is Nothing Then
    MsgBox ("Bitte erst AutoCAD Starten! ")
    'Set Acad_App = CreateObject("AutoCAD.Application")
  End If
  Acad_App.Visible = True
  Set ThisDrawing = Acad_App.ActiveDocument
  AcadName = Acad_App.Caption
  AppActivate AcadName
  On Error GoTo 0

End Sub

'Hier der Versuch, das Event "EndCommand" von AutoCAD einzubauen
Public Event Acad_App_EndCommand()
  MsgBox ("Sie haben während AutoCAD aktiv war " & AnzKlicks & " geklickt")
End Sub


Ich hoffe, dass ich mein Anliegen verständlich derlegen konnte und hoffe, dass ihr mir weiterhelfen könnt.

Liebe Grüße vom Hübi!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 23. Okt. 2009 07:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Huebi 10 Unities + Antwort hilfreich

frag doch in acad die sysvar CMDACTIVE ab ...

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Huebi
Mitglied
Vermessungsing.


Sehen Sie sich das Profil von Huebi an!   Senden Sie eine Private Message an Huebi  Schreiben Sie einen Gästebucheintrag für Huebi

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 23. Okt. 2009 07:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Thomas,

ja das wäre sicher auch möglich. Dazu müsste ich allerdings ständig die Systemvariable abfragen - und ob das während eines "laufenden" Befehls in AutoCAD geht, weiß ich auch nicht (ich geb's zu, ich hab's auch nicht ausprobiert).
Es gibt ja diesen eleganten Weg in VBA, das Event abzufangen. Das ist auch genau das, was ich gerne machen möchte. Nur leider sind meine Kenntnisse in VB nicht gross genug, um das "einfach" umzusetzen, was in VBA ja schon prima funktioniert.

Liebe Grüße
Hübi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 23. Okt. 2009 08:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

einerseits sehe ich, dass Du einer Variable 'ThisDrawing' das aktuelle Doc zugeordnet hast, aber dann gibt's 2 Varianten, erstere mit Handycaps:

a) ich sehe nicht, wo 'ThisDrawing' deklariert ist und nicht ob dieses mit 'WithEvents' deklariert wurde. Daher sollte zur Eventsüberwachung des Documents (das war ja die erste Frage) das angeführt sein:

Code:
Private WithEvents ThisDrawing as AcadDocument

Hier hast Du aber auch die Aufgabe, zu überwachen, ob ein der Anwender ev. ein anderes Document geöffnet hat - oder ein anderes aktiviert hat (weil mehrere geöffnet), bzw. Dein 'ThisDrawing'-Objekt mittlerweile geschlossen hat, ...


b) gibt es eine Statusabfrage, aus der abgeleitet werden kann, ob AutoCAD aktiv ist, die State-Deklaration muss irgendwo bei der Applikationsinitialisierung stehen:

Code:
'im Header der Deklarationen:
Private pState as AcadState

'im Code, wo Du dich mit AutoCAD verbindest:
Set pState = Acad_App.GetAcadState

'und bevor Du eine Funktion aus dem externen Exe heraus im AutoCAD anstarten willst, kannst Du dann prüfen, ob AutoCAD gerade 'behindert' ist, soll heissen, nicht ansprechbar, weil Befehl aktiv, oder weil (modaler) Dialog geöffnet, oder ....:
If pState.IsQuiescent Then
   'wenn das True retourniert, dann darfst Du ;)



HTH, - alfred -

------------------
www.hollaus.at

[Diese Nachricht wurde von a.n. am 23. Okt. 2009 editiert.]

Huebi
Mitglied
Vermessungsing.


Sehen Sie sich das Profil von Huebi an!   Senden Sie eine Private Message an Huebi  Schreiben Sie einen Gästebucheintrag für Huebi

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 23. Okt. 2009 12:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Herzlichen Dank Alfred!

Das war's! Und treffsicher und genau erkannt um was es mir geht!

10 Us sind schon unterwegs! 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz