Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Mein Langloch Programm funktioniert nicht stabil

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Mein Langloch Programm funktioniert nicht stabil (1454 mal gelesen)
Arol
Mitglied



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

Beiträge: 13
Registriert: 13.02.2009

erstellt am: 03. Sep. 2010 12:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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.




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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich

Hi,

liegt wahrscheinlich am eingeschalteten OFANG. Den solltest du in deinem Tool spätestens vor der Erzeugung der Geometrie abschalten.


Gruß
CADchup

------------------
CADmaro.de

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

wronzky
Ehrenmitglied V.I.P. h.c.
CAD-Dienstleistungen für Architekten



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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich

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



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

Beiträge: 13
Registriert: 13.02.2009

erstellt am: 04. Sep. 2010 16:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank für die Idee!!!
Ich werde mal das neue Programm die nächsten Tage testen.
Gruss
Georg

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

CAD-Huebner
Ehrenmitglied V.I.P. h.c.
Verm.- Ing., ATC-Trainer



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

Beiträge: 9732
Registriert: 01.12.2003

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

erstellt am: 04. Sep. 2010 17:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich

So als Idee: Ein Langloch kann man aber auch sehr elegant als dyn. Block erstellen, dann muss man gar nichts programmieren (Außer den Dyn. Block zu definieren) und das Langloch wäre sehr komfortabel änderbar.

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

Udo Hübner
www.CAD-Huebner.de

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

Theodor Schoenwald
Ehrenmitglied



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

Beiträge: 1672
Registriert: 16.04.2002

erstellt am: 04. Sep. 2010 21:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich

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



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

Beiträge: 9732
Registriert: 01.12.2003

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

erstellt am: 05. Sep. 2010 13:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich


uhlangloch.zip

 
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



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

Beiträge: 13
Registriert: 13.02.2009

erstellt am: 08. Sep. 2010 12:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



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

Beiträge: 1672
Registriert: 16.04.2002

erstellt am: 08. Sep. 2010 12:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Arol 10 Unities + Antwort hilfreich

Hallo Georg,

Radius 0:
benutze ich auch um Ecken oder Übergänge zu verbinden, wenn Lücken oder Überstände vorhanden sind.

Gruß
Theodor

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz