Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Listen sortieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Listen sortieren (1309 mal gelesen)
cadplayer
Ehrenmitglied
CADniker


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 26. Jan. 2012 14:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 26. Jan. 2012 14:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich

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.


Sehen Sie sich das Profil von neurosis an!   Senden Sie eine Private Message an neurosis  Schreiben Sie einen Gästebucheintrag für neurosis

Beiträge: 222
Registriert: 22.08.2006

erstellt am: 26. Jan. 2012 15:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz