| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Access -> AutoCAD (5560 mal gelesen)
|
mahe01 Mitglied
Beiträge: 10 Registriert: 03.11.2005 ACAD 2000 Microstation 7 ORACLE 8.7.1 GIS-Software Access etwas SQL
|
erstellt am: 03. Nov. 2005 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, bin neu hier (was VBA betrifft), ansonsten kenn ich mich mit AutoCAD recht gut aus, aber mit den Programmieren.... Vielleicht kann mir jemand helfen, hab's zwar selber schon probiert, aber noch noch nicht geschaft (erklär ich unten). Ich habe in einer Tabelle Koordinaten und Punktnummern, und möchte zwei Wege ausprobieren, jeweils von einen Button aus in einen Formular möchte ich: 1. Zomm auf Koordinate Einfach auf Button klicken, und in die aktive Zeichnung Zommen (Koordinaten x, y liegen in Tabelle "Koo". Aktive Zeichnung: es soll keine neue Zeichnung aufgemacht werden. (warum erklär ich unten) 2. Es gibt einen Befehl (zeige ....) für AutoCAD mit Parameter (von Fremdanbieter für AutoCAD, Eingabe über Befehlszeile, hier ein Beispiel: zeige "8742" "758" "15236" 20 0 Daten liegen in Tabelle "Quelle") der genau dieses macht, aber ich brauche dazu nicht die Koordinaten, da hier die Punktnummer (15236) reicht (das andere sind notwendige Attributen) Im Prinzip dürfte doch beides das gleich sein: -> Button in access-Formular drücken -> Ereignisprozedur "Beim Klicken" in Codegenerator VBA-Befehle -> Text in Befehlszeile von AutoCAD -> Befehl ausführen (ob "Zoom" oder "zeige" egal, beides AutoCAD-Befehle) Folgendes habe ich probiert: mit shell ..... Problem: es wir immer eine neue Zeichnung aufgemacht, mehr schaffe ich noch nicht (also zommen oder zeige, und vor allem die Parameter: SYNTAX ist mir unbekannt) Außerdem: in der aktiven Zeichnung sind die LEemente schon vorhanden, deshalb brauch nichts gezeichnet werden, also nur zoom. Aber: shell ist wahrscheinlich nicht geeignet ;-(
Ein weiteres Problem wäre dann: Was ist die aktive Zeichnung (Manchmal sind mehrere AutoCAD-Sitzungen offen). Falls diese Lösung im Moment zu kompliziert ist, wäre ich mit 1. und 2. schon zufrieden. Ich darf halt dann nur eine Zeichnung offen haben. (Diese Zeichnung hat aber immer den Namen "Bestand.dwg", falls das weiterhelfen würde.) Ich hab schon die Such-Funktion genutzt, hat mir aber auch nicht geholfen. Ein Link mit der Lösung würde mir auch schon reichen.
Vielen Dank im voraus.
Gruß Markus H. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 03. Nov. 2005 18:21 <-- editieren / zitieren --> Unities abgeben: Nur für mahe01
Hallo Markus, das mit dem Zugriff von Access nach AutoCAD ist eigentlich kein Problem. Wenn du mit Access VBA gearbeitet hast, kennst du sicherlich auch einen Teil des Access Objektmodelles. Ähnlich hat AutoCAD auch ein Objektmodell. Mit dessen Methoden und Eigenschaften hast du (fast) Zugriff auf alle Zeichnungselemente einer Zeichnung und auf das Programm. An deiner Stelle würd ich erst mal einige Versuche im AutoCAD VBA machen. Von der Befehlszeile VBAIDE und los gehts. Wenn du dort die Hilfe für die ActiveX Automation aufrufst, solltest du einige Beispiele finden. Zusätzlich ist hier ein Diagramm über die Objektklassen von AutoCAD enthalten. Wenn du es gleich mit Access probieren willst, legst du die am besten ein Modul im Codeeditor an. Unter Extras/ Verweise stellst du einen Verweis auf "AutoCAD 200x Typenbiliothek" ein. Dann hast du Zugriff auf das AutoCAD Objektmodel. Im Gegensatz zum VBA in AutoCAD musst du das Objekt von AutoCAD mit der Zeichnung "holen" Z.B.
Code:
Public obj_ACAD_app As Object ' Applikation Public obj_ACAD_doc As Object ' Zeichnung (ActiveDocument = Thisdrawing) On Error resume Next Set obj_ACAD_app = GetObject(, "AutoCAD.application") if err.number<>0 then msgbox "AutoCAD nicht gefunden" exit function end if set obj_acad_doc = obj_acad_app.activedocument ' oder set Thisdrawing = obj_acad_app.activedocument
Zum Zoomen kannst du auf das Application Objekt zugreifenHab leider keine Zeit mehr . Später gehts weiter Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mahe01 Mitglied
Beiträge: 10 Registriert: 03.11.2005 ACAD 2000 Microstation 7 ORACLE 8.7.1 GIS-Software Access etwas SQL
|
erstellt am: 04. Nov. 2005 09:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli, das ging ja FIX, Danke vorerst mal. Aber mit VBA/Access hab ich bis jetzt nur "einfache" Dinge gemacht, wo ich nur ein oder zwei Befehle benötigte, und die Syntax recht einfach waren. (Bsp: Klick auf Button -> addiere Feld1 + Feld2). "Teil des Access Objektmodelles" kenn ich leider nicht (kann mir aber vorstellen was das ist: VBA-Teil speziell für ACAD?). Ich benutze noch ein anderes Datenbankprogramm auf den PocketPC (SprintDB, super Programm übrigens), bei diesen Programm muß man sich um die Syntax keine Sorgen machen, da hier alles über Dialogboxen gemacht wir (die Befehle sind selbsterklären "MsgBox", die zulässigen Attribute / Werte können über Pulldown-Menüs ausgesucht werden oder einfache Werte eingeben). Den Rest (Syntax) macht das Programm. Klar, das dieses "VBA" nicht so "mächtig" ist, aber mir hat's bisher immer recht gut geholfen. So etwas (ein Tool,...) habe ich auch schon für Access gesucht, aber vergeblich, denn dann könnte ich mir vieles herleiten. Zurück zum Problem: und ich dachte das wäre "ähnlich einfach": -> einfach den Tipp von hier in Zwischenablage, -> in Codeeditor: Ereignis/Nach Klick -> fertig (natürlich mit Anpassungen, z. B. andere Befehle mal ausprobieren,...) Ich werd mal Versuchen die Befehle die du mir aufgeschrieben hast zu interpretieren und was diese genau machen (ich hab da so ein Buch, "21 Tage VBA", damit ich mal die Grundkenntnisse lerne, hätte gedacht ich kann das noch auf die etwas rauszögern bis ich so ein Tool finde). Mir ist nur nicht klar, wo ich deine Befehle einfügen soll: - in access VBA - oder ACAD VBA Ich bräuchte sie ja für den "Button"-Befehl. Ich werd mir deinen Tipp aber trotdem zu Herzen nehmen, denn man lernt NIE aus. Danke nochmal. Gruß Markus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 04. Nov. 2005 20:09 <-- editieren / zitieren --> Unities abgeben: Nur für mahe01
Hallo Markus, das "VBA Teil" siehst du wenn du im AutoCAD VBAIDE eingibst. In Access hast du ähnlich Code der in Modulen steht (diese kannst du dir beliebig anlegen) und Code der an den Formularen hängt. In den Modulen hast du den Code der überall gilt.
Code:
Public Function GetAcad() As Boolean ' *** AutoCAD Objekt eines geladenen AutoCADs holen ' Fehlerbehandlung ein On Error Resume Next ' Versuch das AutoCAD Objekt auf das Objekt AcadApp zuzuweisen Set AcadApp = GetObject(, "AutoCAD.Application") ' Ist ein Fehler aufgetreten If Err.Number = 0 Then ' Nein alles OK GetAcad = True Else ' Fehler: kein Objekt gefunden GetAcad = False End If End Function
Im Formular hast du den Code der auf irgendwelche Ereignisse (Klick auf Button oder so) abgearbeitet werden soll.
Code:
Private Sub BT_zeichnen_Click() Dim Punkt(0 To 2) As Double ' Microsoft DAO 3.51 .... unter Verweisen einbinden !!! Dim rs As DAO.Recordset' AutoCAD Verweis muss angegeben sein !! Dim AcadPunkt As AcadPoint ' Prüfen ob Zeichnung zur verfügung steht If Not GetDrawing Then MsgBox "AutoCAD steht nicht zur Verfügung", vbCritical Exit Sub End If ' Sanduhr Screen.MousePointer = 11 ' Recordset aus dem Formular holen Set rs = Me.RecordsetClone ' Gibts was in der Tabelle/Ansicht If rs.RecordCount > 0 Then ' Geh auf ersten rs.MoveFirst ' Durchlaufe alle Datensätze While Not rs.EOF ' Hole die Koordinate Punkt(0) = rs.Fields("Rechtswert").Value Punkt(1) = rs.Fields("Hochwert").Value Punkt(2) = rs.Fields("Höhe").Value ' Zeichne einen Punkt in AutoCAD Set AcadPunkt = Thisdrawing.ModelSpace.AddPoint(Punkt) ' Eigenschaften setzen AcadPunkt.Color = acBlue ' Layer muss vorhanden sein, eventuell vorher prüfen AcadPunkt.Layer = "0" ' Sichtbar machen AcadPunkt.Update rs.MoveNext Wend End If ' Alles Klar ' Kopie des Recordsets in den Eimer Set rs = Nothing ' Auf Grenzen zoomen Thisdrawing.Application.ZoomExtents ' ist gleich mit AcadApp.ZoomAll ' Normal Screen.MousePointer = 0 End Sub
Im Anhang hast du eine Beispiel MDB Stelli
------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mahe01 Mitglied
Beiträge: 10 Registriert: 03.11.2005 ACAD 2000 Microstation 7 ORACLE 8.7.1 GIS-Software Access etwas SQL
|
erstellt am: 07. Nov. 2005 12:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli, ICH BIN BEGEISTERT, es funktioniert, vielen Dank. Kann man hier Bewertungen abgeben (ich hab mit Forums-Dingen nicht viel Erfahrung). Mit den Klassenmodulen (also für Formulare) und den "allg. Modulen" hast du gut erklärt, für den Einstieg hilft mir das auch weiter. Und das du die Verweise im VBA-Script erwähnt hast war auch Klasse.
Ein paar Kleinigkeiten hätte ich noch, vielleicht kannst du nochmal 5 Minuten opfern:
1. Ich möchte, daß nach dem "Zoom" oder "Zeichnen" mit deinen Button dieses ACAD-Fenster in den Vordergund gestellt wird (ich muß immer erst in die Taskleiste...), ich hab's natürlich probiert, finde aber die richtigen Befehle nicht, oder wende sie falsch an:
a) zuerst mit "AcadApplikation = true" es kommt keine Fehlermeldung aber es passiert auch nichts b) "ApplActivate": hab ich nicht hinbekommen. Vielleicht gibt es noch eine andere Möglichkeit? Probiert habe ich die Befehle bei den Klassenmodule, nach der letzten Befehlsfolge (also z. B. nach zoomen).
2. Wenn ich bei den - "Allgemeinen Modulen" eine Variable definiert habe (Befehl: "Public AcadApp As AcadApplication"?), gilt diese dann auch in - Klassenmodule (Befehl: "Dim rs As DAO.Recordset"?)?
(denn bei 1a) war ich mir da nicht sicher. Bin ich richtig mit den Befehlen der Variablendefinition?
3. Wenn's nicht zu kompliziert wird: Wir haben einen AutoCAD-Aufsatz (Fremdhersteller, arx-Datei) die Befehle für die Eingabeaufforderung bereitstellen (genauso wie AutoCAD-Befehle). (die meisten dürften irgendetwas mit lisp zu tun haben)
Ich möchte diese einfach per VBA an ACAD übergeben, der Befehl lautet ZEIGE mit den Parametern "TAB" "TEST" "30905" 1 0 an der Eingabeaufforderung gebe ich also normalerweise folgendes ein: ZEIGE "TAB" "TEST" "30905" 1 0 Ist der Befehl "Thisdrawing.Application.ZEIGE "TAB" "TEST" "30905" 1 0 dann richtig? (in den Anführungsstriche stehen Text-Felder, die anderen sind num. Werte) Ich möchte dann auch später noch ander Befehle nutzen (auch normale AutoCAD-Befehel wie z. B. Block einfügen, und dazu brauche ich ein "Grundgerüst" bzw. einen Denkanstoß.
4. Anpassungen der Variablen-Namen Ich muß jetzt nur noch deine Variablen-Namen an meine anpassen (Daten liegen eigentlich in einer ORACLE-Datenbank, ich benutze ACCESS eigentlich nur als "Viewer", da ich hier Formulare besser anpassen kann), eigentlich kein Problem, aber ich bin mir bei einer Variable nicht ganz sicher:
Dim Punkt(0 To 2) As Double Der Namen der Variable ist doch "Punkt(0 To 2)", daß "(0 To 2)" bedeutet nicht einen Parameter für den Datentyp Double? 5. Für was genau ist die Spalte "VA" in deiner Tabelle gedacht? (als Block, der eingefügt werden soll?) Danke im voraus nochmal, Bewertung bekommst du auf jeden Fall (wenn's die Möglichkeit gibt). Hier würden mir "ja/nein"-Antworten reichen, ich möchte dich nicht noch länger "nerven". Gruß Markus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 07. Nov. 2005 16:40 <-- editieren / zitieren --> Unities abgeben: Nur für mahe01
Hallo, Zitat: Original erstellt von mahe01: Hallo Stelli, ICH BIN BEGEISTERT, es funktioniert, vielen Dank.Kann man hier Bewertungen abgeben (ich hab mit Forums-Dingen nicht viel Erfahrung).
Ja mit den Bewertungen kannst du letztendlich angeben ob dir eine Antwort auf deine oder eine andere Frage weitergeholfen hat (Scala 1 bis 10). In der Kopfzeile der Antwort hast du die Felder 1-10. Einfach drücken, fertig. Zitat:
1. Ich möchte, daß nach dem "Zoom" oder "Zeichnen" mit deinen Button dieses ACAD-Fenster in den Vordergund gestellt wird (ich muß immer erst in die Taskleiste...), ich hab's natürlich probiert, finde aber die richtigen Befehle nicht, oder wende sie falsch an: a) zuerst mit "AcadApplikation = true" es kommt keine Fehlermeldung aber es passiert auch nichts b) "ApplActivate": hab ich nicht hinbekommen.
a) kann nicht gehen b) AppActivate Titel= Caption des Programms AppActivate Thisdrawing.Application.caption Zitat:
2. Wenn ich bei den - "Allgemeinen Modulen" eine Variable definiert habe (Befehl: "Public AcadApp As AcadApplication"?), gilt diese dann auch in - Klassenmodule (Befehl: "Dim rs As DAO.Recordset"?)?
Wird die Variable in einem Modul mit Public deklariert, gilt sie in allen Modulen, und Formularen des Projektes. Wird die Variable mit DIM in einem Formular aber ausserhalb einer Prozedur deklariert, gilt sie in dem ganzen Modul, wird sie innerhalb einer Prozedur mit DIm Deklariert gilt sie nur innerhalb der Prozedur. Um ein wenig Ordnung in Lokal und Global zu haben kannst du vor die Variable ein Prefix stellen. vlst_Variable = variable lokal string vgst_Variable = variable global string Zitat:
3. Wenn's nicht zu kompliziert wird: Wir haben einen AutoCAD-Aufsatz (Fremdhersteller, arx-Datei) die Befehle für die Eingabeaufforderung bereitstellen (genauso wie AutoCAD-Befehle). (die meisten dürften irgendetwas mit lisp zu tun haben) Ich möchte diese einfach per VBA an ACAD übergeben, der Befehl lautet ZEIGE mit den Parametern "TAB" "TEST" "30905" 1 0 an der Eingabeaufforderung gebe ich also normalerweise folgendes ein: ZEIGE "TAB" "TEST" "30905" 1 0
Welcher Aufsatz ist es denn ? und auf welchem AutoCAD ? Du sollest in deinem Profil deine Software angeben um nicht immer alles schreiben zu müssen. Einen AutoCAD Befehl aus VB kannt du mit Thisdrawing.Sendcommand "Kommando" ausführen Du sollest aber vorher immer schauen ob du nicht mit den Methoden der ActiveX Schnittstelle deine Funktion ausführen kannst (Zoomen etc.) Zitat:
Ich möchte dann auch später noch ander Befehle nutzen (auch normale AutoCAD-Befehel wie z. B. Block einfügen, und dazu brauche ich ein "Grundgerüst" bzw. einen Denkanstoß.
Block fügt man so ein: Thisdrawing.modelspace.insertBlock ( ....) Zitat:
4. Anpassungen der Variablen-Namen Ich muß jetzt nur noch deine Variablen-Namen an meine anpassen (Daten liegen eigentlich in einer ORACLE-Datenbank, ich benutze ACCESS eigentlich nur als "Viewer", da ich hier Formulare besser anpassen kann), eigentlich kein Problem, aber ich bin mir bei einer Variable nicht ganz sicher: Dim Punkt(0 To 2) As Double Der Namen der Variable ist doch "Punkt(0 To 2)", daß "(0 To 2)" bedeutet nicht einen Parameter für den Datentyp Double?
Du liegst falsch. Es handelt sich um ein Array (Datenfeld), also quasi eine Auflistung. "Punkt" der Name, "0" als unter Begrenzung des Index, "2" als obere. Also hast du einen Punkt mit drei Feldern Punkt(0)=Rechtswert Punkt(1)=Hochwert Punkt(2)=Höhe Zitat:
5. Für was genau ist die Spalte "VA" in deiner Tabelle gedacht? (als Block, der eingefügt werden soll?)
Ja ist für einen Block, könnte auch noch Layer etc. stehen. Überigens wenn du mit Oracle Arbeitest sollest du dir überlegen von wo nach wo du arbeiten willst. Bleib zunächst mal auf der vertrauten Acecss Datenbank und arbeite dich ein. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mahe01 Mitglied
Beiträge: 10 Registriert: 03.11.2005 ACAD 2000 Microstation 7 ORACLE 8.7.1 GIS-Software Access etwas SQL
|
erstellt am: 08. Nov. 2005 08:30 <-- editieren / zitieren --> Unities abgeben:
Also Danke nochmal, hat mir sehr weitergeholfen. Der Aufsatz benutzt SQL, da kenn ich mich einigermaßen aus, jedoch ist die Formularanpassung für die Eingabemasken (und sonst. Programmierung) dort sehr aufwendig (alles mit Editor, nicht wie in Access mit beinahe "Drag & Drop" und "Eigenschaften"), deshalb der ganze Aufwand. Da ich für verschiedene Situatuionen verschiedene Eingabemasken brauche, bin ich in Access schneller, also Access eigentlich nur als "Viewer".
Systeminfo: Ich wusste nicht, daß man das angibt, mach ich gleich noch. Also vielen Dank nochmal.
Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 08. Nov. 2005 21:10 <-- editieren / zitieren --> Unities abgeben: Nur für mahe01
Hallo Markus, Gis-Software ist nicht gerade exakt oder ? dann schau die doch mal autodesk topobase an. Läuft mit Oracle und die Masken gehen fast wie bei Access und kannst in den Masken auch noch mit VB Scripten arbeiten. Da hast du Ruckzuck ne neue Fachschale. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. [Diese Nachricht wurde von Stelli1 am 08. Nov. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mahe01 Mitglied
Beiträge: 10 Registriert: 03.11.2005 ACAD 2000 Microstation 7 ORACLE 8.7.1 GIS-Software Access etwas SQL
|
erstellt am: 11. Nov. 2005 14:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli, mit topobase werd ich jetzt auf Umwegen zu tun haben, wir müssen einen Datenbestand von unseren GIS-System in das dortige importieren, was das heisst, brauch ich dir wahrscheinlich nicht zu erklären. Sieht aber gut aus, alles auf ORACLE-Ebene. Ich würde mich GERNE mit anderer GIS-Software befassen, aber mir fehlt vor allem die Zeit und die Kosten: was GIS-Software kostet brauch ich dir nicht sagen, außerdem muss man an Schulungen teilnehmen, die auch sehr teuer sind. Handbücher für GIS-Software sind "mehr schlecht als recht", und da sprech ich aus Erfahrung. Ich kenn mehrere Systeme, nicht nur von Prospekten. (von Kanal, Wasser bis Strom und Flächen meist mit ORACLE, dann AutoCAD oder mit Microstation -> Katastrophe ;-), Preisklasse u. a. >10.000euro und >40.000euro ;- aber glaub mir, der Preis sagt nichts aus). Ich würde mich auch als Anwender bezeichnen und nicht als Programmierer, meist sehen das die GIS-Hersteller nicht. (Stichwort "intuitives benutzen", ähnlich den üblichen Windows-Anwendungen). Ich denke aber auch, daß die ganzen GIS-Geschichten - egal welcher Hersteller - verständlicherweise - noch in den Kinderschuhen steckt. Auch will ich kein "neues" GIS-System mit Access verwirklichen, auch wenn dies wahrscheinlich gar nicht so schwer wäre, aber wie gesagt fehlt mir die Zeit. Aber VBA lern ich jetzt auf jeden Fall. Bücher liegen bereit. Witzig finde ich nur daß wir jetzt schon 210 Klicks haben ;-)..... Hab schon wieder zuviel geschrieben. Gruß Markus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|