| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Bereich im Modell auswählen und im Papierbereich einfügen (2650 mal gelesen)
|
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 08. Jan. 2008 15:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich arbeite an einer Lösung automatisch Layouts zu erstellen (Acad2004, VBA). Einiges habe ich im Forum schon gefunden. Wie ich ein neues Layout anlege und das Ansichtsfenster einrichte habe ich mir schon zusammengesucht. Auch den Blattrahmen und den Firmen-Schriftkopf bekomme ich schon rein. Was ich noch gerne machen möchte (ist der grösste Wunsch): Der User sollte im Modellbereich einen Bereich auswählen, dieser Bereich sollte gemerkt werden und dann im neu angelegten Ansichtsfenster im Papierbereich automatisch dargestellt werden. Beim Auswählen soll ein Rechteck zB. in A4 Grösse (Gummiband) am Curser kleben das der Benutzer gleich den Ausschnitt erkennen kann den er dann im Layout eingefügt bekommt. Das Rechteck sollte natürlich dann auch noch dem gewählen Massstab für das Layout entsprechen angepasst sein, damit auch die tatsächliche Grösse für das Ansichtsfenster gezeigt wird. Wie kann ich nun eine art Gummibandrechteck am Curser hängen? Wie kann ich die Koordinaten merken, umrechnen und dann so wieder in das Layout bringen. Ich hoffe es kann mir dazu jemand ein paar Hinweise und Snippets geben. Vielen Dank Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 08. Jan. 2008 15:36 <-- editieren / zitieren --> Unities abgeben: Nur für AandreasH
Hallo Andreas, Dein Wunsch lässt Fragen offen: 1) Welches Layout soll herangezogen werden? 2) Warum gehst Du diesen Weg? Meiner Meinung nach packst du das Thema an der falschen Seite an. Denn in aller Regel sollte man doch zunächst mal seine Zeichnung fertig stellen, und dann überlegt man sich, in welchem Maßstab man das Modell (oder einen Ausschnitt) auf welches Papierformat bekommt. Daher wäre es (aus meiner Sicht) sinnvoll zuerst den darszustellenden Bereich zu wählen, dann den Darstellungsmaßstab festzulegen und danach dann das Papierformat zu bestimmen. Oder eben das Format und dann wird der Maßstab berechnet. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 08. Jan. 2008 16:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, zu1) ich lege ein neues Layout nach Benutzerauswahl an. Es können zB DinA4, DinA3... gewählt werden. Die Auswahl erfolgt über ein Userform wo eben die Blattgrösse und einige Beschriftungsattribute gewählt werden können. zu2) es sollen Blätter (Lageplanausschnitt) für Überprüfungen ausgedruckt werden. Den Massstab für die jeweilige Layoutgrösse gebe ICH vor zB DinA3 = 1:100 (Die Werte haben sich in der Praxis als geeignet herausgestellt) Daher sollte wenn der Benutzer A3 wählt das Rechteck für die Auswahl eben gleich den Ausschnitt anzeigen der bei 1:100 ins Ansichtsfenster passt. (man könnte dann immer noch etwas weiter gehen und dem Benutzer einen Massstab wählen lassen. aber alles der Reihe nach) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 09. Jan. 2008 14:10 <-- editieren / zitieren --> Unities abgeben:
Ev. noch zur Verdeutlichung: Der Curser sollte dann so aussehen wie wenn ich die Funktion dynamisches Zoom verwende. Da bekommt man ja auch so ein Rechteck als Bereichsübersicht. Ich möchte die grösse dieses Rechteckes vorher festlegen können, und mir dann eben den ausgewählten Bereich merken und in einem neu angelegten Ansichtsfenster mit einem fixierten Massstab anzeigen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 10. Jan. 2008 10:34 <-- editieren / zitieren --> Unities abgeben:
Ich komme hier einfach nicht weiter. Ich lass das mit dem Auswahlausschnitt vorerst mal weg. Wie kann ich jetzt den vom Benutzer im Modellbereich gewählten Punkt weiter verarbeiten das im Ansichtsfenster auf diesen Punkt hin gezoomt wird. Der Punkt sollte dann im Center des Ansichtsfensters sein, wobei der vorher von mir eingestellte Massstab nicht geändert werden darf. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 14. Jan. 2008 15:12 <-- editieren / zitieren --> Unities abgeben:
Habe in einem anderen Beitrag diesen Tip von Stelli1 bekommen: Zitat: Original erstellt von Stelli1: Ich würde einen tmpBlock nach den Blattgrößen erzeugen. Diesen kannst du per Sendcommand einfügen. Dann hast du den Block am Fadenkreuz. Über die Auswertung der AutoCAD events kannst du nach Befehlsende feststellen ob die Anzahl der Entitys um 1 erhöht ist. Wenn das so ist, ist der Block auch wirklich eingefügt worden, sonst hat der Benutzer abgebrochen. Auf das Letzte Elemnt kannst du ja mit Hilfe der Count EIgenschaft zugreifen. Du liest die EInfügekoordinaten des Blockes und löschst ihn wieder. Dann überträgst du die Koordinaten als Zentrumskoordinaten in ein Ansichtsfenster, was du vorher entsprechend deiner Papiergröße eingerichtet hast.
Ich habe das soweit mal (wohl etwas umständlicher) umgesetzt und dabei noch ein kleines Problem. Zum Einfügen des Blocks habe ich einen Lisp Befehl über Sendcommand aufgerufen, da beim normal Einfügen der Block nicht am Curser klebt sondern ja der Einfügepunkt schon vorher feststehen muss. (Falls ich falsch liege bitte berichtigen) Wenn ich nun während des Einfügens (also während der Lisp-Prozedur) ein PAN oder ZOOM mache (ausser Rad-Zoom) läuft das VBA weiter und meldet einen Fehler, die Lisp-Prozedur wird dann aber wieder aufgenommen. Code:
' In den Modellbereich wechseln und Block einfügen ThisDrawing.ActiveSpace = acModelSpace ThisDrawing.SendCommand "(blockIn)" & vbCr 'Hier wird die Lispprozedur aufgerufen ' Löscht eventuell vorhandene Auswahlsätze If ThisDrawing.SelectionSets.count > 0 Then For intSSet = ThisDrawing.SelectionSets.count - 1 To 0 Step -1 ThisDrawing.SelectionSets.Item(intSSet).Delete Next intSSet End If ' Blöcke suchen, prüfen ob User den Block auch eingefügt hat Set SSet = ThisDrawing.SelectionSets.Add("AuswahlRahmen") FilterType(0) = 0 FilterData(0) = "Insert" FilterType(1) = 2 FilterData(1) = "AuswahlRahmen" SSet.Select acSelectionSetAll, , , FilterType, FilterData If SSet.count > 0 And SSet.count < 2 Then 'wenn EIN Block in der Auswahl ist Set AcBlockRef = SSet(0) AcBlockRef.GetBoundingBox AuswahlLiUnt, AuswahlReOb AuswahlBreite = (AuswahlReOb(0) - AuswahlLiUnt(0)) AuswahlHoehe = (AuswahlReOb(1) - AuswahlLiUnt(1)) If AuswahlBreite < 0 Then AuswahlBreite = AuswahlBreite * (-1) If AuswahlHoehe < 0 Then AuswahlHoehe = AuswahlHoehe * (-1) returnPnt(0) = AuswahlLiUnt(0) + (AuswahlBreite / 2) returnPnt(1) = AuswahlLiUnt(1) + (AuswahlHoehe / 2) returnPnt(2) = 0 AuswahlFestlegen = True MsgBox "Auswahl=" & AuswahlFestlegen MsgBox "Punkt=" & returnPnt(0) & " , " & returnPnt(1) & " , " & returnPnt(2) Else MsgBox "Es ist ein Fehler aufgetreten" ' Hier komme ich nach einem PAN hin Exit Function End If
hier noch die Lisp-Zeilen:
Code:
(defun blockIn() (princ) (setvar "cmdecho" 0) ;Unterdrücken der Befehle in der Befehlszeile(Command "_.-insert" "AuswahlRahmen" PAUSE "1.0" "1.0" "0" ) ;Einfügen des Blocks 'Blockname', positionieren, X-Skalierun auf 1, Y-Skalierung auf 1 und Drehung = 0° (setvar "cmdecho" 1) (princ) )
Wie kann ich das Problem lösen?
[Diese Nachricht wurde von AandreasH am 14. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 17. Jan. 2008 10:18 <-- editieren / zitieren --> Unities abgeben:
Hallo, so das Teil läuft jetzt. - Plotter auf system ermitteln - verfügbare Blattgrössen auslesen - Layout erstellen und Ansichtsfenstergrösse mit Massstab als Block für Auswahl im Modellbereich erzeugen - temp. Block (hängt am cursor) mit einem Lispcode einfügen und den Event bei endLisp abfangen - Event abhandeln, Layout fertigstellen und auf den gewählten Bereich zoomen. Was ich noch nicht ganz durchschaut habe ist die Eventbehandlung. Ich habe das in ThisDrawing geschrieben, ist das schlecht ? Wie sieht das aus wenn ich den Code auf einem anderen Rechner ausführen möchte? Kann man den Event nicht irgendwie nur aufrufen wenn er wirklich gebraucht wird, momentan wird ja BeginLisp und EndLisp ständig abgefragt. Klassenmodul? Sind noch ne Menge Fragen. Grüsse Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001
|
erstellt am: 17. Jan. 2008 10:39 <-- editieren / zitieren --> Unities abgeben: Nur für AandreasH
Hi Andreas, meine Meinung zu dem was Du da machst mal als Denkanstoß: Warum bastelst Du etwas in VBA und rufst dann für etwas vergleichsweise einfaches wie eine Blockeinfügung 'ne Lisp Routine auf? Wieso machst Du nicht alles in Lisp ODER VBA? Es gibt sicherlich Fälle in denen es nicht anders geht. Aber in diesem Fall? Alles was Du da gemacht hast geht relativ einfach komplett in Lisp, ICH hätte für das gesamte Projekt Lisp genommen. Einfach weil ich finde, das die Interaktion mit dem User hier besser zu realisieren ist (kann aber auch an meinem VBA unvermögen liegen ;-)) Zum Thema: Zitat: Beim Auswählen soll ein Rechteck zB. in A4 Grösse (Gummiband) am Curser kleben das der Benutzer gleich den Ausschnitt erkennen kann den er dann im Layout eingefügt bekommt.
Habe ich mit Lisp mal folgendes gemacht. http://ww3.cad.de/foren/ubb/Forum145/HTML/001111.shtml#000003 ... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AandreasH Mitglied EDV Techniker
Beiträge: 18 Registriert: 08.01.2008 Autocad 2004 Civil3D 2008 VBA
|
erstellt am: 17. Jan. 2008 11:06 <-- editieren / zitieren --> Unities abgeben:
Hallo Marc, mal vorab: Ich habe keine Ahnung von Lisp. Das hier Lisp oder ev. auch C# besser geeignet wäre könnte ich mir schon vorstellen. Das Blockeinfügen wird noch auf insert in VBA geändert sobald ich mit der Eventbehandlung richtig klar komme. Um ein Sendcommand komme ich nicht herum, sonst klebt der Block ja nicht am Cursor (Grundvoraussetzung). Bei der Eventbehandlung hätte ich eben noch die obigen Fragen offen. Grüsse Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |