| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: getpoint mit Fangfuunktion (3182 mal gelesen)
|
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 16. Nov. 2011 20:28 <-- editieren / zitieren --> Unities abgeben:
Hallo habe ein tolles Programm geschrieben, das aber etwas perfektioniert werden müßte. Es findet den Punkt, der genau zwischen zwei angegebenen Punkten liegt. Code: ; Halbierungspunkt finden (defun c:hh () (mapcar '(lambda (r s / ) (/ (+ r s) 2.0)) (getpoint "Zwei Punkte anklicken") (getpoint " - Zweiten Punkt anklicken")))
Um ihn transparent, zum Beispiel bei der Abfrage des Mittelpunktes beim Zeichnen eines Kreises, aufzurufen, muss ich 'hh eingeben, dann klicke ich zwei Punkte, und schon ist der Mittelpunkt definiert. Zwei Probleme: 1. Leider versagt die Funktion, wenn ich einen dieser Punkte mit einer Fangfunktion (Endpunkt, Schnittpunkt) festlege. Kann man da was tun? 2. Der Aufruf dieser Funktion hh wäre ohne dem Apostroph viel benutzerfreundlicher. Aber dann kann man sie nicht transparent aufrufen. Oder gibt es da eine Lösung? Diese Funktion soll über die Tastatur aufgerufen werden. LG, Barbara Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 16. Nov. 2011 20:53 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 17. Nov. 2011 00:35 <-- editieren / zitieren --> Unities abgeben:
Danke, aber Deine "rudimentäre" Angabe bringt mich nicht zur Lösung. Es soll ja nicht die voreingestellte Osnap-Auswahl oder bestimmte Schnäppe, wie Du hier vorgeschlagen, zur Anwendung kommen, sondern diese Fangoption, die der Anwender zum Zeitpunkt der Punkteingabe anwendet. Oder kann man irgendwie die aktuell angewendete Fangoption bei der Punkteingabe lesen? Das grread kenne ich -noch- nicht, weil ich nicht so viel Erfahrung habe. Was ich jetzt so mal schnell recherchiert habe, sehe ich keinen Hoffnungsschimmer im Zusammenhang mit meinem Problem. Der integrierte Fang _m2p scheint in meiner Version (AutoCAD 2000) nicht vorhanden zu sein. Eine solche Funktion, wie ich sie schreiben will, muss doch schon geben. Nur gefunden habe ich nichts. LG, Barbara Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 17. Nov. 2011 07:14 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 17. Nov. 2011 08:19 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Hallo Barbara, du kannst bei (Getpoint ..) die ganz normalen Objektfänge nutzen. Ohne die Funktion mehrfach zu programmieren, kannst du auf sehr einfachem Weg, wie der folgende Code zeigt, die Funktion als transparenten und als normalen Befehl definieren.
Code:
; Halbierungspunkt finden ;;; Befehlsaufruf (defun c:hh () (_hh) ) ;;; transparenter Befehlsaufruf [EDIT: muss nict extra definiert werden!! Befehl ist mit obiger Definiti0on transparent aufrufbar] (defun c:'hh () (_hh) ) ;;; Arbeitsfunktion (defun _hh (/ p1) (mapcar '(lambda (r s / ) (/ (+ r s) 2.0) ) (progn (initget 1)(setq p1(getpoint "\nZwei Punkte für Mittelpunktbestimmung anklicken.\nErster Punkt: "))) (progn (initget 1)(getpoint p1 "\nZweiten Punkt: ")) ) )
Bei Fragen ... Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 18. Nov. 2011 02:34 <-- editieren / zitieren --> Unities abgeben:
Danke für Eure Antworten. Zum Punkt Objektfang: Ja, ich kann es HEUTE ganz normal nutzen, aber GESTERN ging es nicht. Hat mir was einen seltsamen Streich gespielt und einige Stunden gekostet. Da jetzt alles wie erwartet, wie gewünscht und wie beschrieben funktioniert, ist die Sache erledigt. (Vielleicht bis MORGEN). :-) Zum Punkt Transparenter Aufruf: Sicher, man kann die Funktion schon transparent aufrufen. Das habe ich ja nie bestritten, aber das blöde Apostroph muss ich immer schreiben. Aber das muss wohl so sein. Ich kann es mir ja auch auf einen Button legen. Doch eine Frage zum Skript von Holger möchte ich noch nachheizen: Hat es irgendeine Bedeutung, wenn die Funktion c:'hh, c:_hh oder c:hh heisst? Oder ist der Unterstrich oder Apostroph einfach teil des Namens und sonst nichts? Danke. LG, Barbara 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: 18. Nov. 2011 07:16 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 18. Nov. 2011 07:54 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von Barbara33: ... Hat es irgendeine Bedeutung, wenn die Funktion c:'hh, c:_hh oder c:hh heisst? Oder ist der Unterstrich oder Apostroph einfach teil des Namens und sonst nichts? ...
Richtig, es ist einfach Teil des Namens. Allerdings wertet Acad die Namen aus und entscheidet darüber, wie mit dem Befehl verfahren wird. Daher gilt folgendes: ein C: im Namen bewirkt, dass der Befehl in der Befehlszeile aufgerufen werden kann, ohne die Lisp-Klammer-Syntax verwenden zu müssen. ein C:' [Edit: muss nicht extra angegeben werden, da jeder mit (defun C: ..) Befehl transparent aufgerufen werden kann mehr Festlegungen der Funktionsnamenkonventionen sind mir nicht bekannt. Also wird alles andere als Lisp-Funktion behandelt und muss auch in der Befehlszeile mit Klammern aufgerufen werden. noch ein Hinweis: Funktionen, deren Name mit C: beginnt, dürfen danach keine Funktionsparameter besitzen, da man diese ohnehin nicht 'füttern' kann, denn der Befehl wird in der Befehlszeile ohne Klammern aufgerufen, und ein Leerzeichen wird als [Eingabe] interpretiert. Beispiel:
Code:
;; ist Unzulässig (defun C:TEST (param / lokalVar)(...)) ;; ist zulässig (defun TEST (param / lokalVar)(...))
Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
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: 18. Nov. 2011 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Moin Holger, Zitat: ein C:' im Namen bewirkt zusätzlich, dass Acad die Funktion auch dann ausführt, wenn bereits ein anderer Befehl aktiv ist.
Genau das glaube ich nicht oder ich mache irgendwas falsch. Nochmal meine Testfunktionen, alle 3 werden geladen:
Code:
(defun c:'test ( / ) (princ "\nTransparenter Aufruf."))(defun c:test ( / ) (princ "\nNormaler Aufruf.")) (defun c:_test ( / ) (princ "\nUnterstrich Aufruf."))
Wenn ich jetzt z.B. im Linie-Befehl bin, und 'test aufrufe, dann wird mir die Princ-Anweisung "Normaler Aufruf" präsentiert, also wird die Funktion c:test angesprochen. Ich glaube, das Apostrop hat in der Definition des Funktionsnamens keine Auswirkung.Im Gegenteil, wenn ich nur die erste Funktion lade, dann kann ich diese gar nicht starten
------------------ viele Grüße Jörn http://www.bosse-engineering.com Stammtisch in Wolfsburg http://ww3.cad.de/foren/ubb/Forum491/HTML/000179.shtml Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 18. Nov. 2011 11:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn und Holger, Code: (defun c:'test-t ( / ) (princ "\nTransparenter Aufruf.")) (defun c:test-n ( / ) (princ "\nNormaler Aufruf.")) (defun c:_test-u ( / ) (princ "\nUnterstrich Aufruf."))
Dies war Jörns Beispiel, diesmal aber mit unterschiedlichen Namen. Dabei stelle ich fest: Die Funktion test-n kann ausgeführt werden 'test-n auch transparent. Aber auch mit Unterstrich: _test-n was auch immer der bewirkt. Aber es geht. Die Funktionen 'test-t _test-u test-t und test-u gibt es für AutoCAD einfach nicht, auch nicht in transparenter Anwendung. Holger, deswegen verstehe ich Deine folgenden Sätze nicht: Zitat: Ohne die Funktion mehrfach zu programmieren, kannst du auf sehr einfachem Weg, wie der folgende Code zeigt, die Funktion als transparenten und als normalen Befehl definieren.
und Zitat: ein C:' im Namen bewirkt zusätzlich, dass Acad die Funktion auch dann ausführt, wenn bereits ein anderer Befehl aktiv ist.
Kannst Du bitte genauer erklären, was Du damit meinst? Gruß, Barbara
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Nov. 2011 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Hallo, ich kenne es auch nur so . Ich definiere die Funktion. Zitat: (defun c:test (/) (princ "\nNormaler Aufruf.") )
Dann kann ich den Befehl transparent aufrufen in dem ich ein Hochkomma voranstelle 'test. Ohne hockomma funktionen zu definieren. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 18. Nov. 2011 11:50 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
... stimmt. Ich hatte es in erinnerung, dass ein transparenter Befehl definiert werden muss, wie ich's oben geschrieben habe. Das ist aber nicht notwendig!Daher korrigiere ich die Aussage: ein mit (defun C:... bedinierte Funktion kann dann auch transparent aufgerufen werden. Ich werde den obigen Beitrag editieren. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Nov. 2011 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Also eine frage bleibt für mich hier irgendwie offen. Zitat: Zum Punkt Transparenter Aufruf: Sicher, man kann die Funktion schon transparent aufrufen. Das habe ich ja nie bestritten, aber das blöde Apostroph muss ich immer schreiben. Aber das muss wohl so sein. Ich kann es mir ja auch auf einen Button legen.
Bei was benutzt du denn deine Funktion c:hh ich könnte mir vorstellen das man da etwas kombinieren kann oder eine abfrage einbauen kann so das du dir die Eingabe mit dem Hochkomma komplett sparen kannst. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Nov. 2011 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Nachtrag wenn es nur für Keise sein soll könnte das doch schon reichen Code: (defun c:k1 (/ pkt1 pkt2) (setq pkt2 (getpoint (setq pkt1 (getpoint "Erstenpunkt wählen")) "Zweiten Punkt wählen" ) ) (command "Kreis" (mapcar '(lambda (r s /) (/ (+ r s) 2.0)) pkt2 pkt1 ) pkt2 ) )
------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. [Diese Nachricht wurde von Meldin am 18. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 18. Nov. 2011 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Nov. 2011 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Galt auch nur als Hinweis dass es eine Möglichkeit gibt ohne zusätzlichen Aufruf einer transparenten Funkion. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 18. Nov. 2011 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Nov. 2011 13:59 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Ja so ist es aber mal schauen wofür Barbara das ganze benötigt dann könnte man gezielter ansetzen. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 18. Nov. 2011 16:45 <-- editieren / zitieren --> Unities abgeben:
Wofür diese Funktion? Wo diese Funktion einsetzen? Ich brauche sie fast so oft wie Endpunkt oder Schnittpunkt. Wenn ich ein Klo mittig zwischen zwei Wände setze, wie es in unseren Breiten üblich ist, dann ist der Einfügepunkt genau zwischen den Endpunkten zweier paralleler Linien (eben die Wände). Oder wenn ich eine Linie zeichnen muss, oder den Anfangspunkt eines Kreisbogens, oder den Mittelpunkt eines Kreise, oder oder oder. Die Einsatzmöglichkeiten sind so vielfältig, das kann man auf Programmebene gar nicht mit was anderem kombinieren. Mich wundert, dass ich diese Funktion als lsp nirgends gefunden habe. Also so, wie es jetzt ist, als zusätzliche Fangfunktion, ist es schon OK. Und das Apostroph muss man eben schreiben, wenn man die Funktion händisch eintippt. Mr. Cadmium hat mit seiner ersten Antwort ganz oben Zitat: zu 2. ) Ist so
schon richtig geantwortet. Auch folgender Hinweis Zitat: ja , mir ist das schon klar .. ich wollte nur nochmal drauf hinweisen, ... nicht das jemand die Funktion so nimmt und sich wundert, warum der Kreis nicht evtl in der wahren Mitte gezeichnet wird .... gerade Anfänger verzweifeln dann. Ist ja auch nicht gerade naheliegend.
trifft voll ins Schwarze. Für mich leider einige Stunden zu spät. Bei einem anderen Programm war ich nämlich verzweifelt auf Fehlersuche. Da wurde eine Linie, die mit (command "_LINE" ...) erstellt wurde, falsch gezeichnet. Nur weil der Osnap an war. Hat mir auch einige Stunden Fehlersuche abgerungen. Habe dabei aber einiges gelernt. Hätte ich die Linie gleich synthetisch (mit ssadd) erzeugt, wäre das Ganze einfacher gewesen. Wieder was dazu gelernt. Trotzdem macht AutoLISP großen Spass. Danke. LG, Barbara Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 18. Nov. 2011 20:58 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 18. Nov. 2011 21:04 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Nicht OSNAP/osmode ist der Fehler , sondern deine Einstellung der Systemvariable OSNAPCOOR D (die oben bereits angesprochen wurde). Zudem wäre die BoardLösung ein Makro zu verwenden der den Geometrierechner von Acad nutzt (CAL), mit dessen Hilfe konnte man auch ohne Lisp das "Mitte 2 Punkte" nutzen (Beispiele im Forum). ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) [Diese Nachricht wurde von cadffm am 18. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 22. Nov. 2011 00:11 <-- editieren / zitieren --> Unities abgeben:
Jetzt geht es doch nicht. Bin schon am Verzweifeln. Es liegt nicht an OSNAPCOORD. Nochmals gaaanz ausführlich: Ich möchte eine Fangfunktion für Punkt zwischen zwei Punkten machen. In AutCAD 2000 gibt es das nicht. Dazu habe ich eine Routine namens "##" geschrieben, die bei Aufforderung zur Eingabe eines Punktes beim Zeichnen einer Linie transparent aufgerufen wird. Das Transparentapostroph liegt auf der selben Taste wie #, daher zur bequemeren Eingabe der ungewöhnliche Name. Code: (defun c:## (/ p1) (mapcar '(lambda (r s / )(/ (+ r s) 2.0)) (progn (initget 1)(setq p1(getpoint "Zwei Punkte anklicken.\nErster Punkt: "))) (progn (initget 1)(getpoint p1 " - Zweiten Punkt: ")) ) )
Gegeben sei nun eine Linie, die ich vollständig sehe. Wenn ich nun zB eine neue Linie (oder Kreis) zeichnen will, rufe ich bei der Aufforderung des ersten Punktes der Linie (beziehungsweise Kreismittelpunktes) diese oben genannte Funktion mit '## auf. Zwei Punkte werden abgefragt, in deren Mitte der gewünschte Punkt liegt. Dies funktioniert NICHT, wenn ich für die beiden abgefragten Punkte die Endpunkte der o.g. bestehenden Linie wähle und für OSNAP Endpunkt eingeschaltet ist. Und das bei jeder beliebigen Einstellung von OSNAPCOORD! Wie muss diese Funktion "##" aussehen, dass sie auch für diesen Fall funktioniert? LG, Barbara
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: 22. Nov. 2011 00:43 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von Barbara33: ... Ich möchte eine Fangfunktion für Punkt zwischen zwei Punkten machen. In AutCAD 2000 gibt es das nicht. ...
Wenn ich mich richtig erinnere, gibt es den Geometriecalculator auch schon in AutoCAD 2000 (geomcal.arx). Auch dort gabs schon eine transparente Funktion zum Ermitteln der Mitte zweier Punkte: Dann wäre ein Linienanfang zwischen 2 Punkten etwa so zu erstellen:
Befehl:LINIE Ersten Punkt angeben: 'cal >>>> Ausdruck: mee >>>> Wählen Sie einen Endpunkt für MEE: >>>> Wählen Sie einen weiteren Endpunkt für MEE:
------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 22. Nov. 2011 01:12 <-- editieren / zitieren --> Unities abgeben:
Diese von Dir beschriebene Funktion versagt doch bei beschriebenen OSNAP-Einstellungen genauso. Außerdem geht sie nur für einen Punkt zwischen Endpunkten. Meine Funktion geht für alle Punkte, außer für solche, deren Ergebnis von OSNAP verändert wird. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 22. Nov. 2011 07:56 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von Barbara33: Jetzt geht es doch nicht. Bin schon am Verzweifeln. Es liegt nicht an OSNAPCOORD. Nochmals gaaanz ausführlich: Ich möchte eine Fangfunktion für Punkt zwischen zwei Punkten machen. In AutCAD 2000 gibt es das nicht. Dazu habe ich eine Routine namens "[b]##" geschrieben, die bei Aufforderung zur Eingabe eines Punktes beim Zeichnen einer Linie transparent aufgerufen wird. Das Transparentapostroph liegt auf der selben Taste wie #, daher zur bequemeren Eingabe der ungewöhnliche Name. Code: (defun c:## (/ p1) (mapcar '(lambda (r s / )(/ (+ r s) 2.0)) (progn (initget 1)(setq p1(getpoint "Zwei Punkte anklicken.\nErster Punkt: "))) (progn (initget 1)(getpoint p1 " - Zweiten Punkt: ")) ) )
Gegeben sei nun eine Linie, die ich vollständig sehe. Wenn ich nun zB eine neue Linie (oder Kreis) zeichnen will, rufe ich bei der Aufforderung des ersten Punktes der Linie (beziehungsweise Kreismittelpunktes) diese oben genannte Funktion mit '## auf. Zwei Punkte werden abgefragt, in deren Mitte der gewünschte Punkt liegt. Dies funktioniert NICHT, wenn ich für die beiden abgefragten Punkte die Endpunkte der o.g. bestehenden Linie wähle und für OSNAP Endpunkt eingeschaltet ist. Und das bei jeder beliebigen Einstellung von OSNAPCOORD! Wie muss diese Funktion "##" aussehen, dass sie auch für diesen Fall funktioniert? LG, Barbara[/B]
Was genau funktioniert denn nicht ? Sorry , kann ich momentan nicht nachvollziehen ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." 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: 22. Nov. 2011 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Da der Objektfang auf den Rückgabewert der Funktion '## angewendet wird, und der Rückgabewert dadurch nochmals (unbrauchbar) verändert wird, muss man entweder von Aufruf von '## den Objektfang für den nächsten Punkt deaktivieren (dazu Ofang kei / _non vorausschicken - das kann auch auf einem Buttonmakro geschehen) Code: Befehl: _LINE Ersten Punkt angeben: _NON '## Zwei Punkte anklicken. Erster Punkt: - Zweiten Punkt: Nächsten Punkt angeben oder [Zurück]:
Oder im Programm den Ofang vor der Rückgabe des berechneten Punktes dauerhaft deaktivieren
Code: (if (< (getvar "osmode") 16384)(setvar "osmode" (+ (getvar "osmode") 16384)))
man muss ihn dann allerdings manuell (z.B. mit F3) wieder einschalten, oder (Idee nach Hinweis von cadffm) Punkt mit Command und vorgeschaltetem _non senden Code: (defun c:## (/ p1) (command "_NON" (mapcar '(lambda (r s / )(/ (+ r s) 2.0)) (progn (initget 1)(setq p1(getpoint "Zwei Punkte anklicken.\nErster Punkt: "))) (progn (initget 1)(getpoint p1 " - Zweiten Punkt: ")) )))
------------------ Mit freundlichem Gruß
Udo Hübner www.CAD-Huebner.de [Diese Nachricht wurde von CAD-Huebner am 22. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 22. Nov. 2011 14:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Antwort an CADmium, dem Moderator, was da genau nicht funktioniert: Die neu gezeichnete Linie sollte genau zwischen den Endpunkten der bestehenden Linie beginnen. Und das tut sie bei mir nicht. Die Abweichung vom erwarteten Ergebnis ist das Problem. Da ich nicht weiß, was Du konkret nicht nachvollziehen kannst, frage ich zurück: Wie weit kannst Du mir folgen, bis zu welchem Punkt? Antwort an Udo Hübner: Dem Anwender, der Anwenderin, sollen seine gewohnten Fangeinstellungen bei der Bestimmung der beiden Punkte zur Verfügung stehen. Er soll sich keine Gedanken machen müssen, was gerade bei dieser Funktion zu berücksichtigen ist. Den Objektfang zu deaktivieren wäre da nicht gut. Auch nachher händisch wieder aktivieren will ich dem gestressten Anwender auch nicht antun. Vielleicht gibt es eine andere Lösung? Vielleicht den Objkektfang nur für die Punktrückgabe deaktivieren, wäre eine Idee. Danke. LG, Barbara 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: 22. Nov. 2011 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von Barbara33: ... Vielleicht gibt es eine andere Lösung? Vielleicht den Objkektfang nur für die Punktrückgabe deaktivieren, wäre eine Idee. ...
Genau das macht doch dein (von mir überarbeitetes) Makro jetzt!
Code: (defun c:## (/ p1) (command "_NON" (mapcar '(lambda (r s / )(/ (+ r s) 2.0)) (progn (initget 1)(setq p1(getpoint "Zwei Punkte anklicken.\nErster Punkt: "))) (progn (initget 1)(getpoint p1 " - Zweiten Punkt: ")) )))
------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 22. Nov. 2011 14:23 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Langsam wird es hier witzig, auch wenn es von niemandem so gewollt ist Eines Vorab: Das Hockomma umgeht man indem man sich den Programm/Makroaufruf auf die AutoCAD Oberfläche legt (Werkzeugkasten), ein Klick und fertig. "Mitte 2 Punkte" ist so ziemlich das häufigste Programm was es gibt, das einzige Problem was es bei dir gibt sind die welche du nicht berücksichtigst, um etwas zu berücksichtigen muß man die Dinge natürlich kennen. OBJEKTFANG OSNAPCOORD WKS/BKS Ich denke das dein Programm funktioniert wenn du mit (Command "_.Line" arbeiten würdest, oder es würde funktionieren wenn du du den ermittelten Punkt auf WKS-Koordinaten umrechnen würdest. Oder liege ich falsch und du berücksichtigst in welche Koordinatensystemen die jeweiligen Punkte ermittelt und übermittelt werden ?
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 22. Nov. 2011 18:31 <-- editieren / zitieren --> Unities abgeben:
Hallo ja, sehr witzig. Aber: Udo Hübner, Dein "_NON" ist die Lösung. Danke. Habe ich es vorher übersehen, oder ist es das, was Du nachher noch eingefügt hast??? Ich glaube zweiteres, denn Dein _NON in der Befehlszeile Ersten Punkt angeben: _NON '## wäre ja überflüssig, wenn es schon im Code weiter unten steht. Das sollte wieder rückgeändert werden. Dennoch, ein kleiner Schönheitsfehler ist noch da: AutoCAD schreibt nach Ablauf dieser Routine "error: bad argument value: AutoCAD command:" Wenn man das auch noch wegbekäme, wär es perfekt. Wenn nicht, macht's auch nix. Hauptsache es läuft. Danke. An cadffm: Deinen letzten Beitrag habe ich überhaupt nicht verstanden. Wie auch immer das BKS liegt, es funktioniert. Auch die OSNAPCOORD-Einstellung ist egal. LG, Barbara
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 22. Nov. 2011 21:11 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 23. Nov. 2011 10:11 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von Barbara33: Dennoch, ein kleiner Schönheitsfehler ist noch da: AutoCAD schreibt nach Ablauf dieser Routine "error: bad argument value: AutoCAD command:" Wenn man das auch noch wegbekäme, wär es perfekt. Wenn nicht, macht's auch nix. Hauptsache es läuft.
Meines wissen darf eine Funktion die in einem AC Befehl transparent aufgerufen wird kein "command" enthalten. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 23. Nov. 2011 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Nov. 2011 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
1. wird der Linien-Befehl ganz normal über die Acadoberfläche oder per Aliasnamen aufgerufen 2. kann da auch gerne ein Command drin sein, das Command _non führt hier sogar zum Ziel. Leider habe auch ich das eigentliche Problem hier zu spät begriffen (denn die Punktermittlung war nie das Problem). So wie es Udo gepostet hat kann man es benutzen ! (am besten über die Acadoberfläche transparent mit einem Makro aufrufen) ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 23. Nov. 2011 14:34 <-- editieren / zitieren --> Unities abgeben:
Danke Udo. Wie ist das mit den Unities? Haben die wirklich eine ernsthafte Funktion hier? Wenn ja, gebe ich Dir 10. Das Problem habe ich, meiner Meinung nach, anfangs ausreichend genau beschrieben. Erst bei einer weiteren ausführlichen Beschreibung später hat Udo dann helfen können. Dennoch habe ich diese Funktion nirgends im Netz gefunden, zumindest nicht als allgemeine Fangfunktion, die man universell einsetzen kann. Und was mich noch interessieren würde: Eine GUTE AutoLISP-Ankeitung im Internet bzw. Tutorial, mit einer Liste aller Befehle. (Ich habe leider das offizielle AutoCAD-Buch nicht). Vielleicht gibt es da einen Tipp. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 23. Nov. 2011 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|