Autor
|
Thema: Block einfügen am Fadenkreuz (2366 mal gelesen)
|
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 28. Aug. 2006 23:00 <-- editieren / zitieren --> Unities abgeben:
Ich programmiere mit Delphi 7 und bin jetzt soweit, daß ich einen DXF-Block so in BricsCad einfügen kann, daß dieser für den Anwender am Fadenkreuz hängt. Quellcode für die AutoCAD Variante: ACAD.ActiveDocument.SendCommand( '_-insert "' + TempOrdner + '\' + AdsQuery_ArtikelstammTETENR.AsString + '_' + Typ + Ext + '"' +CR); // CR = #13#10 repeat // Warten bis AutoCAD wieder bereit ist Befehle anzunehmen until ACAD.GetAcadState.IsQuiescent; // Funktioniert erst ab AutoCAD 2004, obwohl es den Befehl auch schon in früheren Version gab for re:= 0 to ACAD.ActiveDocument.Layers.Count-1 do begin // AutoCAD beginnt bei 0 sLayer:= AnsiUpperCase(ACAD.ActiveDocument.Layers.Item(re).Name); if (sLayer = 'MP_VERDECKT') or (sLayer = 'MP_MITTELLINIEN') or (sLayer = 'MP_HILFSLINIEN') or (sLayer = 'MP_BEMASSUNG') then ACAD.ActiveDocument.Layers.Item(re).LayerOn:= false; end; Quellcode für die BricsCad Variante: // Zuerst muß eine temporäre Lisp-Datei erzeugt werden IIcad.LoadLISP(TempOrdner + '\' + '_block.lsp'); // in der lsp-Datei steht der insert Befehl // Jetzt hängt der Block am Cursor des Anwenders // Das Dephi Programm muß jetzt warten, bis BricsCAD wieder Befehle annehmen kann, aber wie ??? // IsQuiescent kennt BricsCad nicht !!! for re:= 1 to ACAD.ActiveDocument.Layers.Count do begin // BricsCad beginnt bei 1 sLayer:= AnsiUpperCase(IIcad.ActiveDocument.Layers.Item(re).Name); if (sLayer = 'MP_VERDECKT') or (sLayer = 'MP_MITTELLINIEN') or (sLayer = 'MP_HILFSLINIEN') or (sLayer = 'MP_BEMASSUNG') then IIcad.ActiveDocument.Layers.Item(re).LayerOn:= false; // funktioniert, aber die Layerliste wird nicht aktualisiert -> Bug in BricsCad!?!? end; Frage: Gibt es sowas wie IsQuiescent in BricsCad oder gibt es eine andere Möglichkeit, einen Block so einzufügen, daß der Block für den Anwender am Fadenkreuz hängt? IIcad.RunCommand und _DDINSERT habe ich schon ausprobiert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 30. Aug. 2006 21:09 <-- editieren / zitieren --> Unities abgeben: Nur für gude
Hallo gute, zuerst eine Frage, ist das Fadenkreuz beim einfügen sichtbar? Wenn nicht kann man das Einstellen. Zweite Frage liegt der Ursprungspung beim Block bei 0,0? Wenn ja, hängt er bei meinem Test am Fadenkreuz. Ich habe es mit _DDINSERT getestet. Wenn ich die Eigaben in der Befehlzeile nicht machen wollte, würde ich den Befehl in das Menü einbinden, auf ein Icon setzen oder eine kleine (ca. 5 bis 10 Zeilen) Lispdatei erstellen. Oder gibt es eine Grund warum Du auf die ICAD oder ACAD Bordmittel verzichtest? Gruß Theodor
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 30. Aug. 2006 23:41 <-- editieren / zitieren --> Unities abgeben:
|
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 31. Aug. 2006 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für gude
|
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 31. Aug. 2006 18:59 <-- editieren / zitieren --> Unities abgeben:
Insert verwende ich doch, wobei ich in BricsCad über die lsp-Datei gehen muß. Das Einfügen des Blocken ist nicht das Problem, das funktioniert wie gewünscht. Jedoch muß mein Programm warten bis der Anwender den Block abgesetzt hat und dies funktioniert mit BricaCad nicht, da es wohl den Befehl IsQuiescent nicht kennt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 01. Sep. 2006 21:12 <-- editieren / zitieren --> Unities abgeben:
Genau so verhält es sich wenn ich den Anwender auffordere Elemente in seiner Zeichnung auszuwählen um dann diese Daten auszuwerten. Mein Programm muß solange warten, bis der Anwender fertig ist. In AutoCAD erreiche ich das mit dem Befehl IsQuiescent. AutoCAD: ACAD.ActiveDocument.SendCommand('_Select '); try repeat // Warten bis AutoCAD bereit ist until ACAD.GetAcadState.IsQuiescent; // geht nicht bei AutoCAD 2000 except end; BricsCAD??? IsQuiescent??? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 02. Sep. 2006 23:43 <-- editieren / zitieren --> Unities abgeben: Nur für gude
Hallo, schon mal so ein Beispiel getestet? ;;---------------------------------------------------------- (prompt "\nDie Arbeit wird getan. Bitte warten . . .") (prompt "\n") (startapp "Arbeit.EXE") ; die Datei DATEI.TXT wird erzeugt (princ) (setq Z 1) (while (and (not (findfile "DATEI.TXT")) (<= Z 10)); 10 Durchgänge (command "PAUSE" 1000) ; 1000 kann auch höher oder niedriger sein (setq Z (1+ Z)) ) ;; ... ;; ... So wie im Beispiel eine Datei gesucht wird, kann auch z.B. ein Block gesucht werden. Gruß Theodor Schönwald Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 04. Sep. 2006 17:36 <-- editieren / zitieren --> Unities abgeben:
|
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 06. Sep. 2006 23:15 <-- editieren / zitieren --> Unities abgeben: Nur für gude
|
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 07. Sep. 2006 17:43 <-- editieren / zitieren --> Unities abgeben:
|
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 20. Jan. 2007 06:05 <-- editieren / zitieren --> Unities abgeben:
procedure TForm1.IsQuiescent; const maxZaehler = 10000; var zaehler: integer; begin zaehler:= 0; repeat // Warten bis BricsCad bereit ist inc(zaehler); if zaehler > maxZaehler then begin if MessageDlg('Weiter?', mtConfirmation, [mbOk], 0) = idOK then zaehler:= 0; end; until (IIcad.ActiveDocument.GetVariable('CMDActive') = 0) or (zaehler > maxZaehler); end; Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gude Mitglied Dipl.-Ing.
Beiträge: 7 Registriert: 28.08.2006
|
erstellt am: 20. Jan. 2007 06:10 <-- editieren / zitieren --> Unities abgeben:
Die temporäre Lisp-Datei wird nicht benötigt. Mit RunCommand funktioniert es: IIcad.RunCommand('(command "_-insert" "C:\\10005_D.DXF")'); bzw. IIcad.RunCommand('(command "_select")'); bzw. IIcad.RunCommand('(command "_ZOOM" "_E")'); bzw. IIcad.RunCommand('(command "_Regen")'); Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |