Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Bereich im Modell auswählen und im Papierbereich einfügen

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 08. Jan. 2008 15:08    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 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



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 08. Jan. 2008 15:36    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 AandreasH 10 Unities + Antwort hilfreich

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 08. Jan. 2008 16:29    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 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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 09. Jan. 2008 14:10    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

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 10. Jan. 2008 10:34    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

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 14. Jan. 2008 15:12    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

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 17. Jan. 2008 10:18    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,

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



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

Beiträge: 2490
Registriert: 02.11.2001

erstellt am: 17. Jan. 2008 10:39    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 AandreasH 10 Unities + Antwort hilfreich

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


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

Beiträge: 18
Registriert: 08.01.2008

Autocad 2004
Civil3D 2008
VBA

erstellt am: 17. Jan. 2008 11:06    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 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

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