Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Mittelpunkt zwischen zwei Punkten

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:  Mittelpunkt zwischen zwei Punkten (2501 mal gelesen)
anderl69
Mitglied
Holztechniker

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

Beiträge: 5
Registriert: 22.11.2003

erstellt am: 25. Dez. 2003 14:15    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,
ich bin ein absoluter "Lisp-neuling".
Ich habe vor kurzem einen ACAD 2002-Kurs gemacht, der auch ein wenig Lisp beinhaltet hat und wir haben folgendes kleines Programm, zum ermitteln des Mittelpunktes zwischen 2 Punkten geschrieben.
Bei mir funktioniert es aber leider nicht und ich finde den Fehler nicht.

(defun c:mitte2p ()
;Objektfang Mitte zwischen den zwei Punkten P1 und P2
;16.11.2003
;**************** Eingabe ****************
;Punkte p1 und p2 abfragen
(setq p1 (getpoint "\nErsten Punkt eingeben:  "))
(setq p2 (getpoint "\nZwieten Punkt eingeben:  "))

;**************** Verarbeitung ***********
  (setq ofang-alt (getvar "osmode"))
;Winkel berechnen
(setq a1 (angle p1 p2))

;Halbe Distanz zwischen P1 und P2 berechnen
(setq abstand (/ (distance p1 p2) 2.0))

;Mittelpunkt pm berechnen
(setq pm (polar p1 a1 abstand))

;**************** Ausgabe ****************
;Mittelpunkt in der ACAD-Systemvariablen "lastpoint" speichern
(setvar "lastpoint" pm)
(setvar "osmode" ofang-alt)
);Ende Mitte 2 Punkte


Vielleicht findet ja einer den Fehler.
Vielen Dank
Andi

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

otterloh
Mitglied



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

Beiträge: 188
Registriert: 27.06.2001

AutoCAD 2008, 2010
Vista, Win7

erstellt am: 25. Dez. 2003 14:41    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 anderl69 10 Unities + Antwort hilfreich

Andi,
probier's mal so.
Der O'fang muß aus sein

;**************** Ausgabe ****************
;Mittelpunkt in der ACAD-Systemvariablen "lastpoint" speichern
(setvar "lastpoint" pm)
(setvar "osmode" 0)
);Ende Mitte 2 Punkte

------------------
Gruß Werner
http://Meyer-Werner.bei.T-Online.de

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

anderl69
Mitglied
Holztechniker

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

Beiträge: 5
Registriert: 22.11.2003

erstellt am: 25. Dez. 2003 16:43    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 Werner,
hat funktioniert!
Vielen Dank

Andi

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

WNJT
Mitglied



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

Beiträge: 10
Registriert: 12.04.2023

AutoCad 2020

erstellt am: 01. Sep. 2023 17:56    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 anderl69 10 Unities + Antwort hilfreich

ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist!

Hallo Zusammen,
ich hatte das lisp etwas erweitet, um auf den Mittelpunkt einer ausgewählen linie, einen Block einzufügen.
Das funktioniert auch super. (Das List ist unten angefügt)
Mein eigentliches Vorhaben ist allerding den block auf mehrere Linienmittelpunkte gleichzeitig einzufügen.
Hierzu hatte ich schon vergeblich versucht mit ssget die Auswahl der Linie also (setq obj (nentsel "\nLinie wählen: ")) zu ersetzten. Das funktioniert leider überhaupt nicht.
Ich habe leider nicht viel erfahrung mit Lisp.
Ist so etwas grundsätzlich möglich?

(defun c:Schlitz5 ()
  (setq obj (nentsel "\nLinie wählen: "))
  (setq p1 (cdr (assoc 10 (entget (car obj)))))
  (setq p2 (cdr (assoc 11 (entget (car obj)))))
  (setq osmode_save (getvar "osmode"))
  (setq a1 (angle p1 p2))
  (setq abstand (/ (distance p1 p2) 2.0))
    (setvar "osmode" 0)
    (command "_-insert" "Einlagenschlitz_4mm" (polar p1 a1 abstand) "" "" "")
    (setvar "osmode" osmode_save)
  )


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

Andreas Kraus
Mitglied
Elektrotechniker


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

Beiträge: 1415
Registriert: 11.01.2006

WIN 10
ACAD 2022

erstellt am: 01. Sep. 2023 19:45    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 anderl69 10 Unities + Antwort hilfreich

ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist!

Hallo WNJT,
zuerst ... nimm bitte nicht nentsel sondern entsel.
Unterschied: nentsel pickt "nested Entities" deshalb das "n" davor. Das bedeutet dass wenn du ein Element anklickst dass sich in einem Block befindet, dieses auch zurückbekommst. Für deinen Fall ist das aber nicht gut, weil du ja die Mitte von Linien brauchst und die Mitte einer Linie in einem Block ist leider woanders. Eine solche Linie befindet sich, genaugenommen, in der Blockdefinition und nicht an der Stelle der Zeichnung an der du sie siehst. Damit bekommst du natürlich auch die Koordinaten aus der Blockdefinition und nicht die die du brauchst.

Zu deiner Frage mit ssget:
ssget liefert dir einen Auswahlsatz und nicht wie entsel eine Liste die unter anderem den Elementnamen enthält.
Um die Elementnamen aus dem Auswahlsatz zu bekommen gibt es verschiedene Möglichkeiten.

ssname Gibt den Objektnamen (Entitynamen) des indizierten Elements eines Auswahlsatzes zurück

(ssname satz n)

ssnamex Ruft Informationen darüber ab, wie ein Auswahlsatz erstellt wurde.
So steht das in der Hilfe, ist aber erst mal etwas undurchsichtig.

Wenn man aber ssnamex ohne Index aufruft (ssnamex satz) dann bekommt man eine Liste mit Listen (ja, hört sich komisch an) und in jeder dieser "Unterlisten" steht an zweiter Stelle (VORSICHT, es gibt natürlich (leider) Ausnahmen) der gesuchte Elementname. Man muss also nur von jeder dieser Unterlisten das zweite Element nehmen und fertig. Mach ich übrigens auch so, weil es echt bequem ist.

(mapcar 'cadr (ssnamex satz))

Jetzt zu den Ausnahmen:
Steht da kein Elementname (warum ist hier erst mal egal, anderes Thema) muss der Eintrag weg.

(vl-remove-if-not
  '(lambda (dummy) (= (type dummy) 'ENAME))
  (mapcar 'cadr (ssnamex satz))
)

Und das ist erst mal das was du brauchst. Damit bekommst du eine Liste mit Elementnamen zum weiterverarbeiten.
Um diese Liste Element für Element abzuarbeiten kannst du foreach verwenden.

Außerdem würde ich die Mitte zwischen zwei Punkten anders ermitteln.
Koordinaten addieren und durch zwei teilen. Das funktioniert dann sogar 3D.

(mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2))
p1
p2
)

Ich hab in meinen Beispielen mapcar verwendet. Das MUSST du dir unbedingt anschauen, das ist wirklich wichtig für zukünftige Programme weil du sonst gerade bei der Verarbeitung von Listen keinen Spaß hast.

So, dann erst mal schönes Wochenende  

------------------
Geht nicht, gibts nicht

Gruß
Andreas

http://kraus-cad.de

[Diese Nachricht wurde von Andreas Kraus am 01. Sep. 2023 editiert.]

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

WNJT
Mitglied



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

Beiträge: 10
Registriert: 12.04.2023

AutoCad 2020

erstellt am: 01. Sep. 2023 22:07    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 anderl69 10 Unities + Antwort hilfreich

Vielen Dank Andreas Kraus, für diese sehr ausführliche Antwort und Erklärung.

Ich als totaler Lisp Anfänger versuche das ganze mal zu verstehen und in mein Vorhaben einzuarbeiten.

Die Zeile mit dem nentsel hatte ich mal in irgendeiner Lisp gefunden und mit dieser ganz oben im Beitrag kombiniert. Hatte ja irgendwie funktioniert.

Noch als Ergänzung, die Linien sind keine Blöcke, das sind mindestens 100 frei gezeichnete Linien, in verschiedenen Winkeln, die in der Zeichnung liegen.
Auf jede Linie setze ich momentan händisch einen block mit Ausrichtungsparameter ein.

Vielleicht schaffe ich es jetzt mit einem klick alles zu erledigen.

Dir auch ein schönes Wochenende!

Ich habe jetzt ja erst mal zu tuen mich weiter in die Lisp Welt einzulernen

 

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

CAD-Huebner
Ehrenmitglied V.I.P. h.c.
Verm.- Ing., ATC-Trainer



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

Beiträge: 9741
Registriert: 01.12.2003

One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11

erstellt am: 02. Sep. 2023 10:45    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 anderl69 10 Unities + Antwort hilfreich

Ich finde es prima, wenn es LISP Interessierte gibt.
Hier für den Einstieg eine mögliche Umsetzung.
Geübte LISP Programmierer werden mit weniger Variablen auskommen, es geht mir hier
um eine gute sequenzielle Lesbarkeit.

Code:
(defun c:UHBlockaufLinienmitte ()
  ; hier gewünschten Blocknamen eintragen
  (setq blockName "testblock")
 
  (prompt (strcat "\nBlock: <" Blockname "> auf Linienmitten platzieren:")) ; Meldung anzeigen
  (setq ss (ssget '((0 . "LINE")))) ; Auswahl von Linienobjekten erfragen
 
  (if ss  ; Überprüfen, ob Linien ausgewählt wurden
    (progn
      (setq cnt (sslength ss)) ; Gesamtzahl der Linien gleichzeitig zählvariable

      (repeat cnt
        (setq lineObj (ssname ss (setq cnt (1- cnt))))
        (setq lineData (entget lineObj))
       
        (setq startPoint (cdr (assoc 10 lineData))); Anfangspunkt
        (setq endPoint (cdr (assoc 11 lineData))) ; Endpunkt
        ; Berechnen des Winkels der Linie zur X-Achse (in rad)
        (setq lineAng (angle startPoint endPoint))
        ; Berechnen des Mittelpunkts der Linie
        (setq midPoint (polar startPoint lineAng (/ (distance startPoint endPoint) 2.0)))
       
        ; Text erstellen
        (princ (strcat
                        "Mittelpunkt: " (rtos (car midPoint) 2 2) ", " (rtos (cadr midPoint) 2 2)
                        "\nWinkel (Grad): " (angtos lineAng 0 2)
                        "\n------------------\n"))
        ; Erstellen der Blockreferenz
        (command "_-insert" blockName "_non" midPoint 1.0 1.0 (* 180.0 lineAng)) ; Block einfügen Einheit Dez. Grad angenommen
      )
    )
  )
  (princ)
)


Hier in der AutoCAD LT Hilfe gibt es neuerdings auch eine Rubrik "Erste Schritte" für den Einstieg in LISP.
https://help.autodesk.com/view/ACDLT/2024/DEU/?guid=GUID-5FB57480-C9BE-4E3D-BEDF-D86035928FFA

Viel Erfolg.


------------------
Mit freundlichem Gruß

Udo Hübner
www.CAD-Huebner.de

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

WNJT
Mitglied



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

Beiträge: 10
Registriert: 12.04.2023

AutoCad 2020

erstellt am: 02. Sep. 2023 16:48    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 anderl69 10 Unities + Antwort hilfreich

Hallo CAD-Huebner,

vielen Dank für die Unterstützung!

Dass repeat foreach ersetzen kann hatte ich heute Nacht auch schon gelern, ich war allerdings noch sehr weit von der Lösung entfernt.

Der Code setzt den Block auf den Mittelpunkt aller gewählten Linien, soweit perfekt.
Nur hatte der Ausrichtungsparameter des Blockes nicht funktioniert, alle Blöcke wurden natürlich mit dem Winkel 180° eingefügt.

Ich hatte jetzt noch alles mögliche ausprobiert, an stelle der 180° "" eingesetzt...
Dann hatte ich die Berechnung aus meinem ersten Versuch eingefügt und noch das"_non" entfernt.

Und WOW es funktioniert ich bin total begeistert und habe einiges dazugelernt.
Der Block wird auf alle Linien Mittelpunkte eingefügt und richtet sich an den entsprechenden Linien im richtigen Winkel aus.

Anbei der Befehl, vielleicht wird er nochmal benötigt. Ob alles Fachlich richtig ist, kann ich nicht sagen.

(defun c:Schlitz12 ()
  ; hier gewünschten Blocknamen eintragen
  (setq blockName "Einlagenschlitz_4mm")

  (prompt (strcat "\nBlock: <" Blockname "> auf Linienmitten platzieren:")) ; Meldung anzeigen
  (setq ss (ssget '((0 . "LINE")))) ; Auswahl von Linienobjekten erfragen

  (if ss  ; Überprüfen, ob Linien ausgewählt wurden
    (progn
      (setq cnt (sslength ss)) ; Gesamtzahl der Linien gleichzeitig zählvariable

      (repeat cnt
        (setq lineObj (ssname ss (setq cnt (1- cnt))))
        (setq lineData (entget lineObj))
     
        (setq p1 (cdr (assoc 10  lineData)))
  (setq p2 (cdr (assoc 11 lineData)))
  (setq a1 (angle p1 p2))
  (setq abstand (/ (distance p1 p2) 2.0))
 
        ; Erstellen der Blockreferenz
        (command "_-insert" blockName  (polar p1 a1 abstand) "" "" "" )
      )
    )
  )
  (princ)
)

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

mcap
Mitglied
CAD-Supporter


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

Beiträge: 128
Registriert: 13.11.2014

Lenovo P360
ACAD 2022/24
IV 2022/24
WIN 10/64

erstellt am: 06. Sep. 2023 20:51    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 anderl69 10 Unities + Antwort hilfreich

Hallo WNJT

Ich denke, Udo hatte nur übersehen, dass sein Winkel lineAng in Radiant (rad) ist und man den noch durch PI (oder 2PI bei 360) teilen muss.
Seine Zeile zum Einfügen sollte also so aussehen:

Code:
(command "_-insert" blockName "_non" midPoint 1.0 1.0 (* 180.0 (/ lineAng PI))) ; Block einfügen

oder mit Angtos wäre auch möglich:
Code:
(command "_-insert" blockName "_non" midPoint 1.0 1.0 (angtos lineAng 0 2)) ; Block einfügen Dez. Grad angenommen

Das "_non" deaktiviert einen allfälligen Objektfang der unter Umständen dazwischen funken könnte. Das ist gut, wenn man das drin lässt.

------------------
Gruss Marco

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

WNJT
Mitglied



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

Beiträge: 10
Registriert: 12.04.2023

AutoCad 2020

erstellt am: 07. Sep. 2023 10:36    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 anderl69 10 Unities + Antwort hilfreich

Hallo Marco,

vielen Dank für deine Antwort!

Der Block wird bei beiden Beispielen exakt um 90° verdreht zu der vorhandenen Linie eingefügt. Gibt es eine Möglichkeit das noch anzupassen? Ich habe schon alles mögliche versucht bekomme es aber nicht hin.

Grüße
Julia

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: 1124
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 07. Sep. 2023 11:01    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 anderl69 10 Unities + Antwort hilfreich

Hallo Julia,

dann must Du noch 90° (oder Pi/2) zu Deinem Drehwinkel addieren oder subtrahieren, je nach dem, wie die Verdrehung ist.

HTH
Gruß
Thomas

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