Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Kann Befehl nicht finden

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:  Kann Befehl nicht finden (1283 / mal gelesen)
David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 10:17    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

Guten Tag liebes Forum,

Ich hab folgendes Problem.

Ich habe mir einen Simplen Befehl geschrieben (VBA):

Sub Tuer()

ThisDrawing.ActiveLayer = ThisDrawing.Layers("ADS_1_Tür")
ThisDrawing.SendCommand "_-Insert" & vbrCr & "Variable Tür" & vbCr

End Sub

Die dazugehörige LISP:

(defun c:vart(/) (vl-vbarun "Befehle.dvb!Modul1.Tuer")(Princ))

Unter Option habe ich dann Den Pfad bei den Supportdateien angegeben.

Jedoch kommt bei Eingabe des Befehls folgender Fehler:

Unbekannter Befehl. "Tür".

Und sagt mir das er die Tür.DWG nicht finden kann. Jedoch verweise ich dort oben doch auf den Befehl in LISP bzw VBA und nicht in eine DWG.

Danke schonmal für die Hilfe.

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

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 04. Mai. 2018 11:19    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 David F. 26 10 Unities + Antwort hilfreich

Unbekannter Befehl. "Tür"

Ich dachte dein Befehl nennt sich VART? (defun c:vart

"Und sagt mir das er die Tür.DWG nicht finden kann."

ThisDrawing.SendCommand "_-Insert" & vbrCr & "Variable Tür" & vbCr

Damit sendest du String(s) in die Befehlszeile, identisch zu der Handeingabe [i](wobei Acad jedoch die Automation erkennt und einige Dinge in dem Fall anders ablaufen)

Puh, wo fängt man an.
Das ACAD nach TÜR sucht ist zunächst mit (d)einem Schreibfehler? zu erklären,
du hast nachdem _-INSERT vbrCr geschrieben, ändere dies in vbCr.


Öffne dein AutoCAD, gebe ein:
VBASTMT<enter>ThisDrawing.SendCommand "_-Insert" & vbCr & "Variable Tür" & vbCr<enter>

Die Meldung wird nun etwas anders aussehen:
Befehl: _-Insert
Blocknamen eingeben oder [?]: Variable Tür
*Ungültig*

Der aktuelle Befehl -INSERT fragt nach dem Blocknamen, du sendest "Variable Tür".
Diesen Block wird ACAD nicht finden weil dieser weder in der aktuellen Datei definiert ist, noch
eine DWG mit diesem Nammen in den Supportpfaden liegt, welche als Block eingefügt werden könnte.

Zudem solltest du noch etas mehr in die Befehlszeile senden, der Befehl benötigt schon etwas mehr wie nur einen Blocknamen. Stelle sicher dass es einen Block in der Datei gibt,
gebe ein:
_-INSERT<enter>
MeinBlockname<enter>
und folge dem Ablauf (Randnotiz: Dieser ist nicht immer gleich und hängt von der Blockdefinition und weiteren Dingen ab)


[i"]Jedoch verweise ich dort oben doch auf den Befehl in LISP bzw VBA und nicht in eine DWG."[/i]
An der Stelle an der Acad den Blocknamen haben möchte verweist du auf überhaupt nichts,
du sendest den String "Variable Tür" .PUNKT
Da an dieser Stelle die Informationen fehlt was du dir bei "Variable Tür" gedacht hast, was es damit auf sich hat, kann ich schlecht helfen.
Da ein Leerzeichen enthalten ist kann es sich auch nicht um eine Variable handeln, also?

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

David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 11:31    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 cadffm,

das es die Tür.DWG nicht gibt ist soweit richtig. Diese Info hätte vielleicht etwas Text erspart.

Es gibt eine DWG mit dem Namen Blockbibliothek.DWG. Darin befindet sich unter anderem ein Block welcher "Variable Tür" heißt.

In der Datei Blockbibliothek.DWG für er natürlich den Block ohne zu zögern ein.

In allen anderen sucht er vergeblich die tür.DWG.


Ist es dann ein vernünftiger Lösungsansatz den genauen Pfad einzugeben oder ist es sicherer/einfach dies auf andere Weise zu lösen?


Vielen Dank für die Hilfe

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

David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 11: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

Okay ich habe es jetzt genauer angegeben.

Da die Block_Bibliothek.DWG im supportpfad ist reicht im dieser Befehl:

ThisDrawing.SendCommand "_-Insert" & vbCr & "Block_Bibliothek.dwg\Variable Tür" & vbCr

Danke für die Anregung hast mir mal wieder sehr geholfen.

Gut macht er jetzt auch nicht mehr. Ich steh grad aufm schlauch und weiß nicht wie ich ihm sage das die Tür in der DWG ist und nicht die Tür die DWG ist

[Diese Nachricht wurde von David F. 26 am 04. Mai. 2018 editiert.]

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

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 04. Mai. 2018 11:51    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 David F. 26 10 Unities + Antwort hilfreich

Der Befehl -EINFÜGE oder besser international _-INSERT und noch besser zwingend der Originalbefehl _.-INSERT kann nicht
auf interne Blockdefinitionen aus externen Dateien zugreifen.

Das hat aber nichts mit VBA zutun, wenn du den Autocadbefehl verwenden willst bist du auf dessen Möglichkeiten eingeschränkt.

Natürlich könnte man die ganze Biblio als Blockeinfügen, damit import man alle noch nicht vorhandenen Blöcke und danach könnte man eine Blockreferenz des gewünschten einfügen.

Aber mal angenommen du hättest eine DWG "variable Tür.dwg" welche als Blockdefinition dient:
Ob ganzer Pfad oder nur Blockname hängt vom Konzept ab, du hast diesbezüglich keines, also wäre die Antwort zunächst: Ganzer Pfad.

2 Dinge:
Wenn es unbedingt eine Bibliothek.dwg sein soll, macht INSERT dann Sinn?
Falls du es mal mit einer DWG als Block testen willst: Öffne die Biblio, exportiere den Block als DWG. Nutze dazu den Befehl WBLOCK und die Otion BLOCK. Teste es nun mit dieser DWG
Falls INSERT nicht der Weg ist der Sinn macht: Dann wird es aufwändig und du brauchst einen anderen Weg die Blockdefinition zu importieren, anschließend eine Blockreferenz zu erstellen, ab hier fängt das programmieren an 

[Diese Nachricht wurde von cadffm am 04. Mai. 2018 editiert.]

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

David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 12:00    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

Ich nehme mal an du könntest diesen anderen Weg sogar erklären?

Denn ich würde ungern jeden einzelnen Block exportieren um ihn per Befehl einfügen zu können.
Es wäre interessant mal zu sehen wie so etwas aussieht. Also falls du zufällig gerade etwas im Kopf vorschweben hast, lass es mich wissen. :P

Ansonsten noch einmal ein Danke für die ausführliche Erklärung 

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

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 04. Mai. 2018 12:03    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 David F. 26 10 Unities + Antwort hilfreich

Die zweite Sache vergessen: Aufgrund des Blocknamens mal nachgefragt
Was hast du damit noch vor?
Ist es ein dynamischer Block?

Wie fit bist du denn in VBA oder der Recherche nach benötigten Infos zu den Objekten/Methoden?

Es gibt wirklich alle Infos im Netz und der Hilfe zur Programmierung in ACAD, nur das Objektmodell und VBA selbst gleichzeitig lernen ist nicht so leicht (meine Meinung).
Wenn man dann noch wenig Ahnung von Acad hat ist es eine Mamutaufgabe.

Nur mal so nachgehakt..

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

David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 12:08    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

Also VBA mache ich schon eine weile jedoch nicht in AutoCAD. Das habe ich jetzt neu "Angefangen". In AutoCAD habe ich bis jetzt nur gezeichnet. Und dann mit der Werkzeugpalette angefangen, was mir allerdings irgendwann zu eingeschränkt wurde.

Ja es ist ein Dynamischer Block.
Da ich Bauzeichner bin brauche ich diese Tür sehr oft  Natürlich könnte ich sie auch einfach jedes mal Kopieren und so weiter aber das ist nicht mein Ziel.

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

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 04. Mai. 2018 12:16    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 David F. 26 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von David F. 26:
Ich nehme mal an du könntest diesen anderen Weg sogar erklären?

Könnte ich bestimmt, irgendwie, aber ich bin kein VBAler und ich hasse es einfach
nur einen Weg zu zeigen ohne das Dutzend an wichtigen Randinformationen mitzugeben,
letzteres kostet mir aber zuviel Zeit für deinen jetzigen Stand.
Also nur kurz:

Zwei Wege:

Die Biblio.dwg "richtig" öffnen, die Blockdefinition aus dieser Datei in eine andere(zB. die aktuelle DWG) kopieren,
anschließend die Blockreferenz erstellen.

Der zweite Weg funktioniert im Ablauf genauso, jedoch verwendet man eine Technik welche
direkt auf die DWG zugreifen kann ohne diese normal zu öffnen(Der schnelle elegante Weg).
http://ww3.cad.de/foren/ubb/Forum259/HTML/000664.shtml

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

David F. 26
Mitglied



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

Beiträge: 20
Registriert: 03.05.2018

AUTOCAD 2018

erstellt am: 04. Mai. 2018 12:22    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

Ich hätte nie von dir erwartet einfach nur etwas für mich dahin zu klatschen und ich profitiere davon dann.
Ich wollte dabei schon was lernen.
Den zweiten Weg werde ich wahrscheinlich übernehmen.

Also nochmals danke dafür.

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

Various: systems, Operating systems, cad systems, cad versions, programming languages.

erstellt am: 13. Mai. 2018 06:22    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 David F. 26 10 Unities + Antwort hilfreich

Falscher Ansatz lieber Kollege 

Also entweder Lispeln wir oder wir machen VBA.

Klar kann man das mixen, was aber zur allgemeinen Freude weit mehr sonderbare Randprobleme verurscht als das einmal komplett
sauber durchzuziehen (Falls möglich manche Sachen gibt es nur in LISP manche nur In VBA etc und als letzten Ausweg gibt es den Mix oder gar ne VB.NET lib).

Das Sendcommanden und lispeln ist auch äußerst langsam.

Es gibt ausnahmen. Sowas macht Sinn wenn der angestoßene Befehl nativ im Autocad in C programmiert wurde.
Ich habe mal ne reload alle xrefs routine in VBA geschrieben. Klar funzt die.
Ist aber logischerweise gemessen an dem was man mit sendcommand absetzt (ein befehl) langsam.
Das macht Autoacad intern mit C++ Da brauche ich nicht nachzudenken warum das fix ist.
Andrerseits Vorteil meiner Routine die bricht nicht einfach ab. Solange die was findet reloadet die.
KLar habe ich beide Varianten im Repartoire.
Aber das nur am Rande.

Ich verweise "nur am Rand darauf das" ich einige ziemlich umfangreiche Blockbibliotheken hier hochgeladen und der Allgemeinheit zur Verfügung gestellt habe.
Da gibt es auch ne Isch dich machen Block inne Zeichnung Routine  (Und so ziemlich alles was man über das bearbeiten von Blöcken nieh wissen wollte  umbenennen löschen Entitys addieren etc).

Diese untenstehende Routine fügt einen Block in einen Block ein. (Die ist dort auch in der Bibliothek)
Woabei man wissen sollt edas der Modelspace oder paperspace auch nur ein Block ist.
WWenn man den Targetblock weg lässt wirds der modelspace
Der erste Parameter ist der Koordinatenpunkt wo eingefügt werden soll.
Als Variant weil einige ACAD Befehle koordinaten in einem variant zurückgeben Block insert aber ein Array von DOUBLE haben will. Ist also egal wie man das serviert.
Der nächste Parameter ist der Name des Blockes der als Referenz eingefügt werden soll.
Der Rest ist skalieren und rotieren.

So und nun must du nicht mehr lispeln und sendcommanden (das macht man am besten nur im alleräußersten Notfalle wenn gar nix andres mehr geht)
Routine benutzen und nicht weiter rätseln 

Zurückgegeben wird übrigens die frisch eingefügte Blockreferenz.
Der Block muss in der Zeichnung bereits vorhanden sein.
Blöcke aus anderen Zeichnungen zu mopsen und einzufügen oder von einer Datei einzufügen siehe Bibliothek 

Lieben Gruß
Thomas


Function block_insert(varPnt, strname, Optional dblScalex As Double = 1, Optional dblScaley As Double = 1, Optional dblScalez As Double = 1, Optional Angle As Double = 0, Optional TargetBlock As String = "") As AcadBlockReference
    Set block_insert = Nothing
    Dim blo As AcadBlockReference
    If strname = "" Then Exit Function
    Dim P(2) As Double


    On Error Resume Next
    P(0) = CDbl(varPnt(0))
    P(1) = CDbl(varPnt(1))
    P(2) = CDbl(varPnt(2))
    On Error GoTo 0

    Dim testb As AcadBlock
    On Error Resume Next
    Set testb = Nothing
    ERR.Clear
    Set testb = thisdrawing.BLOCKS.ITEM(strname)
    If (testb Is Nothing Or ERR.Number <> 0) Then
        Dim S As String
        S = strname
        If block_copy_db_definition(S, func_stdlib) = False Then



            ''debug.print  strName, " BLOCK not found !!! "
            Call say(strname & " BLOCK not found or interface error !!! ")
           
            strname = ""
            ERR.Clear
            Exit Function
        End If
    End If

    Dim OBJECTSPACE As AcadBlock
   
    If TargetBlock = "" Then
        Set OBJECTSPACE = RFSPACE
    Else
        Set OBJECTSPACE = thisdrawing.BLOCKS.ITEM(TargetBlock)
    End If
   
    Set blo = OBJECTSPACE.InsertBlock(P, strname, dblScalex, dblScaley, dblScalez, Angle)

 
    dwgunits = S2D(thisdrawing.GetVariable("INSUNITS"))

    '    ''debug.print  err.DESCRIPTION
    bu = blo.Insunits
    '  ''debug.print  bu
   
    If bu <> dwgunits Then
        Dim SC As String
        If dwgunits = 6 And bu = "Millimeters" Then SC = "0.001" 'dwg meter, blo mm
        If dwgunits = 4 And bu = "Meters" Then SC = "1000" 'dwg mm ,blo meter
        On Error GoTo 0
        If Trim(SC) <> "" Then
            Call blo.ScaleEntity(P, val(SC))
        End If
   
    End If
    Set block_insert = blo
   
    On Error GoTo 0
End Function

------------------
Wer es nicht versucht, hat schon verlorn 
Und bei 3 Typos gibts den vierten gratis !
<<< for sale !

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