| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| | |
 | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
|
Autor
|
Thema: Listen sortieren (1660 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
    
 Beiträge: 1838 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 26. Jan. 2012 14:23 <-- editieren / zitieren --> Unities abgeben:         
Ich habe eine Liste, die ich sortieren muss nach der Eigenschaft "line" und "arc" sowie bei "arc" den Radius Ich möchte gern die die Werte aller Linienlängen addieren und die Bögen unter Berücksichtigung des Radius. Im alertfenster soll erscheinen Total length 189 Lines 120 Arc 1: 39 Arc 2:30 Hier mein Code, wie ich bisher vorging Code:
; string convert in list(defun str-to-list (str) (mapcar (function pl:read) (vl-remove "" (apply (function append) (mapcar (function (lambda (a) (pl:string->list a " "))) (pl:string->list str "\"")) ) ) ) ) (defun pl:string->list (_str _br / _pos) (if (setq _pos (vl-string-search _br _str)) (cons (substr _str 1 _pos) (pl:string->list (substr _str (+ (strlen _br) _pos 1)) _br)) (list _str) ) ) (defun pl:read (str / _chk) (cond ((vl-string-position 45 str 1) str) ((= "" (setq _chk (vl-string-trim "-0123456789" str))) (atoi str)) ((= "." _chk) (atof str)) ((= "," _chk) (atof (vl-string-translate "," "." str))) (t str) ) ) ;Selection set of line lengths are totaled and displayed. ;-------------------------------------------------- (defun GetArcLength (END_ANG START_ANG ARC_RAD / TOTAL_ANG) (setq TOTAL_ANG (- END_ANG START_ANG)) (while (< TOTAL_ANG 0) (setq TOTAL_ANG (+ TOTAL_ANG (* 2 pi))) ) (while (> TOTAL_ANG (* 2 pi)) (setq TOTAL_ANG (- TOTAL_ANG (* 2 pi))) ) (* (* 2 pi ARC_RAD) (/ TOTAL_ANG (* 2 pi))) ) ;-------------------------------------------------- ;get length of lwpolyline or polyline (no bulges) (defun GET_LWPL () (vl-load-com) ; (setq OBJ (vlax-ename->vla-object (car (entsel "Select entity: ")))) (setq OBJ (vlax-ename->vla-object ENT)) (if (vlax-property-available-p OBJ 'Length) (setq LWTLEN (vlax-get obj 'Length)) ; (princ "Entity has no Length property") (setq LWTLEN 0.0) ) (setq LLEN LWTLEN TLEN (+ LLEN TLEN) ) ) ;end GET_LWPL (defun c:ADDLINE () ;( / A B LEN TLEN LLEN ) (prompt "Select desired LINE and/or ARC entities ->") (terpri) (setq SS (ssget) SSZERO (ssadd) SSL (sslength SS) NUM 0 TLEN 0 LLEN 0 ) (repeat SSL (setq ENT (ssname SS NUM) ENTAL (entget ENT) ENTTYPE (cdr (assoc 0 ENTAL)) ) (cond ((eq ENTTYPE "LINE") (progn (GET_LWPL) (prompt (strcat "\n" (rtos NUM 2 0) " " ENTTYPE " " (rtos LLEN 2 2))) (setq llist (str-to-list (strcat "\n" (rtos num 2 0) " " enttype " " (rtos llen 2 2))))
;;; (setq LLIST (list LLIST)) )) ;;; ((eq ENTTYPE "POLYLINE") ;;; (progn ;;; (GET_LWPL) ;;; (prompt (strcat "\n" (rtos NUM 2 0) " " ENTTYPE " " (rtos LLEN 2 2))) ;;; )) ((eq ENTTYPE "ARC") (progn ; Get the Arc's dimensional data: (setq SA (cdr (assoc 50 ENTAL)) ;start angle EA (cdr (assoc 51 ENTAL)) ;end angle AR (cdr (assoc 40 ENTAL)) ;arc radius ) ; Calculate the ARC's length: (setq AL (GetArcLength EA SA AR) ;arc length LLEN AL TLEN (+ LLEN TLEN) ) (if (eq LLEN 0.0) (ssadd ENT SSZERO)) (prompt (setq ALIST (strcat "\n" (rtos NUM 2 0) " " ENTTYPE " " (rtos LLEN 2 2) " " (rtos AR 2 2)))) (setq alist (str-to-list (strcat "\n" (rtos num 2 0) " " enttype " " (rtos llen 2 2) " " (rtos ar 2 2)))) )) ;;; ((eq ENTTYPE "LWPOLYLINE") ;;; (progn ;;; (GET_LWPL) ;;; (prompt (strcat "\n" (rtos NUM 2 0) " " ENTTYPE " " (rtos LLEN 2 2))) ;;; )) (ENTTYPE (progn (ssadd ENT SSZERO) (prompt (strcat "\n" (rtos NUM 2 0) " " ENTTYPE " " "Length not found.")) ) ) ) (setq NUM (1+ NUM)) ) (setq SHOWLEN (strcat "\nTotal length: " (rtos TLEN 2 2) " and [" (rtos (sslength SSZERO) 2 0) "] object(s) ignored." ) ) (alert SHOWLEN) (princ) ) ;-
------------------ Gruss Dirk [Diese Nachricht wurde von cadplayer am 26. Jan. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13533 Registriert: 30.11.2003 .
|
erstellt am: 26. Jan. 2012 14:59 <-- editieren / zitieren --> Unities abgeben:          Nur für cadplayer
wo haste denn das her ? nun ja .. versuchs hiermit : (defun C:Linfo(/ AWS LL ARCGL ARCLIST) (vl-load-com) (if(setq AWS(ssget '((0 . "LINE,ARC")))) (progn (setq LL 0 ARCGL 0) (mapcar '(lambda(X / OBJ L R) (and(=(type(setq OBJ(cadr X)))'ENAME) (setq OBJ(vlax-ename->vla-object OBJ)) (setq L(vlax-curve-getDistAtParam OBJ (vlax-curve-getendparam OBJ))) (or(and(=(strcase(vla-get-objectname OBJ))"ACDBLINE") (setq LL(+ LL L)) ) (and(=(strcase(vla-get-objectname OBJ))"ACDBARC") (setq ARCGL(+ ARCGL L)) (setq R(rtos(vla-get-radius OBJ)2 3)) (or(and(setq ARCL(cadr(assoc R ARCLIST))) (setq ARCLIST(subst (list R (+ ARCL L))(assoc R ARCLIST)ARCLIST)) ) (setq ARCLIST(cons(list R L) ARCLIST)) ) ) ) ) ) (ssnamex AWS) ) (alert (strcat "Gesamtlänge : " (rtos (+ ARCGL LL) 2 3) "\n...der Linien : "(rtos LL 2 3) (if ARCLIST (strcat "\n...der Bögen : " (apply 'strcat (mapcar '(lambda(X)(strcat "\nR="(car X) "\t"(rtos(cadr X)2 3)))ARCLIST)) ) "" ) ) ) ) ) (princ) ) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
 
 Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 26. Jan. 2012 15:03 <-- editieren / zitieren --> Unities abgeben:          Nur für cadplayer
hallo dirk, unabhaengig von deinem code, schaff dir doch eine liste in der form: ((LINE . SummeDerEinzelnenLaengen) (ARC ((ArcRadius1 . SummeDerEinzelnenRadien1) (ArcRadius2 . SummeDerEinzelnenRadien1)))) wenn du eine linie hast, addierst du die laenge dieser zur summe der linien. wenn du einen bogen hast, nachschauen, ob der radius schon vorhanden ist; wenn nicht neue unterliste anlegen, wenn ja aufaddieren. gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
cadplayer Ehrenmitglied CADniker
    
 Beiträge: 1838 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 26. Jan. 2012 15:35 <-- editieren / zitieren --> Unities abgeben:         
Ja ich hab (wie so oft) etwas aus dem Netz gefischt... und dann weiter dran rum gewurschtelt. Super von dir cadmium, das du mir die ganze Arbeit abgenommen hast. Ich lerne da super kniffe von dir ... @neurosis: das war eigentlich mein Plan - die Umsetzung fiel mir schwer: An dem Punkt, wo ich die Listen für die Linien und Bögen zusammenrechnen sollte. Bei den Linien ist es klar. Aber bei den Bögen weiss ich nicht genau, wie ich es hinbekomme, dass alle Radien x entsprechend addiert werden. PS.: Puunkte vergeben - muss das erstmal sacken lassen ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |