| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Versetzen beidseitig (1090 / mal gelesen)
|
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 29. Jun. 2021 12:45 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 29. Jun. 2021 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 29. Jun. 2021 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
|
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 29. Jun. 2021 14:25 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 29. Jun. 2021 14:47 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 29. Jun. 2021 15:27 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 29. Jun. 2021 15:38 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 30. Jun. 2021 08:21 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 30. Jun. 2021 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 30. Jun. 2021 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Jun. 2021 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
|
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 30. Jun. 2021 09:59 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 30. Jun. 2021 10:16 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Jun. 2021 10:22 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
>> 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
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 30. Jun. 2021 11:22 <-- editieren / zitieren --> Unities abgeben:
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 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Jun. 2021 12:05 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
>>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
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 30. Jun. 2021 12:14 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 30. Jun. 2021 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 30. Jun. 2021 14:00 <-- editieren / zitieren --> Unities abgeben:
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 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Jun. 2021 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
[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
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 30. Jun. 2021 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
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 >>)
|