| |  | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: AutoCAD und Delphi (2824 mal gelesen)
|
Ankaa Mitglied
 Beiträge: 3 Registriert: 30.03.2006
|
erstellt am: 30. Mrz. 2006 15:03 <-- editieren / zitieren --> Unities abgeben:         
Hallo. Ich habe ein großes Problem und hoffe hier Hilfe zu finden. Ich möchte über Delphi mit OLE auf AutoCAD zugreifen. Die Verbindung funktioniert einwandfrei und meine Datei kann ich öffnen. Nun wollte ich fragen ob es die Möglichkeit gibt aus Delphi Befehle an die Kommandozeile zu senden und diese ausführen zu lassen. Und kann ich aus Delphi mit Angabe der Koordinaten in AutoCAD einen Punkt zeichnen lassen? Leider war das Internet diesbezüglich nicht sehr hilfreich und das was ich gefunden und ausprobiert habe funktioniert alles nicht (AddPoint, Point, sendcommand) Ich hoffe auf schnelel Hilfe, da ich wirklich nicht mehr weiter weiß. Liebe Grüße, Ankaa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BloodyMess Mitglied Applicationingenieur
  
 Beiträge: 604 Registriert: 06.06.2002 AutoCAD Map 3D 2005 (SP2 & SP1) / Win XP pro (SP1) & Win 2000 pro (SP4) AutoCAD Map 2000i / WinNT (SP6)
|
erstellt am: 31. Mrz. 2006 12:49 <-- editieren / zitieren --> Unities abgeben:          Nur für Ankaa
Hi Ankaa, mich würden die Versionen von Delphi und AutoCAD interssieren. Vielleicht kannst Du auch schon vorhandenen Code reinstellen, damit man eine Basis hat. Grüssle TP ------------------ "Soll es funktionieren oder darf es auch etwas von Siemens sein?" ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BloodyMess Mitglied Applicationingenieur
  
 Beiträge: 604 Registriert: 06.06.2002 AutoCAD Map 3D 2005 (SP2 & SP1) / Win XP pro (SP1) & Win 2000 pro (SP4) AutoCAD Map 2000i / WinNT (SP6)
|
erstellt am: 01. Apr. 2006 16:09 <-- editieren / zitieren --> Unities abgeben:          Nur für Ankaa
Hallo Ankaa, mag die Sprache Delphi zwar nicht so gern, aber habe es trotzdem geschafft dein Problem zu lösen. Wenn Du Acad schon öffnen kannst, hast sicher unter 'uses' 'AutoCAD_tlb' und 'ComObj' schon eingebunden. Der Code für ein Button auf einem Formular mit ClickEvent zeichnet Dir einen Punkt bei der Koordinate (6, 6, 6). Weitere Beispiele kannst Du ja nun selber ausprobieren.
Code: procedure TForm1.Button1Click(Sender: TObject);var Acad: AcadApplication; Doc: AcadDocument; Point: AcadPoint; p : OleVariant; begin Acad := CoAcadApplication.Create; Acad.Visible := true; Doc := Acad.ActiveDocument; p := VarArrayCreate([0,2], varDouble); p[0] := 6.0; p[1] := 6.0; p[2] := 6.0; Point := Doc.ModelSpace.Addpoint(p); end; end.
Schönes Wochenende und Grüssle TP [Edit]Habe AutoCAD Map 3D 2005 und Borland Delphi 6.0 benutzt.[/Edit] ------------------ "Soll es funktionieren oder darf es auch etwas von Siemens sein?" ... [Diese Nachricht wurde von BloodyMess am 01. Apr. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ankaa Mitglied
 Beiträge: 3 Registriert: 30.03.2006
|
erstellt am: 04. Apr. 2006 09:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo. Tut mir leid, dass ich erst jetzt antworte, aber ich hatte in den letzten Tagen Probleme mit dem Internet. Da ich auch jetzt nicht zu Hause bin kann ich leider grad keinen Quelltext beifügen, werde dies aber schnellstmöglich tun. Wenn ich zu Hause bin werde ich den Code mal ausprobieren und hoffen, dass er funktioniert. Allerdings habe ich bisher nicht mit Acad: AcadApplication; sondern lediglich mit Acad: OLEVariant; gearbeitet. Funktioniert es trotzdem? Tut mir leid, ich kenn mich leider mit OLE-Programmierung noch nicht so aus. Ein weiteres Problem ist die Layer-Auswahl, die ich bis jetzt nicht lösen konnte. Gibt es dafür auch einen Befehl? Ich habe die AutoCAD_tlb (von caddzone.com runtergeladen) und ComObj bereits eingebunden. Vielen dank nochmal für die Hilfe und hoffentlich klappt es. Ich melde mich sobald ich es probieren konnte! Viele Grüße. Ankaa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
scj Mitglied
  
 Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 04. Apr. 2006 10:20 <-- editieren / zitieren --> Unities abgeben:          Nur für Ankaa
|
BloodyMess Mitglied Applicationingenieur
  
 Beiträge: 604 Registriert: 06.06.2002 AutoCAD Map 3D 2005 (SP2 & SP1) / Win XP pro (SP1) & Win 2000 pro (SP4) AutoCAD Map 2000i / WinNT (SP6)
|
erstellt am: 04. Apr. 2006 22:35 <-- editieren / zitieren --> Unities abgeben:          Nur für Ankaa
Hi Ankaa, der Unterschied ist einfach nur, dass wir bei Acad einen anderen ObjektTyp festlegen. Ein Variant ist kann alles mögliche sein! Du kannst dort Strings, Doubles oder eben auch Objecte übergeben. Was das tolle an OleVariant-Typen ist kann ich Dir nicht sagen, aber sowas versucht man zu vermeiden. Zudem wir ja wissen, von welchem Typ unser Objekt ist --> 'AcadApplication' .. genauso ist es mit AcadDocument und AcadPoint. Der Vorteil liegt darin, dass diese Objekte Eigenschaften und Methoden haben! Da aber ein Variant nie weiss, was ihn erwartet und welchen Typ er annehmen muss kann er uns diese nicht vorher anzeigen! Wenn Du das Objekt 'Acad' mit einem '.' danach aufrufst, solltest Du sowas sehen ... Das sind die Methoden und Eigenschaften, die uns das Objekt zur Verfügung stellt. Ebenso hat das Objekt 'Doc' bestimmte Eigenschaften und Funktionen. Warum habe ich aber 'p' als OleVariant deklariert .. Ich erwähnte ja schon, dass ich die Sprache nicht so toll finde .. .. hab´s nicht anders hingebracht. Die AutoCad_tlb hättest Dir auch selber erstellen können (Project -> Import Type Library -> Add .. dann zu dem Pfad hinnavigieren, wo deine acaxXXenu.tlb (XX - programmversion bei mir 16 / und wenn du deutsches Acad hast dann deu) liegt ... -> Create Unit und danach Install und schon kannst die Bibliothek unter 'uses' einbinden. Ein Layerproblem wäre da noch zu lösen ... hmmm weiss zwar net so ganz genau, was Du machen willst, hab aba mal was zusammengeschrieben. Code: // Thanks to http://www.swissdelphicenter.ch/torry/showcode.php?id=1692 {:Converts Unicode string to Ansi string using specified code page. @param ws Unicode string. @param codePage Code page to be used in conversion. @returns Converted ansi string. } function WideStringToString(const ws: WideString; codePage: Word): AnsiString; var l: integer; begin if ws = '' then Result := '' else begin l := WideCharToMultiByte(codePage, WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, @ws[1], - 1, nil, 0, nil, nil); SetLength(Result, l - 1); if l > 1 then WideCharToMultiByte(codePage, WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, @ws[1], - 1, @Result[1], l - 1, nil, nil); end; end; { WideStringToString } procedure TForm1.Button1Click(Sender: TObject);
var Acad: AcadApplication; Doc: AcadDocument; AcLayers: AcadLayers; AcLayer: AcadLayer; MsgText : PChar; myString : string; begin Acad := CoAcadApplication.Create; Acad.Visible := true; Doc := Acad.ActiveDocument; AcLayers := Doc.Layers; // anlegen zwei neuer Layer AcLayers.Add('new_Layer_1'); AcLayers.Add('new_Layer_2'); // zuweisen von 'new_Layer_1' an Aclayer um damit etwas zu machen aclayer := aclayers.Item('new_Layer_1'); // Layer frieren aclayer.Freeze := TRUE; // Layer sperren aclayer.Lock := TRUE; // auf Status Aus setzen aclayer.LayerOn := FALSE; // Konvertierung von DatenTypen, damit man auch was sieht ..  // aclayer.name ist vom Typ WideString -> convert to String! myString := WideStringToString(aclayer.Name, 437); // Nun noch String nach PChar konvertieren und man kann es benutzen MsgText:=StrAlloc(255); StrPCopy(MsgText,myString); Application.MessageBox( MsgText ,'Caption der MessageBox', 0); end;
Nimm die Funktion 'WideStringToString' einfach mal so hin. Die brauchte ich zur Typenkonvertierung um den Namen des Layers in einer MessageBox auszugeben. Ich denke mal es geht noch einfacher, aber Typkonvertierungen sind immer nicht so schön. Gehe den Code einfach mal durch und bei fragen meldest Dich. Schau mal noch bei Axel auf der Seite vorbei und sieh Dir mal das ObjektModell von AutoCad an .. http://www.visuallisp-tutorial.mapcar.net/objektmodell.html ... sicher erkennst Du hier einiges wieder aus dem Code .. Schönen Abend noch und Grüssle TP ------------------ "Soll es funktionieren oder darf es auch etwas von Siemens sein?" ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |