| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Zeichnung vom Modellbereich in den Layoutbereich verschieben (7447 mal gelesen)
|
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 20. Mai. 2009 14:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispforum! Ich bitte um Hilfe bei folgendem Problem: Ich habe eine DWG-Datei aus einem Fremdsystem (ProEngineer) vorliegen, in der sich alle Zeichnungsobjekte im Modellbereich befinden. (inkl. Zeichnungsrahmen) Problemstellung: Mittels LISP alle Zeichnungsobjekte des Modellbereiches "ausschneiden" und im Layoutbereich wieder einfügen (im Punkt 0,0). [b]Mein Lösungsansatz 1:[b] (command "_cutclip" "_all" "") ; Alle Objekte ausschneiden (command "CTAB" "Layout1") ; Layouttab "Layout1" aktiv schalten (command "_pasteclip" "0,0") ; Allles ausgeschnitte in 0,0 einfügen (command "zoom" "_e") ; ZOOM Grenzen Leider funktioniert diese Variante nicht immer, und die Routine bricht manchmal mit der Fehlermeldung "0,0 Unbekannter Befehl "0,0". Drücken Sie F1-Taste für Hilfe." ab. [b]Mein Lösungsansatz 2:[b] (setq allauswahl (ssget "X")) ; Auswahlsatz erstellen (command "CTAB" "Layout1") ; Layouttab "Layout1" aktiv schalten Nun muss ich den Auswahlsatz im Layoutbereich einfügen. Mit "entmake" oder "entmakex" bin ich bisher gescheitert: [b](entmake allauswahl)[b] Mit dem Fehler "Fehler: Fehlerhafte Liste in Objektende: <Selection set: 2> wird die Routine abgebrochen. Wie bringe ich den Auswahlsatz "allauswahl" in den Layoutbereich?? Für Hilfe wäre ich euch sehr dankbar!, Doc40
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 20. Mai. 2009 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
|
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 20. Mai. 2009 14:54 <-- editieren / zitieren --> Unities abgeben:
|
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 20. Mai. 2009 15:02 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
Dann machst du dir eins in der Größe, die du sowieso zum Drucken annimmst, zoomst das Modell auf einen "ordentlichen" Faktor, gehst mit chspace ins Ansichtsfenster und schon hast du das Modell maßstäblich im Layout. Gruß CADchup
------------------ CADmaro.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 20. Mai. 2009 15:07 <-- editieren / zitieren --> Unities abgeben:
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 20. Mai. 2009 18:07 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
wenn diese Funktion nicht geht. Ist das zeichnungsabhängig? Also in der selben zeichnung immer wieder nachvollziehbar? Wird dabei noch auf das Layout1 umgeschaltet? Die meldung unbekannter Befehl 0,0 sagt mir, dass einer der vorigen befehle (aus welchem Grund auch immer) einen Befehlsoption mehr benötigt hat, und dewegen das (command "_pasteclip" "0,0") nicht mehr als eine Befehl abgehandelt wird, sondern die Option 0,0 einen neuen Befehl beginnt. Das (command .....) darf man nicht als abgeschlossenen Befehl sehen, sondern die einzelnen übergebenen Argumente werden einfach in einen Stapel geschoben (auch von mehreren (Command hintereinander), und von Autocad nacheinander abgearbeitet. Benötigt nun eine Befehl jedoch eine Option mehr, so wird der nächste Befehlsbeginn als benötigte Option reingeschoben. Dann stimmt der ganze Ablauf nicht mehr. Und sowas vermute ich hier jetzt. [Diese Nachricht wurde von fuchsi am 20. Mai. 2009 editiert.]
[Diese Nachricht wurde von fuchsi am 20. Mai. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 20. Mai. 2009 21:22 <-- editieren / zitieren --> Unities abgeben:
Hallo fuchsi! Ich konnte folgendes Verhalten feststellen: Nach dem Öffnen der zu bearbeitenden Zeichnung rufe ich mir die Lisproutine mittels Tastatureingabe auf. Die Routine läuft durch, wobei zum Schluss auf dan LayoutTab umgeschaltet, jedoch nichts eingefügt wird. Das bedeutet, dass werder im Modell- noch im Layout-Bereich Zeichnungsobjekte zu sehen sind. (sind wohl in der Windows Zwischenablage) Ich schließe nun die Zeichnung (ohne zu speichern) und öffne sie wieder. Beim erneuten Aufrufen der Routine läuft die Routine durch und das Ergebnis ist in Ordnung. Ich habe den Verdacht, dass der Befehl "_cutclip" "_all" zu lange braucht um alle Zeichnugsobjekte zu erfassen, und dadurch im weiteren Ablauf der Routine noch keine Zwischenablage zur Verfügung steht. Daher dachte ich an die Variante den Auswahlsatz mit (setq auswahlsatz (ssget "X")) zu erstellen. Dies sollte schneller sein, da hier ja mit der Geometriedatenbank von AutoCAD gearbeitet wird. Allerdings weiß ich nicht wie man im Layout-Tab diesen Auswahlsatz wieder einfügt. Was meinst du? LG, Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 20. Mai. 2009 22:57 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
hi, mal ein Schnellschuss für ein Objekt (defun c:C2PS( / doc space ent vobj copyobj ) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)) space (vla-get-paperSpace doc) ent (entsel "Select object: ") vobj (vlax-ename->vla-object (car ent)) copyobj (car (vlax-invoke doc 'copyobjects (list vobj) space))) (princ) ) ... mfg heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 22. Mai. 2009 15:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Heiko! Vielen Dank für deinen "Schnellschuss". Funktioniert einwandfrei! Wie von dir bereits erwähnt funktioniert die Routine leider nur für ein Objekt. Schön wäre, wenn ohne Benutzereingabe alle Objekte gewählt, und diese verschoben anstatt kopiert würden. (Modellbereich soll leer sein) Ein leerer Modellbereich ist wichtig, um eine Unterscheidung zwischen importierten Zeichnungen (ProEngineer) und generischen AutoCAD-Zeichnungen treffen zu können. Leider ist mein v-Functions-Wissen noch nicht ausreichend um deine Routine auf meine Bedürfnisse anpassen zu können. Mit der Bitte um weitere Hilfe wünsche ich ein schönes Wochenende, Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 22. Mai. 2009 18:34 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
Hi, na dann Schnellschuss die Zweite (defun c:C2PS (/ doc space elem vobj n asatz) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)) space (vla-get-paperSpace doc) asatz (ssget) n 0 ) (repeat (sslength asatz) (setq elem (ssname asatz n) n (1+ n) vobj (vlax-ename->vla-object elem) ) (vlax-invoke doc 'copyobjects (list vobj) space) (vlax-invoke-method vobj 'DELETE) ) (princ) ) den Rest darfst du dann aber selber machen mfg heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 25. Mai. 2009 07:37 <-- editieren / zitieren --> Unities abgeben:
|
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 25. Mai. 2009 08:10 <-- editieren / zitieren --> Unities abgeben:
|
Doc40 Mitglied Konstrukteur
Beiträge: 11 Registriert: 03.12.2008 Win XP Pro x86 PC, Q6600, 2GB RAM, NVIDIA Quadro FX 3700, AutoCAD 2010
|
erstellt am: 25. Mai. 2009 08:12 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 25. Mai. 2009 08:49 <-- editieren / zitieren --> Unities abgeben: Nur für Doc40
nunja .... ich zitier mal RetVal = object.CopyObjects(Objects[, Owner][, IDPairs]) Object : Database, Document The object or objects this method applies to. Objects: Variant (array of objects); input-only The array of primary objects to be copied. All the objects must have the same owner, and the owner must belong to the database or document that is calling this method. ich staune , dass das mit Übergabe einer Lisp-Liste auch geht, konform ist das nicht! nochwas : wenn (setq asatz (ssget "X")) nix findet , crasht (sslength asatz) ... außerdem wäre (setq asatz (ssget "_X" '((410 . "Model")))) wohl besser ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |