Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Versetzen beidseitig

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:  Versetzen beidseitig (1007 mal gelesen)
ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 29. Jun. 2021 12: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


Blech.txt

 
Hallo zusammen,

ich habe zur Vereinfachung von Zeichenabläufen angefangen, mich (autodidaktisch) mit LISP zu beschäftigen. Ich steh noch ziemlich am Anfang, konnte aber auch dank der vielen Themen und Anregungen schon mal ein bißchen reinschnuppern. Dafür erstmal danke an alle, die hier mitmachen...

Jetzt meine Frage: Gibt es eine Möglichkeit, Polylinien nach beiden Seiten zu versetzen (ohne Pickpoints zu benötigen)? Hintergrund ist, dass ich aus einer bestehenden Polylinie per Befehlsaufruf ein Blech (mit Radien) erzeugen möchte. Dazu wähle ich die PL aus, klicke auf die Seite, auf welcher das Blech erzeugt werden soll und generiere die Mittellinie. Die runde ich dann in Abhängigkeit zur Blechdicke ab und möchte diese dann zu beiden Seiten versetzen und die Enden verbinden. Am Versetzen scheitere ich momentan noch (die erste Seite krieg ich aus dem vorher gewählten Pickpunkt noch hin, die zweite ohne Pickpunkt aber nicht...).

Vielleicht kann mir hier jemand das Brett vom Kopf entfernen...

Danke schonmal im Voraus.

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 29. Jun. 2021 13: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 Nur für ReneReichel 10 Unities + Antwort hilfreich

Hallo,

wenn du einmal versetzen schon hin bekommst, ist der Weg nicht mehr weit.
Ich würde (um sicher zu gehen, dass kein Punkt AUF der Linie liegt) den Winkel der Linie an der Stelle der Auswahl (wird bei entsel mit übergeben) ermitteln und dann rechtwinklig (oder noch einfacher NICHT in diesem Winkel) dazu in beiden Richtungen in einem gewissen (kleinen) Abstand zwei Punkte ermitteln.
Damit hast du zwei Punkte für die Versetz-Richtung und kannst 2x versetzen.

Schau dir (falls du sie nicht schon kennst) vor allem die VLAX-CURVE-... Funktionen genauer an.

Gruß
Stefan

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: 9732
Registriert: 01.12.2003

One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11

erstellt am: 29. Jun. 2021 14:19    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 ReneReichel 10 Unities + Antwort hilfreich

Wenn man mehr mit Lisp machen möchte, kann man sich mal dieses Lisp (und viele andere von Lee Mac) genauer anschauen.
http://www.lee-mac.com/doubleoffset.html

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

Udo Hübner
www.CAD-Huebner.de

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 29. Jun. 2021 14:25    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

Zitat:
Original erstellt von Vino:
Hallo,

wenn du einmal versetzen schon hin bekommst, ist der Weg nicht mehr weit.
Ich würde (um sicher zu gehen, dass kein Punkt AUF der Linie liegt) den Winkel der Linie an der Stelle der Auswahl (wird bei entsel mit übergeben) ermitteln und dann rechtwinklig (oder noch einfacher NICHT in diesem Winkel) dazu in beiden Richtungen in einem gewissen (kleinen) Abstand zwei Punkte ermitteln.
Damit hast du zwei Punkte für die Versetz-Richtung und kannst 2x versetzen.

Schau dir (falls du sie nicht schon kennst) vor allem die VLAX-CURVE-... Funktionen genauer an.

Gruß
Stefan


Hallo Stefan,

danke für Deine Antwort. Wie verarbeite ich denn die mitgegebene Information bzgl. des Winkels (wie gesagt, ich bin noch ganz am Anfang)?

Mit VLA(X) habe ich mich noch gar nicht beschäftigt, wäre froh, wenn ich das mit den Basics hinbekommen könnte...

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 29. Jun. 2021 14:47    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 ReneReichel 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von ReneReichel:
Wie verarbeite ich denn die mitgegebene Information bzgl. des Winkels (wie gesagt, ich bin noch ganz am Anfang)?

z.B. So in etwa:
vlax-curve-GetClosestPointTo => Punkt Exakt auf der Polylinie
vlax-curve-GetDistAtPoint => Station des Punktes auf der Kurve
vlax-curve-GetPointAtDist => Punkt auf einer Station (z.B. 1mm weiter)
ANGLE => Winkel zwischen den beiden Punkten
Wenn der Winkel nicht genau senkrecht ist, zum auf der Linie liegenden Punkt in Y-Richtung einmal was abziehen, einmal was hinzuzählen.
Wenn Linie genau senkrecht ist, in X-Richtung einmal was abziehen, einmal was hinzuzählen.

Es gäbe da noch eventuell mögliche Probleme bei sehr engen Radien oder sich (fast) selbst überschneidenden Polylinien, aber das wirst du in deinem Fall kaum haben.

Die Sachen von Lee Mac sind zwar sehr genial, aber schon hohe Kunst des Lispelns und für Einsteiger wohl relativ schwer zu verstehen...

Gruß
Stefan

[EDIT]
Da du ja nur 2 beliebige Punkte auf je einer Seite der Linie brauchst, wäre es sogar besser, statt "vlax-curve-GetClosestPointTo" "vlax-curve-GetStartPoint" zu nehmen. Dann kannst du auf "vlax-curve-GetDistAtPoint" verzichten (gibt dann immer 0.00) und bei "vlax-curve-GetPointAtDist" immer z.B. 0.001 nehmen.
Dann bekommst du auch keine Probleme, falls der Klickpunkt ganz am Ende der Polylinie liegt.
[/EDIT]

[Diese Nachricht wurde von Vino am 29. Jun. 2021 editiert.]

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 29. Jun. 2021 15:27    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

Zitat:
Original erstellt von Vino:

z.B. So in etwa:
vlax-curve-GetClosestPointTo => Punkt Exakt auf der Polylinie
vlax-curve-GetDistAtPoint => Station des Punktes auf der Kurve
vlax-curve-GetPointAtDist => Punkt auf einer Station (z.B. 1mm weiter)
ANGLE => Winkel zwischen den beiden Punkten
Wenn der Winkel nicht genau senkrecht ist, zum auf der Linie liegenden Punkt in Y-Richtung einmal was abziehen, einmal was hinzuzählen.
Wenn Linie genau senkrecht ist, in X-Richtung einmal was abziehen, einmal was hinzuzählen.

Es gäbe da noch eventuell mögliche Probleme bei sehr engen Radien oder sich (fast) selbst überschneidenden Polylinien, aber das wirst du in deinem Fall kaum haben.

Die Sachen von Lee Mac sind zwar sehr genial, aber schon hohe Kunst des Lispelns und für Einsteiger wohl relativ schwer zu verstehen...

Gruß
Stefan

[EDIT]
Da du ja nur 2 beliebige Punkte auf je einer Seite der Linie brauchst, wäre es sogar besser, statt "vlax-curve-GetClosestPointTo" "vlax-curve-GetStartPoint" zu nehmen. Dann kannst du auf "vlax-curve-GetDistAtPoint" verzichten (gibt dann immer 0.00) und bei "vlax-curve-GetPointAtDist" immer z.B. 0.001 nehmen.
Dann bekommst du auch keine Probleme, falls der Klickpunkt ganz am Ende der Polylinie liegt.
[/EDIT]

[Diese Nachricht wurde von Vino am 29. Jun. 2021 editiert.]


Hallo Stefan,

danke für den Input. Habe das Problem jetzt mit "vlax-curve-GetStartPoint" gelöst, wenn auch nicht ganz in Deinem Sinne...:-)

Ich habe vom Startpoint einfach mit mapcar +100 +100 für den ersten "Pickpoint" und -100 -100 für den zweiten genommen. Funzt super.

Die Programme von Lee Mac blick ich leider nicht mal ansatzweise, trotzdem danke an Udo für den Link.

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 29. Jun. 2021 15:38    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 ReneReichel 10 Unities + Antwort hilfreich


Doppel-Offset.jpg

 
Hallo René

Zitat:
Original erstellt von ReneReichel:
Ich habe vom Startpoint einfach mit mapcar +100 +100 für den ersten "Pickpoint" und -100 -100 für den zweiten genommen. Funzt super.

Das funzt vielleicht in deinen Tests super, aber wenn deine Polylinie einen (ungünstigen) Knick macht, liegen beide Punkte auf der selben Seite der Polylinie und es funzt nicht mehr (siehe Anhang).
Ich würde zumindest den Wert, den du addierst sehr klein wählen, dann bleibt nur noch die Problematik, wenn ein Punkt zufällig genau AUF der Polylinie liegt.

Gruß
Stefan

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 30. Jun. 2021 08:21    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

Zitat:
Original erstellt von Vino:
Hallo René

Das funzt vielleicht in deinen Tests super, aber wenn deine Polylinie einen (ungünstigen) Knick macht, liegen beide Punkte auf der selben Seite der Polylinie und es funzt nicht mehr (siehe Anhang).
Ich würde zumindest den Wert, den du addierst sehr klein wählen, dann bleibt nur noch die Problematik, wenn ein Punkt zufällig genau AUF der Polylinie liegt.

Gruß
Stefan


Hallo Stefan,

da hast Du natürlich recht, das hatte ich überhaupt nicht bedacht. Leider krieg ich den getpointatdist nicht hin, hab ich hier die falsche Syntax (setq pt2 (vlax-curve-getpointatdist objtmpname (getdist 1)))?

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 30. Jun. 2021 09:00    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 ReneReichel 10 Unities + Antwort hilfreich

Hallo,

Wieso (getdist 1)?
Mit GETDIST erzwingst du ja eine unnötige Usereingabe und die 1 ist an der Stelle eh falsch.
Wenn dein erster Punkt der Startpunkt ist, nimm für den zweiten Punkt einfach den Punkt, der sehr kurz nach dem Start auf der Linie liegt.
Also z.B.
(setq pt2 (vlax-curve-getpointatdist objtmpname 0.001))
Dass objtmpname schon ein VLA-Objekt ist, davon gehe ich jetzt mal aus.

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 30. Jun. 2021 09:06    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 ReneReichel 10 Unities + Antwort hilfreich

So....
Anscheinend haben wir beide den Wald vor lauter Bäumen nicht gesehen.
Schau dir mal den Befehl VERSETZEN genauer an... Der hat (zumindest hier unter BricsCAD) eine Option "Beide Seiten"
Das ganze Punkte-Berechnen kann man sich also auch sparen ;-)

Trotzdem vielleicht eine nette Fingerübung für dich zum Anfang ;-)

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: 21533
Registriert: 03.06.2002

Alles

erstellt am: 30. Jun. 2021 09:53    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 ReneReichel 10 Unities + Antwort hilfreich

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 30. Jun. 2021 09: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

Zitat:
Original erstellt von Vino:
So....
Anscheinend haben wir beide den Wald vor lauter Bäumen nicht gesehen.
Schau dir mal den Befehl VERSETZEN genauer an... Der hat (zumindest hier unter BricsCAD) eine Option "Beide Seiten"
Das ganze Punkte-Berechnen kann man sich also auch sparen ;-)

Trotzdem vielleicht eine nette Fingerübung für dich zum Anfang ;-)


Im AutoCAD gibt's die Option leider nicht...

Zitat:
Original erstellt von Vino:
Hallo,

Wieso (getdist 1)?
Mit GETDIST erzwingst du ja eine unnötige Usereingabe und die 1 ist an der Stelle eh falsch.
Wenn dein erster Punkt der Startpunkt ist, nimm für den zweiten Punkt einfach den Punkt, der sehr kurz nach dem Start auf der Linie liegt.
Also z.B.
(setq pt2 (vlax-curve-getpointatdist objtmpname 0.001))
Dass objtmpname schon ein VLA-Objekt ist, davon gehe ich jetzt mal aus.


Wenn (setq objtmpname (vlax-ename->vla-object objtmp)) richtig ist, dann ja.

(setq pt2 (vlax-curve-getpointatdist objtmpname 0.001)) funktioniert irgendwie nicht, da erscheint eine Fehlermeldung "Befehl: ; Fehler: Fehlerhafter Argumenttyp: lentityp <Selection set: 32a>"

Wenn ich (setq objtmpname (vlax-ename->vla-object objtmp)) in folgendem Code teste, wird eine Linie mit Nulllänge am Startpunkt der Polylinie erstellt.

(defun C:ylinie (/ stpt edpt obj objvla)
  (setq obj (car (entsel "\nPolylinie wählen: ")))
  (setq objvla (vlax-ename->vla-object obj))
  (setq stpt (vlax-curve-getstartpoint objvla))
  (setq edpt (vlax-curve-getpointatdist objvla 5))
  (command "Linie" stpt edpt "")
)

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 30. Jun. 2021 10:16    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 ReneReichel 10 Unities + Antwort hilfreich

Pass etwas mehr auf deine Variablennamen auf... Da hast du langsam ein ganz schönes Durcheinander drin.

Zitat:
Original erstellt von ReneReichel:
(setq pt2 (vlax-curve-getpointatdist objtmpname 0.001)) funktioniert irgendwie nicht, da erscheint eine Fehlermeldung "Befehl: ; Fehler: Fehlerhafter Argumenttyp: lentityp <Selection set: 32a>"

Wenn ich (setq objtmpname (vlax-ename->vla-object objtmp)) in folgendem Code teste, wird eine Linie mit Nulllänge am Startpunkt der Polylinie erstellt.


Das heißt, dass zu dem Zeitpunkt die Variable objtmpname einen Auswahlsatz enthält und kein VLA-Objekt.
Das Element ist anscheinend in der Variable objtmp. Dass dann eine Linie mit Länge 0 dabei raus kommt, liegt wohl an eingeschalteten Objektfängen.

Zitat:
Original erstellt von ReneReichel:
(defun C:ylinie (/ stpt edpt obj objvla)
  (setq obj (car (entsel "\nPolylinie wählen: ")))
  (setq objvla (vlax-ename->vla-object obj))
  (setq stpt (vlax-curve-getstartpoint objvla))
  (setq edpt (vlax-curve-getpointatdist objvla 5))
  (command "Linie" stpt edpt "")
)


Der Code schaut (bis auf Objektfänge) gut aus...

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: 21533
Registriert: 03.06.2002

Alles

erstellt am: 30. Jun. 2021 10:22    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 ReneReichel 10 Unities + Antwort hilfreich

>> Fehler: Fehlerhafter Argumenttyp:
Eine Funktion erwartet einen anderen Objekttyp

>>lentityp
Erwartet wir ein ENAME

>><Selection set: 32a>"
Übergeben wurde ein Auswahlsatz


vlax-curve-getpointatdist [F1]
vlax-curve-getPointAtDist (AutoLISP/ActiveX)

(vlax-curve-getPointAtDist curve-obj dist)

curve-obj
    Type: VLA-object

Moment. Error "lentityp" = ENAME, nicht vla-object!
Richtig.
Dokumentiert ist: VLA-OBJECT (Argumenttyp: VLA-OBJECT)  wird erwartet,
die Funktion akzeptiert aber auch ENAME. Und da die Fehlermeldung nicht für
"ename or vla-object" nicht existiert, wird hier eben nur eine klare Meldung ausgegeben.

BTW: Das Netz ist voll von Lösungen, beidseitiges versetzen ist Standard auf der Liste der gefragten Funktionen..
Einfach schauen wie andere es machen und dann mit eigenem Code nachbauen - am besten ALLE Varianten, so lernt
man diese bestimmte Variante mit Vor- und Nachteilen und die Routine zu allem andern wird auch trainiert.

Eine Lösung hast du ja bereits oben verlinkt bekommen,
andere findest du locker mit Suchmaschinenen Anfragen wie: AutoCAD offset both

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 30. Jun. 2021 11:22    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


Blech.txt

 
Zitat:
Original erstellt von Vino:
Pass etwas mehr auf deine Variablennamen auf... Da hast du langsam ein ganz schönes Durcheinander drin.

Inwiefern Durcheinander? Ich setze die Variablennamen grundsätzlich so, dass das für mich Sinn ergibt (mache ich beim VBA (Excel) auch so). Wenn daran etwas falsch ist, lass ich mich aber gern belehren...:-)

Zitat:
Original erstellt von Vino:

Das heißt, dass zu dem Zeitpunkt die Variable objtmpname einen Auswahlsatz enthält und kein VLA-Objekt.
Das Element ist anscheinend in der Variable objtmp. Dass dann eine Linie mit Länge 0 dabei raus kommt, liegt wohl an eingeschalteten Objektfängen.


Das mit den Objektfängen ist super, kann ich ja in der Prozedur deaktivieren und am Ende wieder aktivieren, danke.

Warum enthält denn die Variable objtmpname kein VLA-Objekt? Ich deklariere doch (setq objtmpname (vlax-ename->vla-object objtmp)), so dass objtmp (das ist die Polylinie, die versetzt werden soll) als VLA-Objekt objtmpname gesetzt werden sollte?
Hab ich hier einen Denkfehler?

Danke für Deine Geduld

Anbei der gesamt Code.

Mfg René

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: 21533
Registriert: 03.06.2002

Alles

erstellt am: 30. Jun. 2021 12: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 Nur für ReneReichel 10 Unities + Antwort hilfreich

>>Das mit den Objektfängen ist super, kann ich ja in der Prozedur deaktivieren und am Ende wieder aktivieren, danke.
Kann man machen - wenn man es benötigt..
In deinem Test-Fall (Linie über nativen AutoCAD-Befehl erstellen - nur zum testen)
kannst du aber auch explizit den fortlaufenden Objektfang temporär übergehen,
damit brauchst du dann auch keinen Errorhandler, zumindest nicht für osmode.
(command "Linie" "_non" stpt "_non" edpt "")


>>, so dass objtmp (das ist die Polylinie, die versetzt werden soll)
Frage den Inhalt / den Objekttyp von objtmp mal ab - objtmp zeigt auf kein Zeichnungsobjekt, sondern einen Auswahlsatz.


Befehl: (setq objtmp (ssget "L"))
<Selection set: b1c>
Ein Auswahlsatz

Befehl: (entlast)
<Objektname: 323e84ac80>
ENAME

Befehl: (vlax-ename->vla-object (entlast))
#<VLA-OBJECT IAcadLine 00000032434c2518>
VLA-Objekt

Objekttypen
https://help.autodesk.com/view/ACD/2022/DEU/?guid=GUID-506C9CC8-B0BD-4A4C-B4C2-006750504509

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 30. Jun. 2021 12:14    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

Zitat:
Original erstellt von cadffm:
>> Fehler: Fehlerhafter Argumenttyp:
Eine Funktion erwartet einen anderen Objekttyp

>>lentityp
Erwartet wir ein ENAME

>><Selection set: 32a>"
Übergeben wurde ein Auswahlsatz


Weil ich objtmp mit (setq objtmp (ssget "L")) vom letzten Element deklariere? Wie kann ich denn einen Auswahlsatz zu einem ENAME oder VLA-Objekt machen?

Zitat:
Original erstellt von cadffm:
[i)
BTW: Das Netz ist voll von Lösungen, beidseitiges versetzen ist Standard auf der Liste der gefragten Funktionen..
Einfach schauen wie andere es machen und dann mit eigenem Code nachbauen - am besten ALLE Varianten, so lernt
man diese bestimmte Variante mit Vor- und Nachteilen und die Routine zu allem andern wird auch trainiert.

Eine Lösung hast du ja bereits oben verlinkt bekommen,
andere findest du locker mit Suchmaschinenen Anfragen wie: AutoCAD offset both[/i]


Da gebe ich Dir grundsätzlich recht, allerdings hab ich derzeit noch nicht einmal richtiges Grundlagenwissen, weshalb ich mich schwer tue, komplexere Codes zu lesen und zu modifizieren. Die Codes von Lee Mac (oben verlinkt) sind für mich einfach (noch) nicht nachvollziehbar.

Meine autodidaktische Herangehensweise ist, mir die Grundlagen über die Erarbeitung eines eigenen Codes anzueignen, das hat bei VBA (Excel) recht gut funktioniert. Hierzu nehme ich natürlich diverse Hilfestellungen aus dem Netz (und dankenswerterweise hier aus dem Forum) ebenso mit, wie Tutorials und Handbücher. Ich will halt verstehen, was ich tue bzw. warum das, was ich tue, nicht funktioniert.

Ich kann aber auch gut verstehen, wenn meine "Grundlagenfragen" irgendwann nerven.

Danke Dir trotzdem für Deine Rückmeldung.

Mfg René

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

Vino
Mitglied



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

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 30. Jun. 2021 13: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 ReneReichel 10 Unities + Antwort hilfreich

Hallo nochmal,

Zitat:
Original erstellt von ReneReichel:
Weil ich objtmp mit (setq objtmp (ssget "L")) vom letzten Element deklariere?

Ja. SSGET erzeugt einen Auswahlsatz. Dieser kann aus einem oder mehreren Objekten bestehen.
Das ist in etwa so als würdest du in VBA statt einem Wert ein Array übergeben.

Zitat:
Original erstellt von ReneReichel:
Wie kann ich denn einen Auswahlsatz zu einem ENAME oder VLA-Objekt machen?

Das macht man mit SSNAME.
In deinem Fall kannst du aber statt (ssget "L") gleich (entlast) nehmen und hast direkt das zuletzt gezeichnete Objekt.

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

ReneReichel
Mitglied
Technischer Projektleiter


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

Beiträge: 58
Registriert: 07.02.2018

ACAD 2019
Win10, Intel Xeon CPU E3-1275 v6, 3.80 GHz, 32 GB RAM, NVIDIA Quadro P4000

erstellt am: 30. Jun. 2021 14:00    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


Blech.txt

 
Zitat:
Original erstellt von ReneReichel:

Meine autodidaktische Herangehensweise ist, mir die Grundlagen über die Erarbeitung eines eigenen Codes anzueignen, das hat bei VBA (Excel) recht gut funktioniert. Hierzu nehme ich natürlich diverse Hilfestellungen aus dem Netz (und dankenswerterweise hier aus dem Forum) ebenso mit, wie Tutorials und Handbücher. Ich will halt verstehen, was ich tue bzw. warum das, was ich tue, nicht funktioniert.

Hallo Stefan,
hallo cadffm,

genau das oben beschriebene habe ich nun dank eurer Hilfe umsetzen können. Vielleicht (oder besser wahrscheinlich) ist das Ergebnis nicht die eleganteste Variante, aber sie funktioniert (ich habe danke Deiner Anregung Stefan, die Anfangswinkel der Polylinien in verschiedensten Varianten probiert) tadellos.

Danke euch beiden nochmal für eure Mühen und Geduld.

Mfg René

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: 21533
Registriert: 03.06.2002

Alles

erstellt am: 30. Jun. 2021 14:10    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 ReneReichel 10 Unities + Antwort hilfreich

[EDIT: Man sollte nicht die Antwort verfassen, dann etwas zu Mittag essen, dann erst die Antwort absenden      ]

>> Weil ich objtmp mit (setq objtmp (ssget "L")) vom letzten Element deklariere?
SSGET erzeugt einen Auswahlsatz, nichts anderes. Auf welche Elemente der Auswahlsatz verweist
oder über welche Paramter/Optionen die Auswahl getroffen wurde ist uninteressant dabei.


>>Wie kann ich denn einen Auswahlsatz(aws) zu einem ENAME oder VLA-Objekt machen?
Ein AWS kann auf 1,2 oder auch 1000 Objekte verweisen, damit dürfte
sich die Frage nach "zu EINEM ename oder vla-objekt machen" erledigt haben.
(ssname aws 0) gibt dir das erste Element des AWS wieder.
Da es aber auch mehrere Objekte sein könnten (ganz allgemein gesprochen, nicht bei ssget "_L").

(setq n -1)
(repeat (sslength AWS)
(setq obj (ssname AWS (setq n (1+ n))))
machwasmitobj
)
oder ähnlich erzeugt eine Liste mit allen ENAME

In deinem Fall ist sichergestellt dass es nur ein Objekt ist, also ist (ssname aws 0) ok,
aber dann könntest du auch gleich (entlast) nutzen    


---

Deine Einstellung zum Grundlagenwissen finde ich super, genau mein Gedanke - mit den Grundlagen kommt man an jedes Ziel.
Autodidakt braucht nicht erwähnt zu werden, das trifft wohl auf fast 100% der Leute zu    
www.autolisp.info oder Das KOCHBUCH ist für LISP ganz gut, Die Hilfe mit der DXF-Referenz und dem ActiveX Object-Model
zeigen den Dateiaufbau recht gut, mathematische fragen beantwortet das www.

-LispSyntax
-Hilfe[F1] lesen/verstehen lernen
-Fehlermeldungen interpretieren / eigenständige Fehlersuche optimieren

Wenn man das locker drauf hat, dann kann man sich voll und ganz auf alles andere konzentrieren.
Zum Beispiel wie man sicher einen Punkt innerhalb und einen Punkt außerhalb einer Polylinie ermittelt, usw.

>>Die Codes von Lee
Das liegt oft daran wenn man noch nicht fließend das "Drumherum" erkennt, so erkennt man dann auch schlecht die Grundlegenden Teile.

Der verlinkte Code als Beispiel: Hier geht es um nichts anderes wie die Methode OFFSET,
das schöne bei der Variante ist: Man kann einfach positive und negative Offsetwete angeben,
eine mathematische/geometrie Ermittlung wird überflüssig.
(bei anderen Aufgaben wirst du das Thema PointInPolyline früher oder später dennoch umsetzen müssen)

Hier (m)ein Beispiel, ich lösche dir mal ganz viel von Lees Code weg, das macht den Blick frei für das Wesentliche.
(das bedeutet nicht das der Code unnütz wäre, aber es ist eben nicht der Kern des Thema)

  (defun DoubleOffset1 ( object offset layer )
    (mapcar
      (function
        (lambda (o)
          (if (and
                (not(vl-catch-all-error-p (setq o (vl-catch-all-apply (function vlax-invoke) (list object 'Offset o)))))
                layer
              )
              (mapcar
                (function(lambda (o) (vla-put-layer o (getvar 'CLAYER))))
                o
              )
           )
        )
      )
      (list offset (- offset))
    )
  )

(DoubleOffset1 (vlax-ename->vla-object(car(entsel))) 2 T)

_

  (defun DoubleOffset2 ( object offset )
    (mapcar
      (function
        (lambda (o)
          (vl-catch-all-apply (function vlax-invoke) (list object 'Offset o))
        )
      )
      (list offset (- offset))
    )
  )

(DoubleOffset2 (vlax-ename->vla-object(car(entsel))) 2)

_ _ _ _ _ _ _ _ _


(defun Offset ( object offset )
   (vl-catch-all-apply (function vlax-invoke) (list object 'Offset offset))
)

(progn (setq VLA (vlax-ename->vla-object(car(entsel)))) (Offset VLA  0.5) (Offset VLA -0.5))

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: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 30. Jun. 2021 14:33    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 ReneReichel 10 Unities + Antwort hilfreich

Hier noch eine kleine Ergänzung zum Beitrag von cadffm:

Wenn man sich im Wesentlichen auf die vla-Funktion "Offset" beschränken möchte dann würde ich für's erste auch die vla-catch-Funktionen weglassen (wobei die natürlich sinnvoll sind):

Code:

(defun c:DOffset ( / ENAME OFFSETMASS VLA-OBJ)
  (setq offsetMass 0.5)
  (if (setq ename (car (entsel "\nPolylinie picken:")))
    (progn
      (setq vla-obj (vlax-ename->vla-object ename));;;Ename in vla-object
      (vla-offset vla-obj offsetMass);;;Offset Positiv
      (vla-offset vla-obj (* offsetMass -1.0));;;Offset Negativ
      )
    )
  )

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

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

Bosse_tools-Überblick

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