Community
AutoCAD Produktfamilie - Deutsch
Das Forum für alle Fragen zu AutoCAD, LT, Architecture, Electrical, Map 3D, Mechanical, MEP, Plant 3D, Raster Design, Web App, sowie Autodesk Civil 3D und Advance Steel.
abbrechen
Suchergebnisse werden angezeigt für 
Anzeigen  nur  | Stattdessen suchen nach 
Meintest du: 

Funktion zum Einlesen von Koordinaten

10 ANTWORTEN 10
GELÖST
Antworten
Nachricht 1 von 11
steven.pyka
358 Aufrufe, 10 Antworten

Funktion zum Einlesen von Koordinaten

Hallo zusammen, 

 

ich hoffe ihr könnt mir helfen.  Ich arbeite mit AutoCAD und nutze hier und da auch AutoLisp. Bei uns kommt es oft vor, dass wir einen ganzen Satz an Koordinatenpunkten (X,Y und Z) bekommen und in einer Zeichnung entsprechende Blöcke an die Koordinaten setzen müssen. 

Bisher habe ich das mit einer LISP und der Funktion (command "._insert" "Blockname" "x,y,z" ...) gemacht, doch der Aufwand ist schon recht hoch, das für jedes Koordinatenpaar zu machen. 

Gibt es hier vielleicht die Möglichkeit das zu vereinfachen? So nach dem Motto "wiederhole den Befehl solange ... bis" oder "mache das mit allen Werten die du in der Datei findest"

 

Danke schonmal für ein paar Denkanstöße. 🙂 

Gruß Steven 

10 ANTWORTEN 10
Nachricht 2 von 11
EnM4st3r
als Antwort auf: steven.pyka

wenn du die Koordinaten in einer Liste gespeichert hast hilft vielleicht (mapcar '(lambda..

Hier wird die Funktionsweise gut erklärt: https://www.afralisp.net/autolisp/tutorials/mapcar-and-lambda.php
Nachricht 3 von 11
EnM4st3r
als Antwort auf: EnM4st3r

also in etwa so (krd ist hier die Liste mit den coordinaten)

 

(mapcar '(lambda (x) (command "._insert" "Blockname" x)) krd)

 

Nachricht 4 von 11
steven.pyka
als Antwort auf: EnM4st3r

Greift er dann hier nur auf den X-Wert zu?

Nachricht 5 von 11
Kent1Cooper
als Antwort auf: EnM4st3r


@EnM4st3r wrote:

so something like this (krd is the list with the coordinates here)

(mapcar '(lambda (x) (command "._insert" "Blockname" x)) krd)

You would need to complete the Insert commands, something like this if:

A. the Blocks are not defined for uniform scaling, and

B. you want them all at scale factors of 1 and rotation of 0 [the defaults], and

C. the list is a list of points, that is, of point-coordinate lists, not just a list of numbers:

 

(mapcar '(lambda (x) (command "._insert" "Blockname" x "" "" "")) krd)​

 

Kent Cooper, AIA
Nachricht 6 von 11
EnM4st3r
als Antwort auf: steven.pyka

nein auf jede koordinate, aber wie @Kent1Cooper schon gesagt hat muss deine Liste richtig formatiert sein.
Hast du ein Beispiel wie euer satz mit Koordinaten Punkten aussieht?

Nachricht 7 von 11
steven.pyka
als Antwort auf: EnM4st3r

Hallo,

wir bekommen die Koordinaten in der Regel in dieser Form. Meine Idee ist halt eine Lisp zu entwickeln, mit welcher die Lisp auf die Datei zugreift. 

 

Wichtiger wäre aber erst einmal, dass ich nicht 30, 40 oder 100 mal den command Befehl schreiben muss, damit an jede Stelle ein Block abgelegt wird. 

Nachricht 8 von 11
EnM4st3r
als Antwort auf: steven.pyka

also so könnte es aussehen: x y z sind jeweils die koordinaten und dann eben '(x y z) so oft wiederholen wie nötig.

Als Blockname hab ich einfach mal "Test" genommen.

 

(defun c:InsBlock ()
  (setq kls (list '(x y z)))
  (mapcar '(lambda (x) (command "._insert" "Test" x "" "" "")) kls)
)

 

 

Im Beispiel wo du geschickt hast würde das dann so aussehen:

 

(defun c:InsBlock ()
  (setq kls (list '(4535025.06590	5671149.02110 0) '(4535188.67060	5671381.05720	0) '(4533954.18200	5673442.61600	0)
                   '(4533864.57040	5673460.07280	0) '(4533789.45770	5672816.59970	0) '(4533782.98800	5672825.49600	0) '(4533760.79770	5673470.60510	0)))
  (mapcar '(lambda (x) (command "._insert" "Test" x "" "" "")) kls)
)

 

 

Ist aber auch zeitaufwendig die Koordinaten so einzeln rein zu kopieren, am besten wär es die Koordinaten Liste direkt aus der Excel liste zu erstellen. Aber dafür sind meine Lisp Kenntnisse noch nicht gut genug

Nachricht 9 von 11
EnM4st3r
als Antwort auf: steven.pyka

Ah, und außerdem würde ich noch (falls du es nicht schon so gemacht hast) die Dezimaltrennzeichen von Komma auf Punkt wechseln so geht das rauskopieren schneller.

Dafür gehst du in Excel unter Datei -> Optionen -> Erweitert -> Trennzeichen vom Betriebssystem übernehmen

dort dann eben als Dezimaltrennzeichen ein Punkt nehmen.
Nachricht 10 von 11
EnM4st3r
als Antwort auf: steven.pyka

Ok hab eben noch bisschen in Excel rumprobiert und denk da kannst du die Koordinatenliste auch so erstellen wie du sie brauchst. Ich habe in Excel folgende Formel jeweils neben den Koordinaten in Zeile E reingemacht:

=TEXTKETTE("'(";B2;" ";C2;" ";D2;")")

in deinem Beispiel wäre hier:

B*= X

C*= Y

D*= Z

 

Wenn du diese Excel formel dann runterkopierst sollten sich die Zellen automatisch anpassen. Am ende hab ich noch folgende formel genommen um die einzelnen Koordinatenpunkte zu verbinden: 

=TEXTVERKETTEN(" ";WAHR;E:E)

 

das was dort rauskommst kannst du dann in der Lisp hinter (List...) einfügen.

Nachricht 11 von 11
b.rothacherCTT2X
als Antwort auf: steven.pyka

Nur so als möglicher denk Anstoss, es wäre auch möglich über eine Dynamo-Programmierung auf eine Lösung zu kommen.

 

Sie finden nicht, was Sie suchen? Fragen Sie die Community oder teilen Sie Ihr Wissen mit anderen.

In Foren veröffentlichen