| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| | |
 | NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition, eine Pressemitteilung
|
|
Autor
|
Thema: Flächen pro Layer aus Schraffuren (219 / mal gelesen)
|
Helmi3000 Mitglied
 
 Beiträge: 191 Registriert: 04.02.2013 ADT 2025 Lenovo p16s nVidia T550
|
erstellt am: 18. Mai. 2026 07:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe hier mal gefragt wie ich die Gesamtfläche von Schraffuren eines bestimmten Layer bekomme https://ww3.cad.de/foren/ubb/Forum54/HTML/035642.shtml Es gibt hier tolle Hilfen aber ich würde gerne das ohne Zusatzprogramme lösen, kann man das auch mit einer LISP heraus bekommen? Dabei denke ich hauptsächlich an die Lösung von Piwurzel mit Datenextraktion. Was stelle ich mir vor: Layer wählen (mehrere wenn möglich) dann sollen die Flächen der Schraffuren die auf diesen Layer ligen nach Layer zusammengerechnet werden und mir das Ergebnis angezeigt werden. Ich brauch hier am Ende keine Tabellen oder Excel Listen, nur das Ergebnis. Layer A / B / C wählen Ergebnis: Layer A =50m2, Layer B=12m2 und Layer C=125m2 Wenn das nicht geht vieleicht geht dann eine Einfache Version mit Layer Name eingeben und Ergebnis erhalten Layer A Ergebnis: 50m2 könnte man das mit einer LISP erstellen?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 18. Mai. 2026 08:37 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von Helmi3000: könnte man das mit einer LISP erstellen?
Ja. Und das kann man sehr einfach feststellen: (setq obj (vlax-ename->vla-object (car (entsel)))) #<VLA-OBJECT IAcadHatch2 000000006977A070> (vlax-property-available-p obj 'area ) T (vlax-get-property obj 'area) 18587.3556828403
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Helmi3000 Mitglied
 
 Beiträge: 191 Registriert: 04.02.2013 ADT 2025 Lenovo p16s nVidia T550
|
erstellt am: 18. Mai. 2026 11:17 <-- editieren / zitieren --> Unities abgeben:         
bin hier Anfänger was das Thema an geht, was genau macht dieser Code? Ich klicke auf ein Objekt und der sagt mir welche Fläche der hat? Code: (setq obj (vlax-ename->vla-object (car (entsel)))) #<VLA-OBJECT IAcadHatch2 000000006977A070>(vlax-property-available-p obj 'area ) T (vlax-get-property obj 'area) 18587.3556828403
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 18. Mai. 2026 12:40 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von Helmi3000: bin hier Anfänger was das Thema an geht, was genau macht dieser Code? Ich klicke auf ein Objekt und der sagt mir welche Fläche der hat? Code: (setq obj (vlax-ename->vla-object (car (entsel)))) #<VLA-OBJECT IAcadHatch2 000000006977A070>(vlax-property-available-p obj 'area ) T (vlax-get-property obj 'area) 18587.3556828403
Du hast im Lisp-Forum nach einer Lösung in Lisp gefragt. Du solltest Dich also ganz, ganz minimal selbst mit Lisp befassen, und dann weisst Du auch,was dieser Code macht. Oder wolltest Du die Kosten für die Programmierung Deines Problems nachfragen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
 
 Beiträge: 406 Registriert: 15.07.2011 ACA2020 Windows11
|
erstellt am: 20. Mai. 2026 08:55 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Hallo, ja, mit Lisp super easy. Wo stehst du denn als Anfänger? Mapcar´s Seiten gelesen? Das gelieferte Beispiel von archtools finde für den Anfang etwas abschreckend. Für einen Anfänger möchte ich behaupten ist hier das filtern der Auswahl (Listen bilden) nach Layern eher das Problem als wie das Ergebnis einer Schraffur zu erhalten. Code: ;Start wäre z.B.(setq ss (ssget '((0 . "HATCH")))) ;Alle Schraffuren der Auswahl ;dann vielleicht so (setq Zähler -1) (repeat (sslength ss) (setq 1Schraff (ssname ss (setq Zähler (1+ Zähler))) ; 1Schraff verarbeiten / Hier liste (Ergebnis) bilden ) ) ;oder so (foreach 1Schraff (vl-remove-if-not '(lambda (x) (= 'ENAME (type x))) (mapcar 'cadr (ssnamex ss)) ) ; 1Schraff verarbeiten / Hier liste (Ergebnis)bilden ) ;dann das Ergebnis Ausgeben.
------------------ Gruß Wolfgang  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 20. Mai. 2026 09:54 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von Meldin: Das gelieferte Beispiel von archtools finde für den Anfang etwas abschreckend
Erstens habe ich kein Beispiel geliefert, sondern die Funktion genannt, mit der man die Fläche aus einer Schraffur auslesen kann. Genau danach war ja gefragt. Das kann also schon prinzipiell nicht abschreckend sein. Und lustigerweise hast Du zwar einigen Code für die Bearbeitung von Auswahlsätzen und den Entities darin geliefert, aber genau das weggelassen, was nötig wäre, also das, wonach gefragt wurde. Ich finde Deine Art der Listenverarbeitung auch ziemlich unelegant, weil unlispisch. Wir sind Lisp-Programmierer, und in Lisp geht das besser. Wir wandeln dazu einen Auswahlsatz immer in eine Liste der darin enthaltenen Entities um, und dann stehen uns all die hocheffizienten Funktionen von Lisp zur Listenverarbeitung zur Verfügung. Wie sollte also die fertige Funktion aussehen? So: 1. Auswahlsatz mit Schraffuren auf Layer "SCHRAFF" bilden und in Liste umwandeln 2. Die Flächen aller Entities darin auslesen und die Summe daraus bilden. Das sieht dann so aus: Code:
;; das ist nur ein Beispiel. Man würde so eine Funktion ;; nicht mit einem festen Layernamen "SCHRAFF" hart verdrahten, ;; sondern je nach Bedarf anders auslesen(defun c:schraffflaechen () (apply '+ (mapcar 'getarea (ss->list (ssget "X" '((0 . "HATCH")(8 . "SCHRAFF")) ) ) ) ) )
Dafür brauchen wir noch zwei Hilfsfunktionen, nämlich GETAREA, das aus einem Entity dessen Fläche ausliest, und SS->LIST, das aus einem Auswahlsatz eine Liste bastelt. Die Funktion GETAREA würde man im Lauf der Zeit immer weiter aufbohren, damit sie die Flächen aller möglichen Elemente auslesen kann. Code:
(defun ss->list (sset / eset counter) (setq counter 0) (if (= 'PICKSET (type sset)) (repeat (sslength sset) (setq eset (cons (ssname sset counter) eset) counter (1+ counter) ) ) ) eset ) (defun getarea (en / obj objarea) (setq obj (vlax-ename->vla-object en)) (if (vlax-property-available-p obj 'area) (setq objarea (vlax-get-property obj 'area)) (setq objarea 0.0) ) objarea )
Man baut sich in LISP immer vorzugsweise solche kleinen, allgemein anwendbaren Hilfsfunktionen, die man dann in einer Funktionsbibliothek sammelt. Im Lauf der Jahre wird man damit ein sehr mächtiges Werkzeug schaffen, und kann dann auch komplexe Probleme mit minimalem Aufwand lösen. Wer so eine Bibliothek von Hilfsfunktionen hat, der kann ein neues Programm bestimmt 10 mal schneller liefern als jemand, der alles immer wieder neu bastelt. Mit anderen Worten: man wird als professioneller Programmierer dann auf einen 10 mal höheren Stundenlohn kommen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung und AutoLISPler
    
 Beiträge: 1783 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 20. Mai. 2026 10:11 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Hallo archtools, kleine Anmerkung: bei Deiner Funktion getarea würde ich bei ungültigen 'area-Eigenschaften aber nicht einfach 0.0 zurückgeben, sondern die betreffenden Schraffur in ein SelectionSet packen. Dann können die Flächen abschließend z.B. mit sssetfirst selektiert werden und eine Info an den Benutzer ausgegeben werden, dass die Flächensumme falsch ist. Ich habe gerade wieder ein aktuelles Beispiel: in AutoCAD 2021 ist die Flächeneigenschaft fehlerhaft, in BricsCAD ist alles ok. ------------------ viele Grüße Jörn bosse-engineering.com Der Multifilter (V 1.1) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 20. Mai. 2026 10:29 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von joern bosse: Hallo archtools, kleine Anmerkung: bei Deiner Funktion getarea würde ich bei ungültigen 'area-Eigenschaften aber nicht einfach 0.0 zurückgeben, sondern die betreffenden Schraffur in ein SelectionSet packen.
Es MUSS 0.0 zurück gegeben werden, weil Du sonst aus der Ergebnisliste nicht mit (apply '+ ...) die Summe bilden kannst. Die Prüfung auf korrekte Objektwahl sollte im Vorfeld geschehen, und nicht erst innerhalb der GETAREA Funktion. Zwei Gründe dafür: erstens Performance, zweitens Allgemeingültigkeit bei späteren Erweiterungen. Wie ich schon geschrieben habe, würde man die Funktion GETAREA im Lauf der Zeit immer weiter aufbohren. Man würde auch die Flächen aller möglichen CURVE-Entities mit ausgeben, voN Regionen uswusuf.. Und man würde als Arguemnt nicht nur einen Entity- oder Objektnamen zulassen, sondern auch eine Liste mit solchen und sogar ein Pickset. Damit würde die aufrufende Funktion noch einfacher und zugleich allgemeingültiger werden.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung und AutoLISPler
    
 Beiträge: 1783 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 20. Mai. 2026 11:13 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat:
Es MUSS 0.0 zurück gegeben werden, weil Du sonst aus der Ergebnisliste ...
Da hast Du sicherlich recht, aber wenn ich sage, es MUSS auf die fehlerhaften Flächen hingewiesen werden, dann ist das auch richtig. Eine falsche Flächensumme nützt ja keinem was. Bei meiner fehlerhaften Fläche muss ich die Prüfung zudem wie folgt gestalten, weil die Eigenschaft 'area zwar vorhanden ist, aber der Wert trotzdem fehlerhaft ist:
Code:
(if(and (vlax-property-available-p vla-obj 'area) (not(vl-catch-all-error-p (vl-catch-all-apply 'vla-get-area (list vla-obj)))) )....
Ein Bild zu meinen Schraffureigenschaften mit fehlerhafter Fläche habe ich beigefügt.
------------------ viele Grüße Jörn bosse-engineering.com Der Multifilter (V 1.1) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 20. Mai. 2026 12:35 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von joern bosse:
Da hast Du sicherlich recht, aber wenn ich sage, es MUSS auf die fehlerhaften Flächen hingewiesen werden, dann ist das auch richtig.
Wie gesagt: sowas sollte in der aufrufenden Funktion geprüft werden. Es sollte aber nicht zu einem Programmabbruch führen. GETAREA darf dann für ein Entity ohne Fläche gerne NIL zurück geben, und dann kann das eben in der aufrufenden Funktion vor der Weiterverarbeitung geprüft werden. Solche Prüfungen würd ich schon aus Performancegründen nie in die Bibliotheksfunktionen legen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
 
 Beiträge: 406 Registriert: 15.07.2011 ACA2020 Windows11
|
erstellt am: 20. Mai. 2026 16:54 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Sorry, habe die Frage anscheinend Falsch verstanden, die kosten und Gewinnoptimierung in Kombination mit Effektivität ist mir bei der Komplexität der Frage völlig entglitten. Daher wäre meine Antwort so natürlich voll aus dem Kontext: Code: (defun c:Layerflächen (/ AUSWERTUNG FLÄCHENLISTE LAYERNAME SS TEILAREA) (if (setq ss (ssget '((0 . "HATCH")))) (progn (foreach teil (mapcar 'cadr (ssnamex ss)) (and (= 'ENAME (type teil)) (setq LayerName (cdr (assoc 8 (entget teil)))) (setq Flächenliste (cons (list LayerName (getpropertyvalue teil "Area")) Flächenliste ) ) ) ) (setq Flächenliste (vl-sort Flächenliste (function (lambda (e1 e2) (< (car e1) (car e2)))) ) ) (setq TeilAREA 0.0) (while Flächenliste (cond ((= (caar Flächenliste) (caadr Flächenliste)) (setq TeilAREA (+ TeilAREA (cadar Flächenliste)) ) ;(cadadr Flächenliste)) ) (t (progn (setq auswertung (cons "\n" (cons (list (caar Flächenliste) (+ (cadar Flächenliste) TeilAREA) ) auswertung ) ) ) (setq TeilAREA 0.0) ) ) ) (setq Flächenliste (cdr Flächenliste)) ) (alert (vl-princ-to-string auswertung)) ) ) (princ) )
------------------ Gruß Wolfgang  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Helmi3000 Mitglied
 
 Beiträge: 191 Registriert: 04.02.2013 ADT 2025 Lenovo p16s nVidia T550
|
erstellt am: 26. Mai. 2026 12:32 <-- editieren / zitieren --> Unities abgeben:         
Hallo, sorry, das ich nicht oben geschrieben habe das ich in LISP Anfänger bin. Ich Danke Euch für die Antworten ich schau mir das alles noch genau an falls ich noch Fragen habe melde ich wieder DANKE! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
   
 Beiträge: 1099 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 26. Mai. 2026 15:46 <-- editieren / zitieren --> Unities abgeben:          Nur für Helmi3000
Zitat: Original erstellt von Helmi3000: sorry, das ich nicht oben geschrieben habe das ich in LISP Anfänger bin
Das macht gar nix, solange Du wirklich versuchst, Dir selbst eine Lösung zu erarbeiten. Du kannst gerne hier nachfragen, wenn Du auf Probleme stößt. Aber arbeite Dich erst mal in die allergrundlegendsten Grundlagen ein. Am besten auf den Anfänger-Seiten von Mapcar: https://www.autolisp.info/
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |