| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Polylinien mit bestimmter Länge auf Layer legen (543 / mal gelesen)
|
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 10:19 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, ich habe immer wieder Zeichnungen in denen alle Elemente auf dem Layer 0 liegen und die Farbe weiß haben. Jetzt möchte ich alle Polylinien mit bestimmten Längen auf einen neu zu erstellenden Layer legen. Ich habe bisher diesen Code, der aber leider nicht funktioniert. (defun c oly-t () (setq layer_name "Beschriftung") (setq layer_exists (tblsearch "LAYER" layer_name)) (if (not layer_exists) (progn (command "_layer" "_n" "layer_name" "FA" "142" "layer_name" "") ) ) (setq lengths '(30.0 40.0 50.0 60.0)) (setq polyline_list '()) (setq ss (ssget "_X" '((0 . "LWPOLYLINE")))) (if ss (progn (setq i 0) (while (< i (sslength ss)) (setq polyline (ssname ss i)) (setq length (cdr (assoc 42 (entget polyline)))) (if (member length lengths) (setq polyline_list (cons polyline polyline_list)) ) (setq i (1+ i)) ) (command "_.CHPROP" polyline_list "" "LA" "" layer_name "") ) ) (princ) ) In der Befehlszeile wird als letztes der Befehl _.chprop aufgerufen und dann kommt die Aufforderung Objekte wählen und danach wird der Befehl Poly-T erneut aufgerufen.
Könnt Ihr mir hier vielleicht helfen? Vielen Dank Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
elroy-CAD Mitglied Dipl.-Ing. (FH) kommunaler Tiefbau
Beiträge: 64 Registriert: 15.07.2009 WIN 11 23H2 64bit ---------------------- Intel(R) Core(TM) CPU i7-13700K @ 3.40 GHz 32 GB RAM NVIDIA RTX A4000 ------------------- C3D2023 VESTRA INFRAVISION Build 64 BaSys 9.23
|
erstellt am: 24. Jan. 2024 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Hallo, ich mache das so, dass ich: - 1 Polylinie anklicken - rechts-Klick Änliche auswählen - rechts-Klick Schnellauswahl - dann Länge angeben, oder länger als, oder kürzer als, etc. viele Grüße ------------------ Gruß elroy-CAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 10:52 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Hi, >> (setq length (cdr (assoc 42 (entget polyline)))) LENGTH solltest du nicht benutzen, damit überschreibst du eine existierende native Lispfunktion (LENGTH halt..) >> (ssget "_X" '((0 . "LWPOLYLINE")))) & (setq length (cdr (assoc 42 (entget polyline)))) Gruppencode 42 einer LW Polylinie kommt mehrfach vor, dich interessiert aber nur der erste Eintrag - ok.
ALLERDINGS: gc42 hat nichts mit einer Art von Länge oder Anzahl zutun, daher die Frage: Bist du sicher das du das richtige machst? Was willst du?
>> (command "_.CHPROP" polyline_list "" "LA" "" layer_name "")
die polyline_list ist eine Liste voll mit ENAMEs der Polylinien. Mir wäre nicht bekannt das der Befehl eine Liste von ENAMEs akzeptiert! Hast du das denn mal per Hand in der Befehlszeile gestestet? IMO, dein SS wäre an der Stelle angebracht, der Befehl möchte einen Auswahlsatz(ss) oder immer nur EINEN ENAME haben/keine Liste.
Allerdings: Wenn du das ganz testest, zunächst mit ss oder per Mauswahl oder sonstigem, auch dann wird es crashen.. Da stellst sich mir die Frage wie du zu dem Code kommst!? In dem command gibst du die Option LA für Layer an, bestätigst dann den Vorgabewert und schickst dann einen Layernamen an den Befehl.. Gehe das in der Befehlszeile noch einmal durch, da stimmt was nicht. >"Ich habe bisher diesen Code" hatt mich veranlasst zu denken das es DEIN Code wäre, wobei ich sehr gerne weiterhelfe! Nach dem lesen des Codes sieht das aber eher so aus als wäre der Code nicht von dir geschrieben worden? Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 12:30 <-- editieren / zitieren --> Unities abgeben:
@ elroy-CAD Ich habe täglich mehrere Zeichnungen und immer 10 Polylinientypen die ich so wählen müsste. Was du beschreibst ist mein aktueller Weg, den würde ich allerdings gerne abkürzen. @cadffm Der Code ist nicht von mir. Ich habe hier schon nach einer Lösung gesucht und es dann, nachdem ich einen entsprechenden Beitrag gelesen habe, mit ChatGPT versucht und das ist dabei heraus gekommen. Was ich brauche ist ein Code der alle geschlossenen Polylinien mit bestimmten Längen (10 an der Zahl) auf einen neuen Layer legt. Ist der Layer nicht vorhanden soll er erstellt werden. Beste Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
|
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 14:17 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für deine Unterstützung. Aber leider funktioniert es noch nicht. Ich bekomme die Meldung das keine Polylinien mit zutreffenden Längen gefunden wurden. Kann es an den Nachkommastellen liegen? Im Autocad sind zwei Nachkommastellen eingestellt. Wenn ich die Längen in deinem Code auf 8 Nachkommastellen eintrage, kommt leider auch diese Meldung und im Textfenster werden bei "Aktuelle Längenliste" nur 3 Nachkommastellen angezeigt. Beste Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
>>"Kann es an den Nachkommastellen liegen?" Könnte so sein, wenn deine Polylinien eine Länge haben welche sich in den ersten 5 Nachkommastellen(gerundet) von den Vorgabe-Längen unterscheiden. >>"Im Autocad sind zwei Nachkommastellen eingestellt" Im AutoCAD kann man nur die ANZEIGE der Nachkommastellen einstellen, das hat also nichts mit dem Programm zutun. Allerdings gehst du deswegen vielleicht von den falschen Längen aus? Stelle LUPREC auf 8 und prüfe die Polylinien-Länge noch einmal.. >>"Wenn ich die Längen in deinem Code auf 8 Nachkommastellen eintrage, kommt leider auch diese Meldung" Das würde ja ein Wissender schnell gecheckt haben woran es liegt. Der Code liegt schon vor, was fehlt sind die CAD-Daten. Beides zusammen hast nur du.. >>"und im Textfenster werden bei "Aktuelle Längenliste" nur 3 Nachkommastellen angezeigt." 3 Nachkommastellen? Sicher das du noch von dem hier veröffentlichtem Code redest und nicht von einer von dir bereits geänderten und uns völlig unbekannten Abwandlung? hmm, da fällt mir gerade nichts dazu ein. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 14:58 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
noch einmal Hi, Das Programm hat einen Fehler, zumindest wenn man nicht mit so schönen Längen wie 30 40 50 zutun hat. Ich nehme an du hast es überhaupt nicht mit den von dir stammenden Längen getestet!? Damit das dann mit Fließkommazahlen und den einhergehenden Rundungsfehlern "irgendwie" funktioniert, muss aber umgebaut werden. Ich hänge gleich mal eine neue Version an <siehe oben> Die Längen müssen bis zur 5.Nachkommastelle passen, das bedeutet aber auch das man keine genaueren Vorgabe-Längen angeben kann (alles ab Stelle5 wird praktisch ignoriert bzw. toleriert) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 15:01 <-- editieren / zitieren --> Unities abgeben:
Okay, ich habe jetzt die Längen der Polylinien auf 5 Nachkommastellen gerundet eingetragen. Bekomme aber leider wieder die gleiche Meldung, Keine Polylinien mit zutreffenden Längen gefunden. Im Anhang dein Code mit meinen Längen, eine Beispiel dwg und ein Screenshot vom Textfenster. Wäre toll wenn du dir das noch einmal ansehen könntest. Beste Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 15:05 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 15:17 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Danke für das Beispiel, das sollte jetzt funktionieren.. (ungetestet) EDIT: Stellschraube für die Genauigkeit ist das equal im Code : Deine Windows Regional-Amgaben oder Unicode-Handling - Ich merke mir nie and was es liegt, passt nicht so ganz. Der Screenshot von der Befehlzeile... die Umlaute können nicht dargestellt werden. DAS wird irgendwann zu Problemen führen.
Ist das auch noch so nach ACAD-Neustart, wenn vorher LISPSYS auf 0 gestellt wurde? (Wer keinen Grund dagegen kennt, der sollte LISPSYS auf 0 stellen) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 24. Jan. 2024 16:26 <-- editieren / zitieren --> Unities abgeben:
Hallo Sebastian, ich denke ich habe einen Fehler beim Abschreiben drin, finde den aber nicht. Ich bekomme schon beim Laden den Fehler "Falsch formatierte Liste in der Eingabe". (defun c:Poly-t (/ aAWS) ; (c:Poly-t) (and (setq aAWS (ssadd)) (or (= 'LIST (type Poly-t_lengthlist)) (setq Poly-t_lengthlist '(115.39822 123.89083 164.76911 171.70134 127.50081 185.33769 151.66459 132.11922 121.75128 149.91479))) (or (= 'STR (type Poly-t_targetlayer)) (not(command "_.-LAYER" "_new" (setq Poly-t_targetlayer "Beschriftung") "_co" "142" Poly-t_targetlayer ""))) (princ(strcat "\nAktuelle Längenliste: (setq Poly-t_lengthlist `" (vl-princ-to-string Poly-t_lengthlist) "\n")) (vlax-for item (vla-get-Modelspace(vla-get-activeDocument(vlax-get-acad-object))) (if (and (= (vla-get-Objectname item) "AcDbPolyline") (= :vlax-true (vla-get-Closed item))) (if (member T (mapcar '(lambda(v)(equal (vla-get-Length item) v 0.00001)) Poly-t_lengthlist) (progn (ssadd (vlax-vla-object->ename item) aAWS) (vla-put-Layer item Poly-t_targetlayer) ) ) ) ) ) (if (and(zerop(sslength aAWS))(= 1 (getvar 'TILEMODE))) (princ "\nKeine Polylinien mit zutreffenden Längen gefunden\n") (progn (sssetfirst nil aAWS) (alert (princ (strcat "Markiert und Layer gesetzt bei " (if (= 1 (sslength aAWS)) "einem" (rtos(sslength aAWS)2 0)) " Objekt" (if (= 1 (sslength aAWS)) "" "en") ) ) ) ) ) (princ "\nPoly-t im Modellbereich ausgeführt") (princ) ) (princ "\nPoly-t geladen") (princ) Beste Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Jan. 2024 17:13 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Ich kann das jetzt nicht testen und deinen Code prüfe ich jetzt nicht. Aber abschreiben??? Einfach die Datei speichern, laden, starten. Schau das eine geschlossene Polylinie mit Länge 30 da ist, nur um unnötig Fehler auszuschließen. Wenn das nicht klappt, habe ich wohl etwas verbockt - sehe es mir morgen an. Funktioniert das oder nicht? Wenn es klappt, dann öffne die LSP und ändere die Vorgabelängen, speichern. Testdatei neu öffnen(!) , Lisp laden, ausführen, und? Übrigens enthält der Code keine Layerkontrolle, du musst selbst dafür sorgen das die Polylinien nicht auf gesperrten Layern liegen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 25. Jan. 2024 01:18 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Getestet: Das Programm funktioniert (und mit deinen Werten auch in deiner Datei getestet), du hast dich also wirklich vertippt. Warum tippst du das ab, statt die Datei herunter zu laden und zu verwenden, IT Sperre !? Teste es Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Entsorger01 Moderator Techniker
Beiträge: 3314 Registriert: 07.07.2006 ACAD 2021 Acrobat Prof. Creative Suite WIN10
|
erstellt am: 25. Jan. 2024 06:27 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
|
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: 25. Jan. 2024 08:20 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Zitat: Original erstellt von -Stephan-: ...mit ChatGPT versucht und das ist dabei heraus gekommen...
Hi,
mal zum Thema Autolisp über ChatGPT. (wahrscheinlich ein Thema für einen eigenen langen, langen Thread) Der Code, der autom. generiert wird, kann nur so gut sein, wie die Trainingsdaten, die verwendet wurden - also das, was bis dato im Netz veröffentlicht wurde. Das ist bisher, neben funktionierendem Code, häufig fehlerhafter oder uralter Code oder Brocken, die nie funktioniert haben. Dazu kommt, dass wirklich professioneller Autolisp-Code mutmaßlich seltener veröffentlicht wird als der von anderen Sprachen. Soll heißen, dass die Qualität der Trainingsdaten für Autolisp offenbar nicht gut ist. (Und neuerdings kommt vermehrt "KI"-Code wie deiner dazu. Sieht also schlecht aus für die Trainingsdaten der Zukunft. ) Zudem kann ChatGPT seinen Code selbst nicht evaluieren und das zeigt das eigentliche Problem dieser sogenannten KIs: Die Ergebnisse sehen häufig plausibel aus, stimmen, bzw. funktionieren aber einfach nicht. Das soll nicht heißen, dass alles Mist ist, was die Maschine auswirft. Einfachste Funktionen wie das Erzeugen eines Layers kann der Gerät korrekt schreiben, aber ab einer leichten Komplexitätssteigerung wie 'Wähle alle Polylinien der Länge 42' aus, wird's sehr häufig sehr dünn. Gruß CADchup ------------------ CADmaro.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-Stephan- Mitglied
Beiträge: 11 Registriert: 11.05.2016 AutoCAD 2022 Inventor 2022 3DS Max 2022
|
erstellt am: 25. Jan. 2024 09:25 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: Getestet: Das Programm funktioniert (und mit deinen Werten auch in deiner Datei getestet), du hast dich also wirklich vertippt. Warum tippst du das ab, statt die Datei herunter zu laden und zu verwenden, IT Sperre !? Teste es
Hallo Sebastian, ich wusste nicht das du den Anhang in einer deiner vorherigen Antworten geändert hast. Ich habe nur das JPG in diesem gesehen. Jetzt läuft dein Code. Vielen Dank für deine Hilfe. Beste Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3074 Registriert: 26.08.2002 ACAD R11 - 2022 (Plant3D) AVIS ACAD LT 2013- 2021 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 25. Jan. 2024 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Zitat: Original erstellt von CADchup:
Hi,
mal zum Thema Autolisp über ChatGPT. (wahrscheinlich ein Thema für einen eigenen langen, langen Thread) Der Code, der autom. generiert wird, kann nur so gut sein, wie die Trainingsdaten, die verwendet wurden - also das, was bis dato im Netz veröffentlicht wurde. Das ist bisher, neben funktionierendem Code, häufig fehlerhafter oder uralter Code oder Brocken, die nie funktioniert haben. Dazu kommt, dass wirklich professioneller Autolisp-Code mutmaßlich seltener veröffentlicht wird als der von anderen Sprachen. Soll heißen, dass die Qualität der Trainingsdaten für Autolisp offenbar nicht gut ist. (Und neuerdings kommt vermehrt "KI"-Code wie deiner dazu. Sieht also schlecht aus für die Trainingsdaten der Zukunft. ) Zudem kann ChatGPT seinen Code selbst nicht evaluieren und das zeigt das eigentliche Problem dieser sogenannten KIs: Die Ergebnisse sehen häufig plausibel aus, stimmen, bzw. funktionieren aber einfach nicht. Das soll nicht heißen, dass alles Mist ist, was die Maschine auswirft. Einfachste Funktionen wie das Erzeugen eines Layers kann der Gerät korrekt schreiben, aber ab einer leichten Komplexitätssteigerung wie 'Wähle alle Polylinien der Länge 42' aus, wird's sehr häufig sehr dünn. Gruß CADchup
Alte Weisheit in db "shit in = shit out"
wink cw
------------------ Also ich finde Unities gut ... und andere sicher auch ------------------------------------------------ cadwomen™ Plant ist nur die Spitze des Berges der da treibt ? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 25. Jan. 2024 09:47 <-- editieren / zitieren --> Unities abgeben: Nur für -Stephan-
Wenn du die Funktion ausführst, dann soll dich die Anzeige wie zB. Aktuelle Längenliste: (setq Poly-t_lengthlist '(30 40 50 60 43.93235100))
1. daran erinnern welche Längenwerte aktuell genutzt werden 2. daran erinnern wie du das auch mal temporär umstellen kannst, zum Beispiel auch für eine Automation Befehl: (setq Poly-t_lengthlist '(33 44 55)) Befehl: (c:Poly-t) Wenn du dann vielleicht irgendwann angefangen hast Lisp zu lernen, dann kannst du dir dafür extra Befehle erstellen oder Optionen in die Vorhandene einbauen, bis dahin würdest du es aber auch so wie gezeigt verwenden können, ohne jedes Mal den Code zu ändern. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |