Community
AutoCAD Produktfamilie - Deutsch
Das Forum für alle Fragen zu AutoCAD, LT, Architecture, Electrical, Map 3D, Mechanical, MEP, Plant 3D, Raster Design, Web App, sowie Autodesk Civil 3D und Advance Steel.
abbrechen
Suchergebnisse werden angezeigt für 
Anzeigen  nur  | Stattdessen suchen nach 
Meintest du: 

AutoCAD Mechanical 2020 Join Offset Explode Makro

7 ANTWORTEN 7
Antworten
Nachricht 1 von 8
sascha.krahwinkelVWMN3
213 Aufrufe, 7 Antworten

AutoCAD Mechanical 2020 Join Offset Explode Makro

Moin,

mein Sachverhalt:

ich habe zwei Linien, die mit einem Radius verbunden sind. Nun möchte ich von allen 3 Objekten ein Offset machen und anstatt den Befehl Offset zu wählen und alle 3 Objekte nacheinenander anzuwählen dachte ich mir es müsse auch mit den 3 Befehlen Join , Offset und Explode gehen.

Es sind nicht immer genau diese Objekte, also es ist nur ein Beispiel und die Kontur ist immer geschlossen, sodass eine Polylinie immer einfach erstellt werden kann.

 

Ich habe es als Befehlsmakro versucht :

^c^c_join;/^c^c_offset;_.PSELECT;_P;;/^c^c_explode;_.PSELECT;_P;;

Das PSELECT hab ich eingebaut um nicht immer wieder das vorherige Objekt auswählen zu müssen, sondern damit die Objekte automatisch ausgewählt werden.

,aber ich komme nichtmal mit Join klar. Wenn es nur

^c^c_join

ist, dann verbindet er einfach meine 3 gewollten Objekte, aber wenn ich es wie oben einbaue will join einen Punkt haben.

Da ich leider nichts über Join finde kann ich das Befehlsmakro nicht weiter testen, also tut es mir jetzt schonmal leid, wenn es kompletter Quatsch ist 😄

Mein Autolisp ist ungefähr so gut wie meine Befehlsmakrokünste, aber falls einer ein Autolisp Makro hat, was das Problem löst nehme ich auch das 😄

 

Vielen dank ich vorraus,

S. Krahwinkel

7 ANTWORTEN 7
Nachricht 2 von 8
cadffm
als Antwort auf: sascha.krahwinkelVWMN3


Hi,

ich beantworte die Nachfrage mal von oben nach unten als hätte ich nicht zuvor alles gelesen,
sondern Zeile für Zeile und diese direkt kommentiert.
UND: Ich bitte vorab um Entschuldigung dass ich dir die Lösung schuldig bleibe,
denn es ist nicht trivial in diesem Fall und bedarf Zeit - die ich jetzt nicht für dein Problem aufwänden kann.
Aber da allgemeingültige Aussagen immer passen und hilfreich sein können:

>>"Ich habe es als Befehlsmakro versucht :"

^c^c_join;/^c^c_offset;_.PSELECT;_P;;/^c^c_explode;_.PSELECT;_P;;


_ _ _ _ _

^c^c_join;/
Für was soll dieser SLASH gut sein?
Falls das für eine Objektwahl steht (was hier so nicht ausreichen würde),
dann wäre es der BACKslash der eine Benutzereingabe zulassen würde "\"

^c^c
warum drückst du hier 2xESC (= ABBRECHEN) ?
_offset;
hier fehlt die Pause für die Benutzangabe des Abstandes, oder?

_.PSELECT;_P;;
Der Explode-Befehl fragt nach Objekten, da braucht man die nicht unnötig kompliziert vorher wählen.
(Allgemein: Zudem ist der undokumentierte Befehl PSELECT nicht immer geladen und damit in Makros nur 2. Wahl)

/
Wofür? (vermutlich ein BACKslash gewollt zu Benutzeringabe!?)

^c^c
Warum schon wieder dieses ABBRECHEN. 1. Wäre es nicht nötig, 2. würde es die Vor-Auswahl wieder vernichten und 3.warum 2x? Schon 1x ist hier überflüssig?

_explode;
*hierzu weiter unten mehr*

_.PSELECT;_P;;
Wofür ist das denn jetzt - so ganz ohne Befehl. Willst du nur die Objekte markieren,
also so eine Art Sichtprüfung für das Resultat? Okay, das wäre clever, wäre.
_ _ _ _ _


>>"Das PSELECT hab ich eingebaut um nicht immer wieder das vorherige Objekt auswählen zu müssen, sondern damit die Objekte automatisch ausgewählt werden."
Das PSELECT wählt keine vorherigen Objekte, das _p was du hinterher sendest wählt die Objekte des vorherigen Auswahlsatzes
und das ist die ganz geöhnliche Objektwahlmethos "previous" bzw. V für VORHER
Verschiebe mal ein Objekt, jetzt starte den Befehl Kopieren und wenn ACAD nach den Objekten fragt, dann antworte mit _p oder mit V.
! Es gibt Situationen da kann man diese undokumentierte Variante als Trick gut ausnutzen da es in diesen Fällen einen Unterschied im Ablauf ausmacht,
! mind. einen dieser Sonderfälle hast du hier auch, der Befehl VERBINDEN - dazu weiter unten mehr.


>>",aber ich komme nichtmal mit Join klar. "
Gut das du das erkennst, aber ich frage mich wie man so viel Zeug schreibern kann obwohl man doch bereits an den ersten Zeichen scheitert ??
Eine Automation wird von links nach rechts, oben nach unten, also von Anfang zum Ende phin erarbeitet.
Daran gehalten ist es also unmöglich mehr wie einen Schritt weiter zu kommen als die Problemstelle.


>>"Wenn es nur "^c^c_join" ist, dann verbindet er einfach meine 3 gewollten Objekte"
JaIn, nicht das Makro führt die Feder, du allein machast es..
Was macht "^c^c_join"?
Es sendet 2x Abbruch [ESC] und startet den Befehl _Join
damit ist das Makro fertig und hat mit allem nun folgenden NICHTS MEHR ZU TUN
Es ist also genau so wie wenn du auf die Schaltfläche für Verbinden klickst, es wird einfach nur der Befehl gestartet und mehr nicht,
der Rest liegt komplett in Benutzerhand.


>>>>" aber wenn ich es wie oben einbaue will join einen Punkt haben."
Join will eigentlich keinen Punkt haben, sondern eine Auswahl an Objekten - aber man kann Objekte auch "picken" aka "anklicken"
was durch Übermittlung einer Koordindate passiert. Mit der Maus wäre es der berühmte Links-Klick auf ein Objekt.
Hier eine Variante die funktioniert (wenn der Befehl PSELECT geladen ist)
^C^C^C_.SELECT;\_.PSELECT;_p;;_.JOIN;


>>"Da ich leider nichts über Join finde kann ich das Befehlsmakro nicht weiter testen,"
Du findest nichts über join?
Also: Ich ignoriere zunächst dass es hier um einen Sonderfall geht (Befehlsfolge automatisiert kann nicht immer identisch mit Handeingabe erfolgen)
Dann: Join ist ja englisch und schau ich in die Hilfe, die englsiche natürlich, dann finde ich die Befehls-Dokumentation dazu.
(der Unterstrich ist dafür das deine vllt. nicht-englische Version dies kapiert)
[Hilfe] Join (command)
https://help.autodesk.com/view/ACD/2022/ENU/?guid=GUID-4D2A28C3-3E7F-4830-BE6A-7C9907C95488
Du kannst dann auch gerne mal oben rechts auf deutsch umstellen..
Alternativ (solange man keine LT Version hat) kannst du international<>sprachversion mit Lisp übersetzen lassen
Befehl: (getcname "LINIE") => _LINE
Befehl: (getcname "_LINE") => LINIE
usw.
Du könntest aber auch deinen Befehl starten wie gewohnt und dann
Im Textfenster steht der Internationale Aufruf [F2] (Standardbefehle/Standard Anpassungsdatei vorausgesetzt)
und im Kontextmenü (Rechtsklick ins Nichts) unter Letzten Befehl, da steht der deutsche Aufruf.


>>"also tut es mir jetzt schonmal leid, wenn es kompletter Quatsch ist"
Es ist kompletter Quatsch wie ich oben im Groben aufgezeigt habe, aber es zeigt die
gewünschte Befehlsfolge und das ist schon mehr wie andere hier liefern.
In diesen Fällen helfe ich auch gerne weiter, wenn der Gegenüber "mitarbeitet",
mich wunderte nur dieses sehr lange unsinnige Makro (bei mir wäre ja beim 1.Fehler bereits Schluss gewesen..)


>>"Mein Autolisp ist ungefähr so gut wie meine Befehlsmakrokünste, aber falls einer ein Autolisp Makro hat, was das Problem löst nehme ich auch das"
OT: AutoLisp und Makro sind zwei Begriffe die man nicht zusammen verwendet
Ganz ehrlich, man könnte zwar was ordentliches Programmieren, aber 99% würden auch mit Lisp
nur die vorhandenen Befehle steuern und dann bleibt es ja fast schon egal ob man es mit
(comand / sendcommand
Script (geht nur wenn keine Benutzereingabe erforderlich wäre)
oder einem Menümakro erledigt..
Die Arbeit wäre genau dieselbe.
Vorteil Menümakro: Geht zu 99% auch in LT-Versionen

_ _ _ _


Zurück zu deinem Makro. Den ersten Teil mit dem Join hatte ich bereits gezeigt,
wenn man danach OFFSET nutzen möchte greift man wieder zu PSELECT, denn warum zu Teufel auch immer
hat AutoDESK weder die Objektwahl LETZTES noch die Objektwahl VORHER zugelassen im Versetzen-Befehl.<>

<schnipp>

Aber hier muß ich aufhören (die Zeit...)
Letzter TIP: Wenn du es über OFFSET nicht hinbekommst, dann versuche vor dem Offset anstatt dem Join den PEDIT-Befehl zu nutzen,
ich denke ein Versuch wäre es wert.

- Sebastian -
Nachricht 3 von 8
sascha.krahwinkelVWMN3
als Antwort auf: cadffm

Vielen Dank für diese sehr ausführliche Antwort.

Da du noch mehr geschrieben hast als ich werde ich auch versuchen nach der Reihe zu antworten.

 

"UND: Ich bitte vorab um Entschuldigung dass ich dir die Lösung schuldig bleibe,
denn es ist nicht trivial in diesem Fall und bedarf Zeit - die ich jetzt nicht für dein Problem aufwänden kann."

 

Die Hälfte der von dir aufgebrachten Zeit wäre auch schon ein sehr guter Anfang gewesen, also trotzdem vielen Dank.

 

^c^c_join;/
Für was soll dieser SLASH gut sein?
Falls das für eine Objektwahl steht (was hier so nicht ausreichen würde),
dann wäre es der BACKslash der eine Benutzereingabe zulassen würde "\"

Es sollte ein Backsalsh werden um die Auswahl zum verbinden zuzulassen.

 

warum drückst du hier 2xESC (= ABBRECHEN) ?

Das Join Makro hat ein Ende, aber manche andere wie "Linie" nicht weshalb ich es mir angewöhnt habe immer ESC zu drücken, damit das Makro mit dem ich beschäftigt bin aufhört. Aber du hast Recht! Hier ist es nicht nötig.

 

_offset;
hier fehlt die Pause für die Benutzangabe des Abstandes, oder?

Vielen Dank. Wäre ich wahrscheinlich irgendwann auch drüber gestolpert 😄

 

_.PSELECT;_P;;
Der Explode-Befehl fragt nach Objekten, da braucht man die nicht unnötig kompliziert vorher wählen.
(Allgemein: Zudem ist der undokumentierte Befehl PSELECT nicht immer geladen und damit in Makros nur 2. Wahl)

Dadurch wollte ich erreichen, dass alles was ich am Anfang zusammengefügt habe wieder aufgetrennt wird.

 

_.PSELECT;_P;;
Wofür ist das denn jetzt - so ganz ohne Befehl. Willst du nur die Objekte markieren,
also so eine Art Sichtprüfung für das Resultat? Okay, das wäre clever, wäre.

Ich dachte im Befehl Explode fragt er nach was getrennt werden soll und dann sollte er das vorherige Objekt aufspalten. Es ist natürlich nicht für eine Sichtprüfung 😄

 

>>",aber ich komme nichtmal mit Join klar. "
Gut das du das erkennst, aber ich frage mich wie man so viel Zeug schreibern kann obwohl man doch bereits an den ersten Zeichen scheitert ??

Ich wollte dadurch klar machen, was meine Absicht ist und wie ich es mir vorstelle. Natürlich habe ich nur mit Join begonnen, aber als das nicht geklappt hat und ich mich entschlossen habe es zu posten habe ich den Rest einfach drangehangen.

 

>>>>" aber wenn ich es wie oben einbaue will join einen Punkt haben."
Join will eigentlich keinen Punkt haben, sondern eine Auswahl an Objekten - aber man kann Objekte auch "picken" aka "anklicken"

Ich konnte dadurch auch die zwei Linien auswählen, aber der Radius war nicht wählbar.

 

OT: AutoLisp und Makro sind zwei Begriffe die man nicht zusammen verwendet
Ganz ehrlich, man könnte zwar was ordentliches Programmieren, aber 99% würden auch mit Lisp
nur die vorhandenen Befehle steuern und dann bleibt es ja fast schon egal ob man es mit
(comand / sendcommand
Script (geht nur wenn keine Benutzereingabe erforderlich wäre)
oder einem Menümakro erledigt..

Ich verwende die Begriffe wegen AutoCAD. Wenn ich einen Knopf Bauen muss ich dort ein Autolisp Makro eingeben z.B. ^c^cLinie. Wenn dieser Knopf ist dann das Befehlsmakro.

 

 

Ich gebe mich jetzt nochmal dran. Ich denke bis morgen Mittag bin ich einen Schritt weiter.

Danke dir für die wunderschöne Antwort.

 

MFG,

Sascha

 

 

 

 

 

 

 

Nachricht 4 von 8
cadffm
als Antwort auf: sascha.krahwinkelVWMN3

Hi Sascha,

>>"aber manche andere wie "Linie" nicht weshalb ich es mir angewöhnt habe immer ESC zu drücken, "
Jepp, deswegen sind alle AutoDesk-User die Lachnummer bei Anwendern anderer Software LOL <scnr>

Es ist auch in AutoCAD erlaubt einen Befehl ganz normal zu beenden anstatt diesen
brutal abzubrechen. PS: Es ist sogar zu favorisieren, denn es ist keineswegs immer das Gleiche 😉

Entweder ein Befehl hat eine Option zum beeenden/exit oder akzeptiert eine Leereingabe(also "nur Enter")
zum verlassen des Befehls. Bei der Objektwahl machst du das ja auch ständig (Rechtsklick oder Enter)
anstatt [ESC]. Ahh, bei ESC würde die bisher stattgefundene Objektwahl verloren gehen und der aktive
Befehl abgebrochen werden? Genau, da sind wir bei dem Punkt das Befehl abbrechen nicht dasselbe ist wie Befehl beenden,
es gibt aber noch schönere Beispiele <gerade nicht zu Hand>.

Also: Leereingabe, sprich Enter, sprich Semikolon in einem Makro
wäre der ordentliche Weg, falls die Optione Verlassen/Beenden/Exit nicht angeboten wird.

 

>>"Dadurch wollte ich erreichen, dass alles was ich am Anfang zusammengefügt habe wieder aufgetrennt wird."
Das hat aber mit meinem Hinweis nichts zutun gehabt, ich habe darauf hingewiesen dass
es keinen besonderen Sinn macht vorher einen Auswahlsatz zu erstellen und Objekt(e) zu markieren
wenn es diesen ja ohnehin schon gibt (nämlich der vorherige Auswahlsatz auf den du mit _P oder V zugreifst)

Allerdings: Die Verwendung von Offset löscht den Auswahlsatz "Vorher",
somit hast du so keine einfache Möglichkeit auf die "gejointe" Polylinie zuzugreifen.

Du siehst: Ein Problemfall nach dem anderen, du hast mit dem Wunsch mitten in die AutoCAD-Befehl Perlen gegriffen.
Teilweise schlecht programmiert, in jedem Fall aber blöd für den Benutzer, muss man sich so winden und strecken
um doch zum Ziel zu kommen.

Wohl doch ein Fall mit ein paar Lispzeilen die Sache besser steuern zu können.


>>"Ich dachte im Befehl Explode fragt er nach was getrennt werden soll und dann sollte er das vorherige Objekt aufspalten."
Jetzt verstehe ich dein Makro noch besser, was dann die Verwendung von PSELECT noch "unsinniger" macht.
PSELECT kann einen Auswahlsatz erstellen und die Objekte markieren (ohne dass ein anderer Befehl aktiv sein muss),
das macht also nur Sinn wenn du OBJEKT VOR BEFEHL wählen möchtest/musst.
Wenn bereits ein Befehl aktiv ist der ohnehin nach objekten fragt, wozu dann noch den Befehl PSELECT starten?
Mal ganz davon abgesehen das man diesen Befehl dann transparent starten müsste, was aber überhaupt nicht funktioniert.
Teste: URSPUNG und wenn er nach den Objekten fragt: _.PSELECT
Das wird er nicht machen wollen mit der Info: *Ungültige Auswahl*


>>"Ich konnte dadurch auch die zwei Linien auswählen, aber der Radius war nicht wählbar."
Nein, vergiss es. Da lief überhaupt nichts in geordneten Bahnen. In dem Moment wo du etwas ausgewählt
hast war das Makro schon längst nicht mehr aktiv.


>>"Ich verwende die Begriffe wegen AutoCAD."
??

>>"Wenn ich einen Knopf Bauen muss ich dort ein Autolisp Makro eingeben"
Abgesehen davon das es kein "Autolisp Makro" gibt (der Begriff Makro kommt in der AutoLISP-Welt imho nicht vor),
In den Schaltflächen gibt du ein Menümakro ein, in dem ein oder anderen Dialog "Befehlsstring" genannt.
Ich verwende "Menümakro" weil es sehr viel eindeutiger ist wie alles andere", Befehlsstring könnte
egal welcher String an egal welcher Stelle in egal welcher Sprache sein.
"Menümakro" ist in der AutoCAD-Geschichte hingegen eindeutig.
Dagegen setze ich das "VBA-Makro", was ein in VBA geschriebenes Programm ist.

z.B. ^c^cLinie.
Hat genau 0,0 mit Lisp zutun.
^C ist ein Sonderzeichen für Menümakros und bedeutet [ESC] und Linie ist einfach der native deutsche Befehlsaufruf für Befehl LINE
ewlcher in der deutschen Version auch aufgerufen werden kann, mit der internationalen Schreibweise - mit führenden Unterstrich: _LINE

>>" Wenn dieser Knopf ist dann das Befehlsmakro."
Ok, ich verstehe jetzt wie du dir es zurechtgelegt hast und weil AutoDESK leider alles andere als streng und sinnvoll
mit Benennung&Syntax umgeht (zuviele verschiedne 1000 Leute über die Jahrzehnte an der Software)
belasse ich es mal dabei.
Im ABI Dialog nennt sich das was du "Befehlsmakro" nennst: Befehl
Dein "Befehlsmakro" ist 100x besser.

>>"Ich gebe mich jetzt nochmal dran. Ich denke bis morgen Mittag bin ich einen Schritt weiter."
Ich sage nichts was dir die Motivation nehmen würde und schweige an dieser Stelle.
Überrasche uns!

>>Danke dir für die wunderschöne Antwort.
Wenn du Ende der Woche nicht weiter bist, dann melde dich noch mal bei mir - Ich lese nicht immer und nicht alles mit.

 

- Sebastian -
Nachricht 5 von 8

Moin,

ich habe das Befehlsmakro nach deinen ersten Vorgaben angepasst und bin auf weitere Probleme gestoßen.

^c^c_join\\\;_Select;_P;_offset;\\^c^c_explode;_P

wenn ich nach join ein Simmikolon mache, dann kann ich nicht mehr alle Objekte frei wählen, sondern muss ein Quellobjekt wählen, wodurch ich nicht mehr beide Linien und den Radius wählen kann. Leider muss ich da per Hand Enter drücken.

Desweiteren funktioniert mein erstes _P nicht, weil AutoCAD nicht erkennt, dass ich die drei Linien, die ja jetzt zusammen sind, also ein neues Objekt anscheinend, auswählen will.

 

Ich habe deshalb mal einen Ansatz für Autolisp gemacht:

(defun c:BigOffset (/ e i)
(if
(and
(setq i 1)
(while 'T
(setq ei (car(entsel "Wähle verbundene Linien und Bögen für Offset")))
(setq i (+ 1 i))))
(setq i 2)
(command "CMDECHO" 1
"_.JOIN" e1 e(while 'T (+ 1 i)
"_.OFFSET" e1 PAUSE "_.EXPLODE" e1 "")
)
)
(princ)
)

 

Auch hier habe ich leider wenig Ahnung von verschiedenen Dingen:

Während der ersten Schleife soll man alle Linien auswählen die man als Offset haben will, wobei ich nicht glaube, dass der Wert ei funktioniert 😄 Ich wollte dadurch erreichen, dass die erste Linie e1 heißt und dann eventuell ein Radius e2 und so weiter.

Und mir fehlt der Syntax der Funktionen JOIN OFFSET und EXPLODE 😄

Join soll dabei während einer Schleife e1 im ersten Durchgang mit e2 verbinden. die entstandenene Linie, die ja e1 enthält wieder mit e3 verbinden. Es ist aber bestimmt nötig die neu entstandene Polylinie wieder neu zu bennen und damit weiter zu machen...

 

Vielen Dank im Vorraus 😄

MFG,

Sascha

Nachricht 6 von 8
cadffm
als Antwort auf: sascha.krahwinkelVWMN3

ich habe das Befehlsmakro nach deinen ersten Vorgaben angepasst und bin auf weitere Probleme gestoßen.

^c^c_join\\\;_Select;_P;_offset;\\^c^c_explode;_P

>>"wenn ich nach join ein Simmikolon mache,"
Dieses Semikolon ist Plicht, denn erst dieses Semikolon(=ENTER) schickt die Eingabe an das Programm.

>>"dann kann ich nicht mehr alle Objekte frei wählen,"
Das liegt aber nicht am Semikolon welches den Befehl startet, sondern in der Natur der Sache:
Das Makro muss in aller Regel jede Eingabe von dir kennen, nur ein Befehl ist da anders: WAHL/_SELECT
und genau das ist auch der Grund warum ich diesen Befehl in meiner Lösung verwendet habe,
welche du jetzt etwas merkwürdigerweise nicht übernommen hast 😉
#Siehe oben bei "Hier eine Variante die funktioniert"


>>"sondern muss ein Quellobjekt wählen,"
>>"wodurch ich nicht mehr beide Linien und den Radius wählen kann."
>>"Leider muss ich da per Hand Enter drücken."
Ja leider, deswegen habe ich mir der vorherigen Objektmarkierung via PSELECT bedient,
in diesem Fall ist der Join Befehlsablauf nämlich weiterhin wie erwartet.
#Siehe oben, ebenfalls bei "Hier eine Variante die funktioniert"

 

>>"Desweiteren funktioniert mein erstes _P nicht, weil AutoCAD nicht erkennt, dass ich die drei Linien,
>>"die ja jetzt zusammen sind, also ein neues Objekt anscheinend, auswählen will.
Darüber brauchen wir nicht sprechen da das Marko überhaupt nicht funktioniert,
also längst abgebrochen ist und zum ersten _P kommt es überhaupot nicht mehr {hoffe ich sehe das richtig}.

 

;; Ich habe deshalb mal einen Ansatz für Autolisp gemacht:

(defun c:BigOffset (/ e i) ; lokale Variablen e und i, vergessen wurden ei und e1
  
(if (and
       (setq i 1)
       (while 'T  ; Diese Bedingung wird sich NIEMALS ändern, also wird die while-Schleife durchgeführt bis die Sonne explodiert
 	   (setq ei (car(entsel "Wähle verbundene Linien und Bögen für Offset"))) ; Damit überschreibst du jegliche vorherige Zuweisung zu ei
	                                                                          ;(also egal wiviel objekte, ei referenziert immer nur das zuletzt gewählte objekt
	   (setq i (+ 1 i)) ; warum zählst du hier die Durchläufe mit, dazu noch um einen Zähler zuviel? Versteh diese i einfach nicht.
       )
     )
     (setq i 2) ; Hierhin kommt das Lisp zwar nie, aber falls doch: Hier überschreibst du den Wert von i mit 2 ??? Dann hätte man sich das zählen auch sparen können.
     (command "CMDECHO" 1
	      "_.JOIN" e1 e(while 'T (+ 1 i)            ; dem Gedankengang dieser Zeile kann ich wirklich nicht meehr folgen
	      "_.OFFSET" e1 PAUSE "_.EXPLODE" e1 "")    ; das Objekt auf welches e1 verweist gibt es nicht mehr..
     )                                                  ; Zudem möchte Offset zuerst den Abstand wissen, dann die Objekte
)                                                       ; dann die Seite
                                                        ; und den Befehl beendet hast du auch nicht als du versuchst _Explode aufzurufen
(princ)
  
)

 

>>"Auch hier habe ich leider wenig Ahnung von verschiedenen Dingen"
Deswegen verstehe ich auch hier nicht warum du soviele Zeile getipppt hast, wo es doch schon am Anfang kracht und überhaupt nicht
funktioniert. Wie kommt man dann zu dem ganzen Rest - das ergibt doch keinen Sinn? Erkläre mir das doch bitte vielleicht
noch einmal. Wenn man 100 Punkt als Ziel hat, ein Punkt auf dem anderen aufbaut oder davon abhängt,
wie kann man dann die Punkte 40 80 100 haben, obwohl man Punkt5 schon nicht geschafft hat?
Ich kann mich da nicht reindenken und würde gerne wissen wie sich soetwas ergibt - mit welchem Gedanken dabei.


>>"Während der ersten Schleife soll man alle Linien auswählen die man als Offset haben will,"
Das Hauptproblem dieser Schleife habe ich oben im code schon kommentiert,
hier eine einfache und schöne Lösung: SSGET
(setq MeinAuswahlsatz (ssget '((0 . "LINE,CIRCLE"))))
Wenn man sich neben SSGET nnoch SSNAME anschaut in der Hilfe, dann kommt man auch
schnell zu (ssname MeinAuswahlsatz 0) für das erste Objekt im Auswahlsatz, FALLS man das mal bräuchte.
SSGET ist für gewöhnlich die erste Lispfunktion die der Großteil an Anwendern lernt.
ssget ssadd sssetfirst ssdel sslength ssname


>>"wobei ich nicht glaube, dass der Wert ei funktioniert"
das ei referenziert immer das zuletzt gewählte Objekt, oder nichts - falls nichts gewählt wurde.

>>" Ich wollte dadurch erreichen, dass die erste Linie e1 heißt und dann eventuell ein Radius e2 und so weiter."
e2 UND SO WEITER ist aufwändig, aber auch uinnötig und daher zeige ich nur eine e1 + rest Variante
(setq e1 (car(entsel)))
(setq rest (ssget))

Du wirst aber bei der praktischen Umsetzung dieses e1 getrennt vom Rest nicht benötigen,
daher wirst du bei meiner untenstehenden Lösung dies auch nicht finden.

>>"Und mir fehlt der Syntax der Funktionen JOIN OFFSET und EXPLODE
Dafür kann man den Befehl starten und füttern, im Textfenster wird ersichtlich was der Befehl möchte.
Wichtig ist im Hinterkopf zu behalten dass es verschiedene Versionen eines Befehls geben kann und daher
muss man, zumidnest wenn der erste Test auf gut dünken nicht klappte, direkt mit einm automatisierten
Ablauf prüfen.

Ich hänge mal einen Protokollauszug an bei dem ich so eine "Analyse" des Befehlsablaufes durchführe,
Schritt für Schritt folge ich dem Dialog und erhalte somit meinen vollständigen Ablauf.

 

<siehe Dateianhang>


>>"Es ist aber bestimmt nötig die neu entstandene Polylinie wieder neu zu bennen und damit weiter zu machen"
Du benennst damit ja nichts, aber es ist kalr was du meinst.
Wenn man das wollte und benötigen würde, dann ist es einfach.. da es ja das letzte Element ist!
Objektwahl L Letztes _L _LAST
oder auch (unnötigerweise) im Lisp ermittelt: (setq epoly (entlast))

 

-

 

Es sind noch nicht alle Fragen geklärt zu deinem Wunsch-Ablauf,

hier ein simples Beispiel in der Art wie du es versucht hast.

Den Offsetabstand gibt der User per Tastatur/Zahl ein,

versetzt wird immer nach aussen.

 

(defun c:BigOffset (/ aws)
(if (setq aws (ssget '((0 . "*LINE,CURCLE"))))
    (progn
      (initcommandversion)
      (command "_.JOIN" aws "") ; verbinden
      (setq joinelem (entlast))    ; neues Element "merken"
      (command "_.OFFSET" PAUSE joinelem "1e99,1e99" "") ;_ neues Objekt per offset erstellen, hier ein einfaches Beispiel mit Abstandseingabe und "nach aussen"
      (command "_.EXPLODE" joinelem)  ;das Join Element wieder auflösen
    )
)
(princ)
)




 

 

Meine Kommentierung einzelner Punkte wie auch Makro und Lisp-Lösungen bedeuten nicht

unbedingt dass ich diese Wege generell als Lösung vorschlage, ich erkläre nur die

Fehler und wie die Einzelfälle richtig/besser aussehen würden.

 

Ich hoffe diese Antwort bringt dich weiter.

 

 

 

 

 

 

 

 

- Sebastian -
Nachricht 7 von 8
sascha.krahwinkelVWMN3
als Antwort auf: cadffm

Vielen Dank, dass du dich weiterhin mit meinem Halbwissen auseinandersetzt und mir so gut weiter hilfst!

 

Also das Befehlsmakro mit ^c^cPSELECT hab ich jetzt verworfen, weil die Autolisp-Variante deutlich schöner ist.

Vielen Dank für die Kommentare dazu und die Hilfe, hat mir trotzdem sehr geholfen einige Zusammenhänge besser zu verstehen.

Ich habe immer weiter programmiert um den Weg zu zeigen, den ich gehen wollte um ans Ziel zu kommen. Weil dadurch dachte ich mir kann ich einen Weg vorschlagen, auch wenn es für mein grundlegendes Problem deutlich besser Wege geben mag, damit ich an der Lösung beteiligt bin und diese besser nachvollziehen kann. Hätte ich einfach nach einem Makro gefragt und hätte mir keine Gedanken gemacht könnte ich diese Lösung nicht nachvollziehen. Aber dank deiner super vielen nützlichen Kommentare kann ich alles sehr gut nachvollziehen.

 

Eine ssget Lösung für einen Auswahlsatz ist deutlich besser als mein Ansatz. Und das meine Auswahlschleife nicht zum Ergebnis führt dachte ich mir leider schon.

 

Dein Dateianhang ist sehr gut. Ich denke Join und Offset sind leider schwierige Befehle um dein Vorgehen zu demonstrieren, aber ich verstehe wie du an die Sache ran gehst.

Könntest du mir trotzdem sagen, wie du an dieses initcommandversion gekommen bist? Ich kann mir vorstellen, dass du schon länger dabei bist und deshalb einfach weißt wie sich der Befehl im Laufe der Zeit verändert hat, aber wie kamst du genau drauf den an dieser Stelle zu nutzen?

 

Dein Makro ist sehr gut. Durch 2/3 kleine Änderungen habe ich genau das was ich wollte! 1000 DANK!!!

 

(defun c:BigOffset (/ aws joinelem)
(if (setq aws (ssget '((0 . "LINE,ARC"))))
(progn
(initcommandversion)
(command "_.JOIN" aws "") ; verbinden
(setq joinelem (entlast)) ; neues Element "merken"
(command "_.OFFSET" PAUSE joinelem PAUSE "") ;_ neues Objekt per offset erstellen, hier ein einfaches Beispiel mit Abstandseingabe und "nach aussen"
(command "_.EXPLODE" joinelem) ;das Join Element wieder auflösen
)
)
(princ)
)

 

Ich glaube ssget (0."CIRCLE") will einen vollen Kreis, weshalb ich Bögen nicht auswählen konnte. Habe ihn deshalb gegen ARC ausgetauscht und es funktioniert. Bei der Variablendefinition in der Kopfzeile hab joinelem hinzugefügt (ich bin mir nicht sicher ob das nötig ist oder überflüssig). Und da es nicht sicher ist in welche Richtung das Offset gehen soll habe ich ne Pause eingefügt. So funktioniert es genau wie ich es mir vorgestellt habe!

Wie kamst du an dieses 1e99 für Offset nach außen? Wie ist der Code für innen? Für die Zukunft sicher gut zu wissen.

 

Nochmal tausend Dank! Danke für die Zeit, deine ausführlichen Antworten, meine Fehlerkorrektur, den Vorschlag, die Hilfe und deine Geduld!

 

Ich wünsche dir alles Gute!

 

Liebe Grüße,

Sascha

 

 

 

Nachricht 8 von 8
cadffm
als Antwort auf: sascha.krahwinkelVWMN3


>> "Ich glaube ssget (0."CIRCLE") will einen vollen Kreis, weshalb ich Bögen nicht auswählen konnte.
>> "Habe ihn deshalb gegen ARC ausgetauscht und es funktioniert."

Ja, es filtert KREISE, es heißt zudem CIRCLE nicht CURCLE.
Richtig erkannt und geändert.

 

>> "Könntest du mir trotzdem sagen, wie du an dieses initcommandversion gekommen bist?"
Es ist eine wie alle anderen Lispfunktionen, stehen Seite an Seite in der Hilfe
und bei der Einführung wurde dies, wie zum größten Teil Standard, dokumentiert.


>> "Ich kann mir vorstellen, dass du schon länger dabei bist und deshalb einfach weißt wie sich der Befehl im Laufe der Zeit verändert hat"
Ich bin länger dabei, daher sind mir ein paar Änderungen grob bekannt bzw. kann ich mir herleiten.
Es geht weniger um das Auswendig wissen, es geht darum allgemein zu verstehen dass
1. Standard in Automation oft ein ältere Version aufgerufen wird,
2. das die aktuelle Befehlsversion (Handeingabe) eine andere sein kann
3. das ACAD auch Versionen dazwischen kennen könnte (je nach Befehl)
4. das ACAD beim aufruf eines Dialog-Befehls zwar automatisch die Befehlszeilenversion startet,
diese aber nicht übereinstimmen muß mit der selbst aufgerufenen Befehlszeilenversion.

Wer sowas im Hinterkopf hat der kann bei Problemen auch mal zielgerichtet nach soetwas schauen,
auswendig wissen muß man aber die Änderungen und Abäufe nicht.


>> " aber wie kamst du genau drauf den an dieser Stelle zu nutzen?"
Nun, Join hat sich in der Automatisierung anders verhalten wie per Hand,
die Chance das es sich einfach um eine alte Version handelt war demnach groß,
getestet und bestätigt.


>> "hab joinelem hinzugefügt (ich bin mir nicht sicher ob das nötig ist oder überflüssig)."
Es ist guter sauberer Stil, richtig so. BigOffset hätte es zwar nicht beeinflusst, aber theoretisch (vielleicht) andere Programme!!


>> "Und da es nicht sicher ist in welche Richtung das Offset gehen soll habe ich ne Pause eingefügt"
Perfekt.

>>"Wie kamst du an dieses 1e99 für Offset nach außen?"
Nun, eine Software legt Daten in verschiedenen Datentypen ab,
diese Datentypen haben ihre Grenzen, das hat noch nicht einmal mit
der Größe des Zahlenwertes zutun, sondern mit der zu speichernden Länge des Zahlenwerte.
Ob 1000.0 oder 0.0001 ist das dabei das Gleiche.

1e99 unvorstellbar weit weg von auch nur irgendwie sinnvoll zu bearbeitenden Zahlenwerten bzw. Koordinaten in AutoCAD,
unterm Strich sagt ACAD ab irgendwann nur noch "er meint wohl 'am Ende' - lol.

 

Bei der Angabe 1e99,1e99 kann ich blind davon ausgehen: Dieser Punkt liegt nicht auf der Innenseite 😉

Du fragst nach der Innenseite? Keine Ahnung, denn mein 1e99 ist ja keine Formal oder ein Programm,

das kann ich nicht wissen solange das Polygon nicht ein paar Regeln folgt.

Beispiel Rechteck: Hier könnte man den Geometrischen Schwerpunkt nehmen(Objektfang),

aber dafür muß man auch davon ausgehen dürfen(müssen) es handelt sich auch immer um

eine Form bei der man so vorgehen kann.

 

Falls es dir nicht bekannt ist: Aus diesem zugrunde liegenden Problem sollte man immer, immer wenn es geht,
möglichst nache an WKS 0,0,0 arbeiten.

Im Bereich bis zu -99999,-99999 / +99999,+99999 wird man "praktisch" keine Probleme bekommen
Im Bereich -1000000,-100000 / +100000,+100000 bis -999999,-999999 / +999999,+999999 wird man selten Komplikationen haben
Im Bereich von 7stellig bekommen ich schon Bauschmerzen und der Anwender doch schön öfters mal Probleme
mit einigen Funktionen, wie Versetzen, Stutzen, Schraffurmuster oder einfach dem berechneten Objektfang wie LOT
Ab 2stelliger Millionentahl vor dem Komma(oder Punkt), hast du ein Abo auf Probleme mit diversionen Funktionen.
AutoCAD, wie auch die meisten anderen dieser Art allgemeinr Basis CAD-Programme, sind nich für
die Arbeit in diesen Koordinatenbereich ausgelegt.
Die Anzeigegenauigkeit von Zahlenwerten ist auf max. 8 begrenzt (Luprec/Auprec) und das entspricht dann auch ca.
dem was ich als Maximum angesprochen habe:
-9999999 oder auch (+)9999999 sind genau 1stelliger Millionenbereich plus das mathematische Vorzeichen[+/-].
AAD hat dann noch 4 bis max. 6 Nachkommastellen mit dem es exakt arbeiten kann, alles weas sich weiter rechts befindet lwird gerundet
und führt zu (Rundungs-)Fehlern im Ergebnis.

- Sebastian -

Sie finden nicht, was Sie suchen? Fragen Sie die Community oder teilen Sie Ihr Wissen mit anderen.

In Foren veröffentlichen  

Autodesk Design & Make Report