Hot News:

Unser Angebot:

  Foren auf CAD.de
  VBasic / vb.net / vbs / wsh
  AutoCAD und Delphi

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
  
Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
Autor Thema:  AutoCAD und Delphi (2824 mal gelesen)
Ankaa
Mitglied


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

Beiträge: 3
Registriert: 30.03.2006

erstellt am: 30. Mrz. 2006 15: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

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


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

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 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 Ankaa 10 Unities + Antwort hilfreich

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


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

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 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 Ankaa 10 Unities + Antwort hilfreich

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


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

Beiträge: 3
Registriert: 30.03.2006

erstellt am: 04. Apr. 2006 09: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

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
 


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

Beiträge: 555
Registriert: 09.08.2001

erstellt am: 04. Apr. 2006 10:20    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 Ankaa 10 Unities + Antwort hilfreich

Hier http://www.autocad.ru/cgi-bin/f1/board.cgi?p=42
sollten Informationen dazu zu finden sein.
Mit besten Grüßen aus der Rhön
Jochen
www.black-cad.de

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

BloodyMess
Mitglied
Applicationingenieur


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

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 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 Ankaa 10 Unities + Antwort hilfreich

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 >>)

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)2025 CAD.de | Impressum | Datenschutz