| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Mein Langloch Programm funktioniert nicht stabil (1454 mal gelesen)
|
Arol Mitglied
Beiträge: 13 Registriert: 13.02.2009
|
erstellt am: 03. Sep. 2010 12:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe ein Lisp-Programm geschrieben, dass Langlöcher erstellt. Der User gibt die Länge und die Breite ein und das Programm zeichnet erst ein Rechteck, danach wird der Rechteck mit Radius x abgerundet. Aus dem Langloch wird ein Block mit dem Basispunkt in der Mitte erstellt und in die Zeichnung eingefügt. Ursprunglich habe ich versucht das Langloch gleich mit einer Polylinie zu zeichnen, erschien mir aber schwieriger und Fehler anfälliger zu sein. Quellcode: ***** (defun c:ll() (setq laenge (getreal "Bitte Länge in x-Richtung angeben (Breite):")) (setq breite (getreal "Bitte Länge in y-Richtung angeben (Laenge):")) (setq langloch (ssadd)) (setq einfuege (getpoint "\nEinfügepunkt(Langlochmitte): ")) (setq ll_bname (strcat "LL_" (rtos laenge 2 1) "x" (rtos breite 2 1))) ;; prüft ob der Block schon vorhanden ist (if (null (tblsearch "BLOCK" ll_bname)) (progn (setq radius ( / (min laenge breite) 2)) (setq basis (list (/ laenge 2) (/ breite 2))) (setq ll_p1 (list 0 0)) (setq ll_p3 (list laenge breite)) (command "_.rectang" ll_p1 ll_p3 ) (setq plinelast (entlast)) (ssadd plinelast langloch) (command "_.fillet" "r" radius "_.fillet" "p" langloch) (command "_block" ll_bname basis langloch "") )) (command "_Insert" ll_bname einfuege 1 1 0) (princ "\n Langloch erfolgreich erstellt! \n") (princ) ) ***** Mein Programm funktioniert in 95% der Fälle so wie es sein soll. Bei den anderen 5% habe ich absolut keine Idee wo das Problemm liegt. - Fehler nr. 1: Lanloch wird richtig erstellt, nur der Basispunkt ist bei (laenge/2 breite 0). Sieht so aus, als ob er bei der y-Koordinate die Breite nicht halbiert, aber warum? - Fehler nr. 2: In der ursprunglichen Variante habe ich das Rechteck nicht mit "rectang" erstellt, sondern mit "pline" über die 4 Eckpunkte des Rechtecks. Da hat das Programm manchmal anstatt eines Rechteckes 4x paralelle, auf einander liegende Linien mit Länge=laenge erstellt. Seitdem ich aber "pline" mit "rectang" ersetzt habe, kommt es nicht mehr vor. Kann es der Grund sein, oder habe ich bis jetzt nur Glück gehabt, dass der Fehler nicht mehr vorkommt? Vielen Dank in Voraus Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3329 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 03. Sep. 2010 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 03. Sep. 2010 13:13 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
Hallo Georg, das hat vermutlich mit dem Objektfang zu tun. Du solltest ihn sicherheitshalber VOR dem Zeichnen der PL und dem erstellen des Blocks ausschalten (OSMODE), und anschliessend wieder auf den Originalzustand zurücksetzen. Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arol Mitglied
Beiträge: 13 Registriert: 13.02.2009
|
erstellt am: 04. Sep. 2010 16:31 <-- editieren / zitieren --> Unities abgeben:
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 04. Sep. 2010 17:30 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
|
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 04. Sep. 2010 21:16 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
Hallo Georg, ein ganz anderer Denkansatz zum erstellen von einem Langloch: Man macht zwei parallele Linen, die so lang sind wie der Abstand vom einen Mittelpunkt zum anderen und rundet die beiden Seiten mit Radius "0" ab. Einfach vor dem Abrunden die Variable "FILLETRAD" auf 0 setzen, dann brauchst Du keinen Radius bestimmen und angeben. Danach kannst Du das Langloch zu einer Polylinie oder einem Block machen. Gruß Theodor Schönwald 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: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 05. Sep. 2010 13:49 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
Hier noch mal mein Vorschlag als Dyn. Block (mit Parametern, deshalb erst ab 2010) Zusätzlich noch eine gering modifizierte Version der Lisp-Routine mit Getdist und _Pline und ausgeschaltetem Objektfang Code: (defun c:UHLL( / efpunkt laengeh breiteh ll_bname os) ; Langlochvorschlag von Udo Hübner (setq efpunkt (getpoint "\nEinfügepunkt(Langlochmitte): ") breiteh (getdist efpunkt "Bitte halbe Länge in x-Richtung angeben (Breite):") laengeh (getdist efpunkt "Bitte halbe Länge in y-Richtung angeben (Laenge):") ll_bname (strcat "LL_" (rtos (* 2.0 laengeh) 2 1) "x" (rtos (* 2.0 breiteh) 2 1)) ) ; Objektfang deaktivieren (if (< (setq os (getvar "osmode")) 16384) ; Ofang aktiv (setvar "osmode" (+ os 16384)) ) ; prüft ob der Block schon vorhanden ist (if (> laengeh breiteh) (if (null (tblsearch "BLOCK" ll_bname)) (progn ; Langloch zeichnen (command "_pline" (mapcar '+ efpunkt (list breiteh (- laengeh))); unten rechts (mapcar '+ efpunkt (list breiteh laengeh)) ; oben rechts "_arc" (mapcar '+ efpunkt (list (- breiteh)laengeh)) ; oben links "_line" (mapcar '+ efpunkt (list (- breiteh)(- laengeh))) ; unten rechts "_arc" "_close") ; Block erstellen (command "_block" ll_bname efpunkt (ssadd (entlast)) "") ) ) ; else bestehenden Block einfügen (progn (command "_Insert" ll_bname efpunkt 1 1 0) (setvar "osmode" os); Objektfang restaurieren (princ "\n Langloch erfolgreich erstellt! \n") ) ; else (Prompt "Länge muss größer als Breite sein!") ) (princ) )
------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arol Mitglied
Beiträge: 13 Registriert: 13.02.2009
|
erstellt am: 08. Sep. 2010 12:19 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle, also bis jetzt läuft alles OK, habe das Ausschalten des Objektfanges eingefügt. Danke an Theodor, ich wusste gar nicht, dass sowas geht. Und ganz großes Dank an Udo, leider kann ich das Programm nicht testen, da wir AutoCAD 2007 haben. Habe mir aber dein Quellcode angeschaut und habe eine ganz tolle funktion "mapcar" entdeckt... Ich konnte aber nicht erkennen warum AutoCAD bei deinem Programm dyn. Block erstellt, scheint für mich wie das Erstellen eines normalen Blockes zu sein. Oder liegt es an der Variablenbenennung? Eine andere Frage. Beim Ausführen des Programms rattert es die ganzen Command befehle in die Befehlszeile in Autocad. Gibt es eine Möglichkeit dies VISUELL zu verhindern? Es soll nach der Eingabe der Länge, Breie und Einfügepunkt, nur "Langloch erfolgreich erstellt" kommen. Gruß Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 08. Sep. 2010 12:33 <-- editieren / zitieren --> Unities abgeben: Nur für Arol
|