Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Überprüfung von Elementwahl

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
Autor Thema:   Überprüfung von Elementwahl (201 mal gelesen)
ryfCAD
Mitglied
Architekt


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

Beiträge: 106
Registriert: 21.06.2005

rC Architektur: Freeware für AutoCAD und GstarCAD

erstellt am: 23. Aug. 2019 12:55    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

Hallo zusammen,

ich habe ein Tool zur Ermittlung der Neigung einer Linie erstellt.

Frage:
Die Prüfung ob die Elementwahl eine Linie ist, geht doch sicher viel einfacher oder?
Elegant wäre doch, wenn sich eine Einzelwahl wiederholt, bis das gewählte Element eine Linie ist oder auch wenn nichts gewählt wird. while, cond... ich kriege es einfach nicht hin.

Hier mal der Code (ich programmiere immer vollständig mit allen setq etc.)

----------------------------------------------------------------------------

(defun c:rC-Messen_Winkel-Prozent( / element sli li x1 x2 y1 y2 proz e_liste typ Prozentstr winkel Winkelstr)
;Meldung
(princ " ")
(princ "\nrC © ryfB  FUNKTION: misst Neigung einer Linie in Grad und %\n ")
(princ)
;Linie wählen:
(setq sli (entsel "\nBitte NUR Linie wählen: "))
;Wahl in Liste übergeben
(setq element (car sli))
;ist etwas gewählt?
(if sli
(progn
;Suchen nach Elementtyp aus der Liste
(setq e_liste (entget element))
(setq typ (cdr (assoc 0 e_liste)))
;wenn Linie dann...
(if
(= typ "LINE")
(progn
(setq li (entget (car sli)))
;Koordinaten der Punkte filtern (da Winkelauswahl 50 nicht möglich)
(setq x1 (car (cdr (assoc 10 li))))
(setq y1 (cadr (cdr (assoc 10 li))))
(setq x2 (car (cdr (assoc 11 li))))
(setq y2 (cadr (cdr (assoc 11 li))))
;Berechnung %-Wert und Umwandlung in Format XX.X und Anhang "%"
(setq proz (abs (* (/ (- y1 y2) (- x1 x2)) 100)))
;Umwandlung in String für Ausgabe
(setq Prozentstr (rtos proz 2 2))
;Berechnung des Winkels
(setq winkel (/ (* (ATAN (/ proz 100.0)) 180.0) pi))
;Umwandlung in String für Ausgabe
(setq Winkelstr (rtos winkel 2 2))
;Ausgabe
(alert
(strcat
"\n
rC © ryfB
\n
Die Neigung beträgt:\n\n"
Winkelstr "°  =  " Prozentstr "%
\n"

)
)
)
;wenn keine Linie: Fehlermeldung
(alert "\nrC © ryfB\n\nkeine Linie gewählt")
)
)
;wenn nichts gewählt: Fehlermeldung
(alert "\nrC © ryfB\n\nnichts gewählt")

(princ)
)

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




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

Beiträge: 19276
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 23. Aug. 2019 13:30    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 ryfCAD 10 Unities + Antwort hilfreich

>" Die Prüfung ob die Elementwahl eine Linie ist, geht doch sicher viel einfacher oder?"
Ich fasse deinen Code mal kurz zusammen: Du prüfst ob das Objekt eine Linie ist.
Frage: Wie soll man denn "prüfen ob ein Objekt eine Linie ist" einfacher gestalten
wie einfach zu prüfen ob das Element eine Linie ist?

Schreibe dir dafür irgendwann mal eine Funktion dafür, die wirst du öfter benötigen
und dann siehst du die ganzen Schritte nicht mehr, aber gemacht werden müssen die..)
Außer man erlaubt Mehrfach-Objektwahl, dann nutzt man SSGET und dort kann man bereits
für die Auswahl einen Filter  festlegen (ssget '((0 . "LINE"))). Stichwort: Auswahlsatz/SelectionSet


Viel einfacher geht nicht, man kann es aber schöner/kürzer gestalten wenn man nicht:
>" (ich programmiere immer vollständig mit allen setq etc.)"


>"Elegant wäre doch, wenn sich eine Einzelwahl wiederholt, bis das gewählte Element eine Linie ist"

>"oder auch wenn nichts gewählt wird. while, cond... ich kriege es einfach nicht hin."

Schreibe dir den Ablauf ordentlich auf (so gut es dir mit dem jetzigen Wissen möglich ist),
dann baue die benötigte Funktion zusammen (Denn es gibt diese nicht als native Funktion, da muß man selber ran)
Zum testen nimmst du einen einfachen code damit alle anderen potentiellen Fehler deines Codes ausgeschlossen sind,
also erstelle eine Funktion die mit (alert (cdr(assoc 8 entitylist))) einfach nur den Layer anzeigt.
Da es um die Objektwahl, verklicken und Wiederholung geht, interessiert der rest ja nicht in dem Moment.


PS: Bitte formatiere deinen Code etwas, ist ansonsten unnötig schwer zu lesen.

Code:
(while (setq EL (car(entsel "\nBitte wählen Sie eine Linie: "))) ; solange etwas gewählt wird
      (if (= "LINE" (strcase(cdr(assoc 0 (setq EL (entget EL)))))) ; Objekttyp LINE ?
          (progn ; dann mach
            (princ (strcat "\nLinie referenziert Layer \"" (cdr(assoc 8 EL)) "\""))
          )      ; ansonsten
          (princ "\nObjektwahl verworfen, es sind nur LINIEN-Objekte zulässig!\n")
      )
)


bis das gewählte Element eine Linie ist oder
auch wenn nichts gewählt wird. while, cond... ich kriege es einfach nicht hin."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

spider_dd
Mitglied



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

Beiträge: 986
Registriert: 27.11.2003

Win10Pro
ACAD 2018
C3D 2018
ET

erstellt am: 23. Aug. 2019 13: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 Nur für ryfCAD 10 Unities + Antwort hilfreich

Hallo ryfCAD,

probiere das hier mal:

Code:

(while (not (and (setq sli (entsel " Linie wählen "))
                (= (cdr (assoc 0 (entget (car sli))))  "LINE")
            )
        )
)

;weiter mit:
(setq li (entget (car sli)))
...


HTH
Gruß
Thomas

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1650
Registriert: 11.10.2004

Window 8.1
ACAD 2012-2019
CIVIL 2012 - 2019
BricsCAD V14-V18
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050

erstellt am: 23. Aug. 2019 14:26    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 ryfCAD 10 Unities + Antwort hilfreich

Hallo ryfCAD,
auch ich habe noch eine Variante, dabei ist sind die Funktionen AND und OR sehr hilfreich. Die Schleife wird erst beendet, wenn kein Objekt mehr gewählt wird.

Code:

(defun c:test ( / DO OBJ)
  (setq Do 'T)
  (while Do;;;solange Do = 'T ist
    (if
      (and
(setq obj (car(entsel "\nBitte wählen Sie eine Linie (ENTER=Ende):")))
(or
  (=(cdr(assoc 0 (entget obj)))"LINE")
  (alert "Das Objekt war keine Linie."));;;alert gibt NIL zurück
)
      (alert "Jetzt was mit der Linie machen.")
      (if (not obj);;;Do auf NIL setzen, wenn kein Objekt gewählt worden ist (ENTER)
(setq Do nil)
)
      )
    )
  )

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

Foto-Manager Youtube

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


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

Beiträge: 106
Registriert: 21.06.2005

rC Architektur: Freeware für AutoCAD und GstarCAD

erstellt am: 23. Aug. 2019 16:05    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

Hallo und besten Dank!

Habe die Lösung von Spider_DD mal integriert und funktioniert:

@cadffm: die Formatierung geht mit copy-paste irgendwie verloren, kopiere aus Notepad++, die Einrückungen mache ich mit Tabs

code:
(defun c:rC-Messen_Winkel-Prozent( /  sli li x1 x2 y1 y2 proz Prozentstr winkel Winkelstr)

  ;Meldung
  (princ " ")
  (princ "\nrC © ryfB  FUNKTION: misst Neigung einer Linie in Grad und %\n ")
  (princ)

  ;Linie wählen:
  (while
      (not
        (and
            (setq sli (entsel "\nLinie wählen "))
            (= (cdr (assoc 0 (entget (car sli))))  "LINE")
        )
      )
  )
  (setq li (entget (car sli)))
 
  ;Koordinaten der Punkte filtern (da Winkelauswahl 50 nicht möglich)
  (setq x1 (car (cdr (assoc 10 li))))
  (setq y1 (cadr (cdr (assoc 10 li))))
  (setq x2 (car (cdr (assoc 11 li))))
  (setq y2 (cadr (cdr (assoc 11 li))))

  ;Berechnung %-Wert und Umwandlung in Format XX.X und Anhang "%"
  (setq proz (abs (* (/ (- y1 y2) (- x1 x2)) 100)))
  ;Umwandlung in String für Ausgabe
  (setq Prozentstr (rtos proz 2 2))
  ;Berechnung des Winkels
  (setq winkel (/ (* (ATAN (/ proz 100.0)) 180.0) pi))
  ;Umwandlung in String für Ausgabe
  (setq Winkelstr (rtos winkel 2 2))
  ;Ausgabe
  (alert
      (strcat
"\n
rC © ryfB
\n
Die Neigung beträgt:\n\n"
Winkelstr "°  =  " Prozentstr "%
\n"
      )
  )
(princ)
)

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

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)2019 CAD.de | Impressum | Datenschutz