13.07.2013 Aufrufe

Einsatz von 3D-Stadtmodellen für Partizipationsverfahren - cpe ...

Einsatz von 3D-Stadtmodellen für Partizipationsverfahren - cpe ...

Einsatz von 3D-Stadtmodellen für Partizipationsverfahren - cpe ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Arbeitsschritte<br />

Arbeitsschritt Befehl<br />

Zur Definition der Funktion, die "umwandeln" heißen soll, müssen zunächst alle<br />

Argumente und lokalen Variablen festgelegt werden. Da die Funktion im Rahmen<br />

einer geöffneten AutoCAD-Datei ausgeführt wird, bedarf es keiner Argumente.<br />

Somit werden nur die Variablen definiert<br />

Zum Auslesen der relevanten Punkte in der CAD-Datei wird im ersten Schritt die<br />

Variable "punktFilter" bestückt, die die Attribute der relevanten Punkte enthält.<br />

Dies sind die Eigenschaft "POINT" zu sein sowie auf der Ebene "__Punkte 1" zu<br />

liegen.<br />

Der Filter wird mit Hilfe der Funktion "ssget" auf die Zeichnungsdatenbank<br />

angewendet, um alle Punkte mit den oben definierten Eigenschaften in die<br />

Variable "punktliste" zu laden. "ssget" liefert jedoch einen Auswahlsatz zurück,<br />

der einen eigenen Datentyp darstellt und nicht mit den normalen Listenbefehlen<br />

angesprochen werden kann.<br />

AA1 soll als Schleifenbegrenzung dienen und wird daher mit der Anzahl der<br />

Punkte gleichgesetzt.<br />

Das Pendent zum Punktfilter ist der Filter <strong>für</strong> die Objekte, die Textfelder sind und<br />

auf der gleichen Ebene liegen.<br />

Praktische Implementation<br />

(defun umwandeln (/ punktFilter punktliste i<br />

punktname textFilter textliste j textname<br />

groupcodetext neuehoehe AA1 AA2 AA3<br />

AA4 AA5)<br />

(setq punktFilter(list (cons 0 "POINT")(cons 8<br />

"__Punkte 1")) ) ;<br />

(setq punktliste(ssget "X" punktFilter) )<br />

(setq AA1(sslength punktliste))<br />

(setq textFilter(list (cons 0 "TEXT")(cons 8<br />

"__Punkte 1")) ) ;<br />

Nun werden die entsprechenden Textfelder in eine eigene Variable eingelesen. (setq textliste(ssget "X" textFilter) )<br />

AA3 ist die Variable, die die Anzahl der Textfelder enthält. (setq AA3(sslength textliste))<br />

Die Laufvariable i wird auf 0 gesetzt. (setq i 0)<br />

Die äußere Schleife wird über alle Punkte laufen. (while (< i AA1);<br />

Auswahlsätze enthalten nicht das eigentliche Objekt, sondern nur eine Art Namen<br />

des Objektes. Daher wird im ersten Schritt der Name des i-ten Elements der (setq punktname(ssname punktliste i) )<br />

Punktliste ausgelesen.<br />

Der Variable "groupcodepunkt" wird nun das tatsächliche Objekt zum zuvor<br />

ausgewählten Namen zugewiesen.<br />

(setq groupcodepunkt(entget punktname) )<br />

Interessant ist nun die räumliche Position des Punktes, also die (X,Y,Z)-Koordinate.<br />

Diese ist im Gruppencode 10 enthalten, dessen Element in die Variable AA2 (setq AA2(assoc 10 groupcodepunkt))<br />

eingelesen wird. Diese Variable wird die Grundlage zum Vergleich mit den<br />

Textfeldern bilden<br />

Für die Textfeld-Schleife soll die Laufvariable j genutzt werden, die hier auf 0 (setq j 0)<br />

gesetzt wird.<br />

Hier beginnt die innere Schleife über alle Textfelder. (while (< j AA3)<br />

Es wird zunächst der Name des j-ten Textfelds ausgelesen. (setq textname(ssname textliste j) )<br />

Damit wird das j-te Textfeld in die Variable "groupcodetext" gelesen. (setq groupcodetext(entget textname) )<br />

Interessant ist ersten Schritt die Position des Textfeldes. (setq AA4(assoc 10 groupcodetext))<br />

Sind die Position des i-ten Punktes und des j-ten Textfeldes identisch, so ist das<br />

gesuchte Paar gefunden und die Schleife kann ihren eigentliche Aufgabe (if (equal AA2 AA4)<br />

vornehmen:<br />

Dieser Befehl ist nötig, da in if-Klauseln normalerweise nur ein einzelner Befehl<br />

ausgeführt werden darf.<br />

(progn<br />

Aus dem Textobjekt wird nun der eigentliche Textinhalt ausgelesen. Dieser hat<br />

den Gruppencode 1. Da die Gruppencode-Nummer, also die Zahl 1 nicht<br />

interessant ist, wird sie mit "cdr" abgeschnitten und nur der eigentliche Text in die<br />

Variable "neuehöhe" eingelesen.<br />

Naheliegenderweise enthalten Textfelder Inhalte in einem Datentyp <strong>für</strong> Texte,<br />

somit muss die Höhe noch in einen Datentyp <strong>für</strong> Zahlen umgewandelt werden,<br />

bevor sie weiterverwendet werden kann.<br />

Die Variable AA5 wird nun aus den bereits vorliegenden Höheninformationen des<br />

Punktes sowie der Information über die Höhe aus dem Textfeld<br />

zusammengeschnitten. AA5 besteht also aus den vier Elementen Gruppencode-<br />

Nummer (sprich 10), der X-Koordinate, der Y-Koordinate und der neuen Z-<br />

Koordinate.<br />

Die alte Höheninformation wird schließlich durch die in AA5 zusammengestellte<br />

neue Höhenfunktion überschrieben. Der zweidimensionale Punkte wird damit in<br />

die Ebene "emporgehoben".<br />

Der Befehl "entmod" stellt sicher, dass diese Veränderung nicht nur auf lokaler<br />

AutoLISP-Ebene passiert, sondern die Veränderung auch in der AutoCAD-<br />

Zeichendatenbank übernommen wird.<br />

Um weitere unnötige Schleifendurchläufe zu vermeiden und Rechenleistung zu<br />

(setq neuehoehe(cdr(assoc 1<br />

groupcodetext)))<br />

(setq neuehoehe(atof neuehoehe))<br />

(setq AA5 (list (nth 0 AA2) (nth 1 AA2) (nth 2<br />

AA2) neuehoehe))<br />

(setq groupcodepunkt(subst AA5 (assoc 10<br />

groupcodepunkt) groupcodepunkt) )<br />

(entmod groupcodepunkt)<br />

153

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!