| |
| 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: umgang mit rechenungenauigkeiten (1019 / mal gelesen)
|
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 26. Sep. 2023 15:18 <-- editieren / zitieren --> Unities abgeben:
Hallo ihr Lieben! ich bin mal wieder auf hilfe angewiesen :/ Also folgendes problem: ich wollte ein programm schreiben, welches module in der projektion zeichnet und dafür nur die maße des moduls und neigunswinkel benötigt. soweit sogut hat auch erstmal alles geklappt, aber acad rechenungenauigkeiten haben zu einer unzufriedenstellellender abweichung geführt. dann bin ich auf die rtos funtion gestoßen und dachte mir - wie toll wenn ich einfach alle rechnungen zwinge das auf 12 dezimalstellen genau zu berechnen sollte die ungenauigkeit am ende zu vernachlässigen sein, aber plötzlich passieren komische dinge... nämlich: in der zeile " (setq moduldiagonalequadrat (rtos (+ (* modullänge modullänge) (* modulhöhe modulhöhe))2 12))" muss was falsch sein, wenn ich die konsole nämlich nach dem wert für moduldiagonalequadrat frage gibt es mir zwar die richtige zahl wieder aber als string - das war bevor ich rtos benutzt habe nicht so??? jetzt das seltsame wenn ich versuche mit der variable zu rechnen bsp: (+ 1 moduldiagonalequadrat) sagt er mir fehlerhaftes argument - ist ja klar mit strings kann ich nicht rechnen... Aber wenn ich die konsole nach anderen variabeln frage (die ja in abhängigkeit zu moduldiagonalequadrat stehen) gibt er mir korrekte zahlen (als reels glaub ich - jedenfalls sind keine "anführungszeichen" drum) also bsp (princ moduldiagonale) => konsole nennt mir eine zahl obwohl ich doch dafür die zeile "(setq moduldiagonale (rtos (expt moduldiagonalequadrat 0.5000) 2 12))" benutze wo ja offensichtlich mit moduldiagonalequadrat gerechnet wird. warum wird mir diese eine variable als string wiedergegeben und wie schaffe ich es die fehler durch ungenaues runden auszumärzen? bin über jeden tipp dankbar Grüße aus Berlin Kian und jetzt der essentielle teil des codes : (defun c:Modulzeichner (/) (setq modullänge (getreal "\nmodullänge in Metern")) (setq modulbreite (getreal "\nModulbreite in Metern")) (setq modulhöhe (getreal "\nModulhöhe in Metern")) (setq modulneigung (getreal "\nNeigung des Moduls in Grad")) ;erstmal alle wichtigen eigaben gesammelt ; jetzt kommen die zahlen die automatisch berechnet werden sollen (setq moduldiagonalequadrat (rtos (+ (* modullänge modullänge) (* modulhöhe modulhöhe))2 12)) (setq moduldiagonale (rtos (expt moduldiagonalequadrat 0.5000) 2 12)) (setq coshilfswinkel (rtos (/ modullänge moduldiagonale)2 12)) (setq hilfswinkelBogenmaßohne1durch (rtos (cos (/ modullänge moduldiagonale)) 2 12)) (setq hilfswinkelBogenmaß (rtos (/ 1 hilfswinkelBogenmaßohne1durch) 2 12)) ;in dieser rechnung ensteht fehler ich weiß net warum (setq hilfswinkel (rtos (/ (* hilfswinkelBogenmaß 180) pi) 2 12)) (setq moduldiagonalNeigung (rtos (- modulneigung hilfswinkel) 2 12)) (setq moduldiagonalNeigungBogenmaß (rtos (* moduldiagonalNeigung (/ 180 pi)) 2 12)) (setq modullängeProjektion (rtos (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale) 2 12)) )
ps: mir ist klar das die rechenschritte unnötig aufgesplittet sind, sie waren auch mal teilweise zusammengefasst, allerdings habe ich mir eine höhere genauikeit durchs aufsplitten erhofft.... hat nicht geklappt [Diese Nachricht wurde von Code Kian am 26. Sep. 2023 editiert.] [Diese Nachricht wurde von Code Kian am 26. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Sep. 2023 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Hi, >>" aber acad rechenungenauigkeiten haben zu einer unzufriedenstellellender abweichung geführt." Das wundert mich (ungesehen/ungeprüft) doch sehr, denn relevant sollten diese mathematischen Ungenauigkeiten des Datentyps doch eher nicht sein. Zumindest nicht grafisch relevant. >>" dann bin ich auf die rtos funtion gestoßen" RTOS um ein Problem mit Ungenauigkeiten zu umgehen? Okay, aber genauer wird es dadurch nicht und die Ungenauigkeiten werden dadurch ja höchstens größer, statt kleiner. Bei mathematischen Problemen mit Ungenauigkeiten nutzt man zu 99% eher EQUAL (je nachdem ob das bei dir passt, denn ich kenne dein Problem nicht)
>>" und dachte mir - wie toll wenn ich einfach alle rechnungen zwinge das auf 12 dezimalstellen genau zu berechnen" >>" sollte die ungenauigkeit am ende zu vernachlässigen sein,"
Jetzt muss ich arg schmunzeln, frage ich aber erst recht wo das Problem liegt. Wenn du das machst (runden auf 12. Dezimalstellen), dann verschlechterst du doch die Genauigkeit von allen Werten welche zB. nur 3 Stellen vor dem Komma haben und wenn man 10 Stellen vor dem Komma hat, dann ist die rtos-Rückgabe von der der zB. 12.Nachkommastelle nicht verlässlich. -
>>"nämlich: in der zeile " (setq moduldiagonalequadrat (atof (rtos (+ (* modullänge modullänge) (* modulhöhe modulhöhe))2 12)))" muss was falsch sein, wenn ich die konsole nämlich nach dem wert für moduldiagonalequadrat frage gibt es mir zwar die richtige zahl wieder aber als string - das war bevor ich rtos benutzt habe nicht so??? "
Du benutzt also RTOS, aber hast du dir auch mal angesehen was RTOS macht? -> [F1] RTOS (AutoLISP) - - - (setq moduldiagonale (rtos (expt moduldiagonalequadrat 0.5000) 2 12)) erzeugt einen String (setq coshilfswinkel (rtos (/ modullänge moduldiagonale)2 12)) man kann keine Zahl durch einen String dividieren - EDIT{ ;in dieser rechnung ensteht fehler ich weiß net warum } Du meinst ohne deinen Rtos-Versuch? Ich schaue mal danach..
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 26. Sep. 2023 16:13 <-- editieren / zitieren --> Unities abgeben:
Hey cadffm wie schön, dass du dich mir wieder erbarmst <3 Also zu allererst: anscheinend habe ich rtos falsch verstanden ok komm die dinger halt wieder raus <<Das wundert mich (ungesehen/ungeprüft) doch sehr, denn relevant sollten diese mathematischen Ungenauigkeiten des Datentyps doch eher nicht sein. Zumindest nicht grafisch relevant. wir planen große solarparks und wenn dann bei einem modul 1mm fehlt macht sich das auf die masse (große parks haben über 20000 module) schon was aus. so dann ist mir aufgefallen im original stand die zeile so (setq moduldiagonalequadrat (atof (rtos (+ (* modullänge modullänge) (* modulhöhe modulhöhe))2 12))) um den string zu umgehen - habs jetzt editiert (das atof weggelöscht) weil ich ja davon ausging eh eine zahl und keinen string zu bekommen Ok ja hätte mich wohl genauer mit rtos beschäftigen sollen, dann wundert micht jetzt aber warum die anderen variabeln eine zahl und keinen string zurückgeben, die sind ja auch mit rtos gebildet. also summup. ich nehme die ganzen rtos wieder raus und belese mich mal über die equal funktion
nur so nebenbei - ich komme nicht gut klar mit bogenmaßen/radians gibt es eine systemvariable die die cos funktion dazu bringt mit winkeln in grad zu rechnen und auszugeben ? danke für deine Hilfe und liebe Grüße aus Berlin Kian
[Diese Nachricht wurde von Code Kian am 26. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Sep. 2023 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
[QUOTE]Original erstellt von Code Kian: >>" zu allererst: anscheinend habe ich rtos falsch verstanden "RTOS erzeugt aus einer gegebenen Zahl eine entsprechende Zeichenkette, je nach übergebenen Parametern. Jetzt könnte man ATOF nutzen um daraus wieder eine Zahl zu machen. Das hast du auch mal eingesetzt, aber nicht überall und da knallte es dann mit "dividiere Zahl durch Buchstabe". - Hast du den Code im Eingangspost geändert? Wie sollen denn dann andere dem Thread hier folgen (und verstehen) können, jetzt und in Zukunft? Es wäre lieb "solche" Änderungen durch erneuten posten des geänderten Codes durchzuführen, so kann man der Diskussion auch später noch folgen und daraus lernen. - >>"wir planen große solarparks und wenn dann bei einem modul 1mm fehlt macht sich das auf die masse (große parks haben über 20000 module) schon was aus." Du erwartest Meter-Angaben, ein Millimeter ist 1tausendstell, also die 3.Nachkommstelle. Damit du mit der dritten Nachkommastelle Probleme bekommst, müsste dein Modul mind 1000000000000000 Meter Lang, hoch oder Breit sein (die Aussage ist nicht ganz korrekt, aber es zeigt doch in welche Richtung es relevant werden würde) >>"dann wundert micht jetzt aber warum die anderen variabeln eine zahl und keinen string zurückgeben, die sind ja auch mit rtos gebildet." Da irrst du dich, teste das noch einmal.. Immer bei (setq V (rtos ... ) wird V entweder nichts (bei einem Fehler/Unterbrechung) oder eine Zeichenkette binden. >>"also summup. ich nehme die ganzen rtos wieder raus und belese mich mal über die equal funktion" Das solltest du unbedingt, aber da dein Code nirgends Zahlen vergleicht, ist auch Equal zunächst uninteressant. >>"nur so nebenbei - ich komme nicht gut klar mit bogenmaßen/radians gibt es eine systemvariable die die cos funktion dazu bringt mit winkeln in grad zu rechnen und auszugeben ?" Nein, ich kenne ohnehin nur eine einzige Variable welche das Ergebnis eine Autolisp-Funktion beeinflußt. Da es dabei gar um das hier bereits erwähnte RTOS geht, möchte ich dir neben Equal also auch nocht diese benennen, welche für Bemaßungen/Bemaßungsstile und der Autolisp-Funktion RTOS relevant ist: DIMZIN
- - -
Jetzt zeige und deinen Code und die Abweichung/Problematik um die es eigentlich geht! Also 1. Code 2. Welche Eingaben (Beispielsweise, aber so sprechen wir alle von DENSELBEN) 3. Ergbnis IST 4. Ergebnis SOLL (und warum?) - Hier mal dein Code 1:1 ohne rtos, siehe Anhang, mit der LxBxH = 3,2,1 und 45° (BTW: Ich prüfe nicht deine Berechnung/Weg, mich interessiert nur die technisch korrekte Evaluierung)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Sep. 2023 17:07 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Hatte ich noch vergessen zu schreiben: >>"nur so nebenbei - ich komme nicht gut klar mit bogenmaßen/radians gibt es eine systemvariable die die cos funktion dazu bringt mit winkeln in grad zu rechnen und auszugeben ?" Nein, ich kenne ohnehin nur eine einzige Variable welche das Ergebnis eine Autolisp-Funktion beeinflußt. Da es dabei gar um das hier bereits erwähnte RTOS geht, möchte ich dir neben Equal also auch nocht diese benennen, welche für Bemaßungen/Bemaßungsstile und der Autolisp-Funktion RTOS relevant ist: DIMZIN
Aber die eigentlich Antwort ist: Erstelle dir doch deine eigene COS_GRAD-REIN_RAD-RAUS Funktion! oder eine COS_GRAD-REIN_GRAD-RAUS Funktion!* (defun cosgradrad (dgrad)(was auch immer geschehen muss und dann bogenmass auswirft)) (defun cosgradgrad (dgrad)(was auch immer geschehen muss und dann Dezimalgrad auswirft))
BTW: Im DXF/DWG-Format und der API wird aber ausschließlich in Bogenmass angegeben/gerechnet. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Archäologie Bubi Mitglied Archäologische Funddokumentation
Beiträge: 64 Registriert: 09.03.2021 AutoCAD Map 3D 2013 AutoCAD Map 3D 2023 AutoCAD Map 3D 2024 Faro AS-Built / TachyCAD BricsCAD V18 Elcovision ElTheo Agisoft Photoscan Agisoft Metashape Professional 1.7 Agisoft Metashape Professional 2.0
|
erstellt am: 26. Sep. 2023 17:46 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Zitat: BTW: Im DXF/DWG-Format und der API wird aber ausschließlich in Bogenmass angegeben/gerechnet.[/i]
Deswegen wandle ich die Werte immer um. So kann der Nutzer seine gewohnten Grad eingeben und das Programm bekommt sein Bogenmass. Grad zu Bogenmass (Degrees to Radians): Code: (defun DtR (d) (* pi (/ d 180.0)))
Bogenmass zu Grad (Radians to Degrees): Code: (defun RtD (r) (* 180.0 (/ r pi)))
------------------
Bubi spiele, Bubi glücklich! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 26. Sep. 2023 17:48 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: Hi,>>" aber acad rechenungenauigkeiten haben zu einer unzufriedenstellellender abweichung geführt." Das wundert mich (ungesehen/ungeprüft) doch sehr, denn relevant sollten diese mathematischen Ungenauigkeiten des Datentyps doch eher nicht sein. Zumindest nicht grafisch relevant. >>" dann bin ich auf die rtos funtion gestoßen" RTOS um ein Problem mit Ungenauigkeiten zu umgehen? Okay, aber genauer wird es dadurch nicht und die Ungenauigkeiten werden dadurch ja höchstens größer, statt kleiner. Bei mathematischen Problemen mit Ungenauigkeiten nutzt man zu 99% eher EQUAL (je nachdem ob das bei dir passt, denn ich kenne dein Problem nicht)
- [b]EDIT{ ;in dieser rechnung ensteht fehler ich weiß net warum } Du meinst ohne deinen Rtos-Versuch? Ich schaue mal danach..
[/B]
Sooo hab mir equal angeschaut weiss aber nicht wie es mir helfen soll ist ja nur zum vergleichen? habe aber keine verhleichswerte (nur durchs eintippen von beispielzahlen in den taschenrechner) Ich rechne jetzt einmal durch mit realistischen beispielzahlen Modullänge 2.278; Modulbreite 1.134; modulhöhe 0.035; neigung 20 grad Schritt1 Moduldiagonale ausrechnen -> satz des pythagoras (+ (* modullänge modullänge) (* modulhöhe modulhöhe)=Moduldiagonalequadrat acad gibt mit den wert 5.19051 zurück geb´nauer wären 5.190509 ok ist erstmal nur minimal Schritt1.2:wurzel ziehen : (expt moduldiagonalequadrat 0.5)= moduldiagonale acad gibt mir da 2.27827 -> genauer wäre 2.2782688 -> hey kein problem mit 1/100 mm ungenauigkeit kann ich leben Schritt2: hilfswinkel der hilfswinkel is der winkel zwischen der modul diagonale und dem modul selbst (werde ein kleines bild von nem schnitt eines modultisches mit hochladen um es verständlicher zu machen) 2.1 (/ modullänge moduldiagonale) um den cos vom hilfswinkel zu bekommen acad gibt mir da 0.999882 genauer wären 0.999881989 okok immer noch nicht relevant 2.2 hilfswinkelbogenmaßohne1durch jaja das in einzelnen schritten und variabeln zu machen ist voll doof gewesen. aber zu rrechnung (cos (/ modullänge moduldiagonale)) acad gibt mir 0.540402 genauer wäre 0.5404304 da haben wir schon nen fehler von 3/100 mm, check gar nicht wie lisp das intern rechnet um auf 0.540402 zu kommen. aber bin ja nen tollerannter mensch soll deshalb einfach akzeptiert werden. 2.3hilfswinkelbogenmaß also um jetzt ein korektes bogenmaß zu bekommen noch 1/ durch die vorherige rechnung (/ 1 hilfswinkelBogenmaßohne1durch) acad gibt mir da 1.85048 genauer wäre 1.850376 und schwubbs haben wir schon ne ungenauigkeit von 1/10 mm. 2.4 hilfswinkel also bogenmaß umrechnen in grad (/ (* hilfswinkelBogenmaß pi) 180) <- hatte im original pi und 180 vertauscht weshalb da was dummes raus kam ist jetzt behoben - also acad sagt mir 0.0322969 genauer wäre 0.03229515359 <-hier reicht meine tolleranz vollkommen ist also akzeptiert schritt3 moduldiagonalneigung 3.1 moduldiagonalneigung (- modulneigung hilfswinkel) ganz einfach ursprungs neigung - dem erechneten hilfwinkel <- bei addition und subtraktion kann ja wohl kein genauigkeitsfehler entstehen oder? 3.2 moduldiagonalneigungbogenmaß: für die projektion der diagonale muss ich mit cos rechnen deshalb jetzt wieder umrechnung in bogenmaß (* moduldiagonalNeigung (/ pi 180))<-- hatte im original pi und 180 vertauscht... also acad gibt mir 0.348502 genauer wäre 0.34850210905 passt ja super ist fast gleich jetzt der letzte schritt modullängeprojektion (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale) acad gibt mir da 2.14131 mein taschenrechner sagt aber 2.2782688 das ist schon ne stakre differenz und habe natürlich ne kontrollzeichnung und da komme ich auf ein länge von 2.1526 (siehe anhang) also habe drei verschiedene ergebnisse und hab kein ahnung welches stimmt, hab eigentlich der zeichnung vertraut, aber computer machen vlt fehler - ich hab jetzt nach mehrstündiger analyse das gefühl dass bei mir kein fehler mehr da sein kann. bin verzweifelt. Noch zu meinem anhang: also in rot sieht man ein modul von der seite (die modulbreite ist auf der abbildung nicht ablesbar) und dort ist doch klar zu erkennen das die projektion der diagonale 2.15259 sein sollte
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Sep. 2023 23:42 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Hallo, >>"Sooo hab mir equal angeschaut weiss aber nicht wie es mir helfen soll. ist ja nur zum vergleichen?" Ja, siehe auch:
Zitat: Original erstellt von cadffm: >>"also summup. ich nehme die ganzen rtos wieder raus und belese mich mal über die equal funktion" Das solltest du unbedingt, aber da dein Code nirgends Zahlen vergleicht, ist auch Equal zunächst uninteressant.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{wie geschrieben, ich schau mir nur das Thema Lisp an, nicht ob dein Rechenweg überhaupt stimmt} Anm: Bei den gaanz vielen Nachkommastellen in der Antwort habe ich dann auch mal irgendwo gerundet/aufgehört, werde ja nicht fürs tippen nicht bezahlt.
_ >>" Ich rechne jetzt einmal durch mit realistischen beispielzahlen >>" Modullänge 2.278; Modulbreite 1.134; modulhöhe 0.035; neigung 20 grad Nach deiner Berechnung = -2.16166898 Eine negative Länge? Also ist was in der Berechnung faul (und sicher keine Genauigkeit) === SCHNIPP, KIAN hat den Code an zwei Stellen geändert, der negative Wert würde mit dem ursprünglichen Code herauskommen ===
>>" Schritt1 Moduldiagonale ausrechnen -> satz des pythagoras (+ (* modullänge modullänge) (* modulhöhe modulhöhe)) =Moduldiagonalequadrat (+ 5.189284 0.001225) =5.190509 >>" acad gibt mit den wert 5.19051 zurück geb´nauer wären 5.190509 ok ist erstmal nur minimal" 5.19051 = Das ist eine gerundete Rückgabe in der Befehlszeile, betrifft also nur den Anzeigewert in der Rückgabe der Befehlszeile, NICHT der berechnete Wert! Schau mal hier, ich benutze das RTOS um dir mehr Nachkommastellen zu zeigen: (+ (* modullänge modullänge) (* modulhöhe modulhöhe) = "5.190509000000000"
>>" Schritt1.2:wurzel ziehen : (expt moduldiagonalequadrat 0.5) = moduldiagonale = 2.278268860341114
>>" acad gibt mir da 2.27827 -> genauer wäre 2.2782688 -> hey kein problem mit 1/100 mm ungenauigkeit kann ich leben" 2.27827 = siehe oben, das ist nur die gerundete Rückgabe in der Befehlszeile Befehl: (rtos (expt moduldiagonalequadrat 0.5) 2 15) "2.278268860341114" >>" Schritt2: hilfswinkel der hilfswinkel is der winkel zwischen der modul diagonale und dem modul selbst (werde ein kleines bild von nem schnitt eines modultisches mit hochladen um es verständlicher zu machen) >>" 2.1 (/ modullänge moduldiagonale) um den cos vom hilfswinkel zu bekommen = 0.999881989195483
>>" acad gibt mir da 0.999882 genauer wären 0.999881989 okok immer noch nicht relevant" Siehe oben, acad berechnet durchaus noch genauer wie nur der gerundete Wert 0.999881989
>>"2.2 hilfswinkelbogenmaßohne1durch jaja das in einzelnen schritten und variabeln zu machen ist voll doof gewesen. aber zu rrechnung" (cos (/ modullänge moduldiagonale)) = "0.540401604773530" >>"acad gibt mir 0.540402 genauer wäre 0.5404304 da haben wir schon nen fehler von 3/100 mm," siehe oben, 0.540401604773530 >>"check gar nicht wie lisp das intern rechnet um auf 0.540402 zu kommen." 0.540401604773530 gerundet auf 6 Nachkommastellen = 0.540402
>>"2.3hilfswinkelbogenmaß also um jetzt ein korektes bogenmaß zu bekommen noch 1/ durch die vorherige rechnung (/ 1 hilfswinkelBogenmaßohne1durch) = 1.850475629914305
>>" acad gibt mir da 1.85048 genauer wäre 1.850376 und schwubbs haben wir schon ne ungenauigkeit von 1/10 mm." siehe oben. Also mit deinen Werten gibt das bis hier 1.850475629914305, ich nehme an deine 1.850376 kommen daher das du in Einzelschritten am Taschenrechner? immer nur gerundete Zwischenwerte mit geringerer Genauigkeit verwendet hast, also im Grunde das gemacht hast, was du Acad/Lisp vorgeworfen hast Meine Ergebnisse schreibe ich weiterhin so nieder wie es im Lisp berechnet wird.. >>" 2.4 hilfswinkel also bogenmaß umrechnen in grad" (/ (* hilfswinkelBogenmaß pi) 180) = 0.032296892469921 >>" also acad sagt mir 0.0322969 genauer wäre 0.03229515359 <-hier reicht meine tolleranz vollkommen ist also akzeptiert" siehe oben. >>"schritt3 moduldiagonalneigung" >>"3.1 moduldiagonalneigung" (- modulneigung hilfswinkel) = 19.96770310753008
>>"3.2 moduldiagonalneigungbogenmaß: für die projektion der diagonale muss ich mit cos rechnen deshalb jetzt wieder umrechnung in bogenmaß" (* moduldiagonalNeigung (/ pi 180)) = 0.348502163287103 >>"acad gibt mir 0.348502 genauer wäre 0.34850210905 passt ja super ist fast gleich" siehe oben.
>>"jetzt der letzte schritt modullängeprojektion" (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale) = 2.141311328881954
>>" acad gibt mir da 2.14131 mein taschenrechner sagt aber 2.2782688 das ist schon ne stakre differenz" Da das der letzte Schritt war, sollten wir nun schauen ob AutoCAD richtig rechnet und DU mit (zu) geringer Genauigkeit rechnest, oder ob und warum Acad hier "falsch" liegt.
(* (cos moduldiagonalNeigungBogenmaß) moduldiagonale)
Deine (gerundeten) Wert eingesetzt= (* (cos 0.34850210905) 2.2782688) (Windows-)Taschenrechner liefert hier = 2.278226655667010 und AutoCAD würde in diesem Fall eine = 2.141311314365069 liefern, es geht also eindeutig um die COS Funktion! (cos 0.34850210905) (Windows-)Taschenrechner liefert hier = 0.999981501597625 und AutoCAD würde in diesem Fall eine = 0.939885282353456 liefern. Aber mein RealLife-Rechner liefern auch diese 0.93... hmm Was ist da los? Jetzt lesen wir mal die Funktion im Handbuch nach, fangen wir mit Lisp an: :: "An angle, in radians" Super, denn wir haben ja bereits den Bogenwert
Könnte es sein das....? Einfach ausprobieren! also statt 0.34850210905 den Windowsrechner mit 19,96769999997297, denn siehe Bubi: (* 180.0 (/ radians pi)) macht aus Bogenmaß => DezimalGrad Windowsrechner cos 19.96769999997297 = 0.939885282353456 Was hatte deine Funktion im Lisp ausgerechnet? = 0.939885282353456 Problem gefunden & ohne Codeänderung gelöst, EIGENTLICH - aber du schreibst ja noch mehr.. >>" und habe natürlich ne kontrollzeichnung und da komme ich auf ein länge von 2.1526 (siehe anhang) >>" also habe drei verschiedene ergebnisse und hab kein ahnung welches stimmt,"
Deine Kontrollrechnung kannst du jetzt rausnehmen, denn die war ja falsch (dein Verwendeter Rechner, wie zB. der Win-Rechner, erwartete Dezimalgrad, du hast mit Bogenmaß gefüttert), also gibt es nur noch das eine Ergebnis und die Angabe in deiner Zeichnung. Wieder fange ich mit der Annahme an das dieses Ergebnis durch eine (zu) geringe Genauigkeit zustande gekommen ist, also prüfen wir erneut: Ich möchte jetzt nicht jede Zahl aufzeigen, also schnappe ich mir zunächst einfach mal den letzten Baustein, den Modulwinkel: Zeichnung= 19.11976° Genauer = 19.96769999997297
Kann das ausschlaggebend sein? Zeichnung= 19.11976000000000° => cos => 0.944836006016526 Genauer = 19.96769999997297° => cos => 0.939885282353456 und wenn man das dann noch multipliziert mit der Moduldiagonale= 2.278268860341114 Zeichnung: 2.278268860341114*0.944836006016526= 2.152590450636520 Genauer: 2.278268860341114*0.939885282353456= 2.141311371078794 ausschlaggebend? = JA! Frage: Wie genau wollt Ihr die Panele bauen/planen? Mit deinen zwei Korrekturen im Code kommt auch in AutoCAD 2.141311328881954 heraus, also komplett ohne unnötige Rundung, daher weicht der Wert ab den Mikrometern dann etwas ab.. >>" hab eigentlich der zeichnung vertraut, aber computer machen vlt fehler - ich hab jetzt nach mehrstündiger analyse das gefühl dass bei mir kein fehler mehr da sein kann." Dann sei froh das ich Bock darauf hatte, ansonsten werden die Stunden zu Tagen und die Tage zu Wochen - das bleibt nicht aus, "Wir alle" kennen das. >>" bin verzweifelt." Lasse meine Antwort sacken, teste es und gebe uns ein Update von deinem Befinden.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Nachtrag, da der geänderte Code hier noch nicht für copy&paste gepostet wurde:
Code: (defun c:Modulzeichner (/ später Variablen-Liste hier, um diese als LOKAL zu definieren) (setq modullänge (getreal "\nmodullänge in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulbreite (getreal "\nModulbreite in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulhöhe (getreal "\nModulhöhe in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulneigung (getreal "\nNeigung des Moduls in Grad: ")); ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq moduldiagonalequadrat (+ (* modullänge modullänge) (* modulhöhe modulhöhe))) (setq moduldiagonale (expt moduldiagonalequadrat 0.5000)) (setq coshilfswinkel (/ modullänge moduldiagonale)) (setq hilfswinkelBogenmaßohne1durch (cos (/ modullänge moduldiagonale))) (setq hilfswinkelBogenmaß (/ 1 hilfswinkelBogenmaßohne1durch)) (setq hilfswinkel (/ (* hilfswinkelBogenmaß pi) 180)) ; geändert (setq moduldiagonalNeigung (- modulneigung hilfswinkel)) (setq moduldiagonalNeigungBogenmaß (* moduldiagonalNeigung (/ pi 180))) ;geändert (setq modullängeProjektion (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale)) (princ (strcat "Die Modullänge in Projektion beträgt: " (rtos modullängeProjektion 2 8))) (princ) (alert (strcat "Die Modullänge in Projektion beträgt: " (rtos modullängeProjektion 2 3) "(" (substr (rtos modullängeProjektion 2 10) 6 5) ") Meter")) (princ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 29. Sep. 2023 11:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadffm, mega danke fürs sich anschauen, hatte zwischenzeitlich schon angst, dass keiner bock hat sich diesen unsympatischen block an text überhaupt durchzulesen... {wie geschrieben, ich schau mir nur das Thema Lisp an, nicht ob dein Rechenweg überhaupt stimmt} Anm: Bei den gaanz vielen Nachkommastellen in der Antwort habe ich dann auch mal irgendwo gerundet/aufgehört, werde ja nicht fürs tippen nicht bezahlt. << richtig so. ich werde mich auch für eine Gehaltserhöhung um 100% für dich stark machen!!! _ >>" Modullänge 2.278; Modulbreite 1.134; modulhöhe 0.035; neigung 20 grad[/i] Nach deiner Berechnung = -2.16166898 Eine negative Länge? Also ist was in der Berechnung faul (und sicher keine Genauigkeit) << huch dass die negativ ist hab ich nicht mal bemerkt >>" acad gibt mit den wert 5.19051 zurück geb´nauer wären 5.190509 ok ist erstmal nur minimal" 5.19051 = Das ist eine gerundete Rückgabe in der Befehlszeile, betrifft also nur den Anzeigewert in der Rückgabe der Befehlszeile, NICHT der berechnete Wert! Schau mal hier, ich benutze das RTOS um dir mehr Nachkommastellen zu zeigen: (+ (* modullänge modullänge) (* modulhöhe modulhöhe) = "5.190509000000000" << aaaah darauf hätt ich eig auch kommen können, ist ja bei fast allen rechenmaschienen so, dass sie weniger anzeigen als sie selbst berechnen >>"2.2 hilfswinkelbogenmaßohne1durch jaja das in einzelnen schritten und variabeln zu machen ist voll doof gewesen. aber zu rechnung" (cos (/ modullänge moduldiagonale)) = "0.540401604773530"
>>"2.3hilfswinkelbogenmaß also um jetzt ein korektes bogenmaß zu bekommen noch 1/ durch die vorherige rechnung (/ 1 hilfswinkelBogenmaßohne1durch) = 1.850475629914305 >>" acad gibt mir da 1.85048 genauer wäre 1.850376 und schwubbs haben wir schon ne ungenauigkeit von 1/10 mm." siehe oben. Also mit deinen Werten gibt das bis hier 1.850475629914305, ich nehme an deine 1.850376 kommen daher das du in Einzelschritten am Taschenrechner? immer nur gerundete Zwischenwerte mit geringerer Genauigkeit verwendet hast, also im Grunde das gemacht hast, was du Acad/Lisp vorgeworfen hast << ääääh uuups hab mir so mühe gegeben das immer mit "answer" funktion zu machen aber im eifer des gefechts bin ich wohl schluderig geworden Meine Ergebnisse schreibe ich weiterhin so nieder wie es im Lisp berechnet wird.. >>" 2.4 hilfswinkel also bogenmaß umrechnen in grad" (/ (* hilfswinkelBogenmaß pi) 180) = 0.032296892469921 >>"jetzt der letzte schritt modullängeprojektion" (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale) = 2.141311328881954
>>" acad gibt mir da 2.14131 mein taschenrechner sagt aber 2.2782688 das ist schon ne stakre differenz" Da das der letzte Schritt war, sollten wir nun schauen ob AutoCAD richtig rechnet und DU mit (zu) geringer Genauigkeit rechnest, oder ob und warum Acad hier "falsch" liegt.
(* (cos moduldiagonalNeigungBogenmaß) moduldiagonale)
Deine (gerundeten) Wert eingesetzt= (* (cos 0.34850210905) 2.2782688) (Windows-)Taschenrechner liefert hier = 2.278226655667010 und AutoCAD würde in diesem Fall eine = 2.141311314365069 liefern, es geht also eindeutig um die COS Funktion! (cos 0.34850210905) (Windows-)Taschenrechner liefert hier = 0.999981501597625 und AutoCAD würde in diesem Fall eine = 0.939885282353456 liefern. Aber mein RealLife-Rechner liefern auch diese 0.93... hmm Was ist da los? Jetzt lesen wir mal die Funktion im Handbuch nach, fangen wir mit Lisp an: :: "An angle, in radians" Super, denn wir haben ja bereits den Bogenwert
Könnte es sein das....? Einfach ausprobieren! also statt 0.34850210905 den Windowsrechner mit 19,96769999997297, denn siehe Bubi: (* 180.0 (/ radians pi)) macht aus Bogenmaß => DezimalGrad Windowsrechner cos 19.96769999997297 = 0.939885282353456 Was hatte deine Funktion im Lisp ausgerechnet? = 0.939885282353456 << weiß nicht ob ich da lachen oder weinen soll, hab akribisch drauf geachtet immer richtig zu differenzieren zwischen rad und grad... hat wohl nicht geklappt Problem gefunden & ohne Codeänderung gelöst, EIGENTLICH - aber du schreibst ja noch mehr.. >>" und habe natürlich ne kontrollzeichnung und da komme ich auf ein länge von 2.1526 (siehe anhang) >>" also habe drei verschiedene ergebnisse und hab kein ahnung welches stimmt,"
Deine Kontrollrechnung kannst du jetzt rausnehmen, denn die war ja falsch (dein Verwendeter Rechner, wie zB. der Win-Rechner, erwartete Dezimalgrad, du hast mit Bogenmaß gefüttert), also gibt es nur noch das eine Ergebnis und die Angabe in deiner Zeichnung. Wieder fange ich mit der Annahme an das dieses Ergebnis durch eine (zu) geringe Genauigkeit zustande gekommen ist, also prüfen wir erneut: Ich möchte jetzt nicht jede Zahl aufzeigen, also schnappe ich mir zunächst einfach mal den letzten Baustein, den Modulwinkel [edit von kian - hier ist der winkel der moduldiagonale gemeint -> die variable heisst moduldiagonalneigung]: Zeichnung= 19.11976° Genauer = 19.96769999997297
Kann das ausschlaggebend sein? Zeichnung= 19.11976000000000° => cos => 0.944836006016526 Genauer = 19.96769999997297° => cos => 0.939885282353456 und wenn man das dann noch multipliziert mit der Moduldiagonale= 2.278268860341114 Zeichnung: 2.278268860341114*0.944836006016526= 2.152590450636520 Genauer: 2.278268860341114*0.939885282353456= 2.141311371078794 << äääääh was? komme nicht mehr ganz mit - warum weicht die zahl (moduldiagonalneigung) so stark vom in der zeichnung berechneten/abgemessenem winkel ab?? also bisher ist klar dass die 19.96769999997297° rechnwegtechnisch her richtig sind - kommt in meinen kopf nicht rein das in der zeichnung die zahl so stark abweicht ausschlaggebend? = JA! Frage: Wie genau wollt Ihr die Panele bauen/planen? Mit deinen zwei Korrekturen im Code kommt auch in AutoCAD 2.141311328881954 heraus, also komplett ohne unnötige Rundung, daher weicht der Wert ab den Mikrometern dann etwas ab.. << abweichung in den mikrometern sind voll ok - allerdings bin ich jetzt etwas verunsichert- bei den zahlen und der rechnung stimmt jetzt alles aber bei acad wenn ich es zeichne wird es falsch bertechnet oder wie ? weil nach acad zeichnung sollte am ende ja ca 2.1526 raus kommen >>" hab eigentlich der zeichnung vertraut, aber computer machen vlt fehler - ich hab jetzt nach mehrstündiger analyse das gefühl dass bei mir kein fehler mehr da sein kann." Dann sei froh das ich Bock darauf hatte, ansonsten werden die Stunden zu Tagen und die Tage zu Wochen - das bleibt nicht aus, "Wir alle" kennen das. << bin mega froh und deshalb nochmal ein dickes DANKE Lasse meine Antwort sacken, teste es und gebe uns ein Update von deinem Befinden.
<<also der code funktioniert super und ist für mich toll nachzuvollziehen (mir gefallen auch die kleineren verbesserungen wie ": " nach den getreals. mega sinnvoll aber kommt man als blutiger anfänger nicht von alleine drauf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Nachtrag, da der geänderte Code hier noch nicht für copy&paste gepostet wurde:
Code: (defun c:Modulzeichner (/ später Variablen-Liste hier, um diese als LOKAL zu definieren) (setq modullänge (getreal "\nmodullänge in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulbreite (getreal "\nModulbreite in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulhöhe (getreal "\nModulhöhe in Metern: ")) ; ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq modulneigung (getreal "\nNeigung des Moduls in Grad: ")); ACAD-Standard, Doppelpunkt gefolgt von einem Leerzeichen am Ende (setq moduldiagonalequadrat (+ (* modullänge modullänge) (* modulhöhe modulhöhe))) (setq moduldiagonale (expt moduldiagonalequadrat 0.5000)) (ssetq etq coshilfswinkel (/ modullänge moduldiagonale)) (hilfswinkelBogenmaßohne1durch (cos (/ modullänge moduldiagonale))) (setq hilfswinkelBogenmaß (/ 1 hilfswinkelBogenmaßohne1durch)) (setq hilfswinkel (/ (* hilfswinkelBogenmaß pi) 180)) ; geändert (setq moduldiagonalNeigung (- modulneigung hilfswinkel)) (setq moduldiagonalNeigungBogenmaß (* moduldiagonalNeigung (/ pi 180))) ;geändert (setq modullängeProjektion (* (cos moduldiagonalNeigungBogenmaß) moduldiagonale)) (princ (strcat "Die Modullänge in Projektion beträgt: " (rtos modullängeProjektion 2 8))) (princ) (alert (strcat "Die Modullänge in Projektion beträgt: " (rtos modullängeProjektion 2 3) "(" (substr (rtos modullängeProjektion 2 10) 6 5) ") Meter")) (princ) )
[/B][/QUOTE] ps: nochmal danke fürs helfen und wie gesagt bin bei lisp neu und forum beiträge ist auch neu für mich -- in zukunft werden meine beiträge strukturierter aussehen ________ Wer nicht fragt bleibt dumm -- seesamstraße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Sep. 2023 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
>>"- bei den zahlen und der rechnung stimmt jetzt alles aber bei acad wenn ich es zeichne wird es falsch bertechnet oder wie ? weil nach acad zeichnung sollte am ende ja ca 2.1526 raus kommen" Ich hatte das gar nicht sp als CAD-Konstruktion realisiert gehabt, wohl auch weil ich sagte: Ich prüfe deine Rechnung nicht! Aber jetzt wo du darauf zurückkommst.. Wir sehen das Bild, kennen aber die Daten nicht, die DWG fehlt hier im Anhang.. (für das nächste Mal vielleicht). Kurz nachgezeichnet: Bild/Konstruktion passt so. Also: Ein Fehler in der Berechnung.. Kontrolliere also zum 100. Mal deine Berechnung, wobei ich im Bereich des Diagonal-Winkel doppelt schauen würde, denn 19.96769999997297 (bzw. 0.939885282353456) ist die ja gar nicht..
(Du als CAD.de-User hast ihr einen Account, dieser hat EIN Uploadverzeichnis, daher bitte die Anhänge eindeutig benennen, sonst werden die älteren kommentarlos überschrieben). 230929_Modultest1.dwg wirst du vermutlich nie wieder nehmen, denn heute erinnerst du dich noch an die *1 und morgen ist ein anderes Datum..
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 04. Okt. 2023 10:49 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: >>"- bei den zahlen und der rechnung stimmt jetzt alles aber bei acad wenn ich es zeichne wird es falsch bertechnet oder wie ?[b] weil nach acad zeichnung sollte am ende ja ca 2.1526 raus kommen"Ich hatte das gar nicht als CAD-Konstruktion realisiert gehabt, wohl auch weil ich sagte: Ich prüfe deine Rechnung nicht! Aber jetzt wo du darauf zurückkommst.. Wir sehen das Bild, kennen aber die Daten nicht, die DWG fehlt hier im Anhang.. (für das nächste Mal vielleicht). Kurz nachgezeichnet: Bild/Konstruktion passt so. << dachte so ein kleines png reicht mit den bemaßungen dran, denn: "File Types Allowed: .gif , .jpg , .zip , .pdf , .txt , .mid , .png , .mp4 " da kann ich ja keine dwg hochladen Also: Ein Fehler in der Berechnung.. Kontrolliere also zum 100. Mal deine Berechnung, wobei ich im Bereich des Diagonal-Winkel doppelt schauen würde, denn 19.96769999997297 (bzw. 0.939885282353456) ist die ja gar nicht.. << stimmt in der zeichnung kommt die auf 19.119756... (Du als CAD.de-User hast ihr einen Account, dieser hat EIN Uploadverzeichnis, daher bitte die Anhänge eindeutig benennen, sonst werden die älteren kommentarlos überschrieben). 230929_Modultest1.dwg wirst du vermutlich nie wieder nehmen, denn heute erinnerst du dich noch an die *1 und morgen ist ein anderes Datum.. << danke für den hinweis ab dem nächsten mal wirds strukturierter ;) [/B]
_________________________________ kleine zusammenfassung - in der winkelberechnung muss was falsch sein, ich schau nochmal drüber wo genau da der fehler entsteht und melde mich dann nochmal. danke für die tatkräftige unterstützung und die überwindung sich da jedesmal aufs neue reinzufuchsen und mit diesen wirklich blöden zahlen zu rechnen!!! Liebe Grüße Kian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 04. Okt. 2023 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Jepp, schau mal nach dem Diagonalen-Winkel, ich konnte jetzt nicht verstehen wo der errechnete Wert hinpasst, aber die Berechnung ansehen wollte ikch auch nicht offtopic Dateianhang: .DWG ist kein Problem - wenn es also irgendwann angehängt werden soll. Bild statt DWG: Sehr sinnvoll um jemandem zu zeigen was man selbst sieht. Dem Screenshot meiner eigenen Konstruktion würde ich auch trauen, aber man sieht weder die wahren Werte der Geometrie, noch ob die angezeigten "Zahlen" die Werte der Geometrie wiedergeben.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 09. Okt. 2023 10:17 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Hallo, hoffe ihr hattet ein schönes wochenende und danke für eure Hilfe nochmal, also ich (mit Hilfe von mehreren klugen Köpfen) habe das Problem gefunden. Der fehler entsteht beim Hilfswinkel, die cos funktion bringt dort einen zu ungenauen wert raus da die zahl (der winkel) so klein ist. Meine lösungs ist den Rechenansatz zu ändern und über einen anderen winkel auf die projektionslänge zu kommen. falls es wen intressiert poste ich mal den Teil des codes: -- dtr ist degrees to radians - eine funktion die mir bubi zur verfügung gestellt hat (*_*) Code: (setq modullänge (getreal "\nmodullänge in Metern")) (setq modulhöhe (getreal "\nModulhöhe in Metern")) (setq modulneigung (getreal "\nNeigung des Moduls in Grad")) (setq modulneigung (dtr modulneigung)) (setq nebenwinkel (- (dtr 90) modulneigung)) (setq projektionslänge (+ (* (cos nebenwinkel) modulhöhe) (* (cos modulneigung) modullänge))) (princ projektionslänge)
liebe grüße Kian [Diese Nachricht wurde von Code Kian am 09. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Okt. 2023 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Irgendwas stimmt hier nicht.. Stell doch bitte noch einmal den vollständigen funktionierenden Code zur Verfügung Mit den paar Zeilen kommst du in deinem Beispiel auf unter einem Meter Projektionslänge!? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 10. Okt. 2023 15:16 <-- editieren / zitieren --> Unities abgeben:
Also der gesamte code nochmal Code: (defun c:Modulzeichner (/) (defun DtR (d) (* pi (/ d 180.0))) (defun RtD (r) (* 180.0 (/ r pi))) ;degrees to rad eine funktion von Bubi zur verfügung gestellt ; infos um projektionslänge zu berechnen (setq modullänge (getreal "\nmodullänge in Metern")) (setq modulhöhe (getreal "\nModulhöhe in Metern")) (setq modulneigung (getreal "\nNeigung des Moduls in Grad")) (setq modulneigung (dtr modulneigung)) ; Infos für den rest der zeichnung (setq modulbreite (getreal "\nModulbreite angeben")) (setq tischbreite (getreal "\nTischbreite angeben")) (setq klemmbreite (getreal "\nBreite der Klemme angeben")) (setq modulabstand (getreal "\nAbstand der module zueinander (vertikal ebene)")) (setq Modulanzahlverti (getint "\nAnzahl der Module pro Tisch vertikal")) (setq Modulanzahlhori (getint "\nAnzahl der Module pro Tisch horizontal")) ;berechnung der Projektionslänge (setq nebenwinkel (- (dtr 90) modulneigung)) (setq projektionslänge (+ (* (cos nebenwinkel) modulhöhe) (* (cos modulneigung) modullänge))) (princ projektionslänge"\n") ;jetzt den abstand in der projektion (setq projektionsabstandzusatz (+ (* (cos nebenwinkel) modulhöhe) (* (cos modulneigung) modulabstand))) ; der abstand der module (vertikal) in der projektion ;was noch abgezogen werden muss (setq abstandabzugbeta (- 90 (- 90 (rtd modulneigung)))) (setq abstandsabzugseitea (* modulhöhe (cos (dtr abstandabzugbeta)))) ;;zwischenschritte winkel beta und seite b berechnen (setq projektionsabstandabzug (sqrt (-(* modulhöhe modulhöhe) (* abstandsabzugseitea abstandsabzugseitea)))) ;neue projektion (setq abstandsprojektion (- projektionsabstandzusatz (* 2 projektionsabstandabzug))) )
Also in der Diskussion ging es bisher immer nur um den Teil vor der Abstandsprojektion die variable "projektionslänge" ist die projektionslänge eins moduls (auf dem modultisch) - "abstandsprojektion ist der abstand zwischen den modulen in der projektion
hoffe es ist einigermaßen nachvollziehbar - bei mir kommen jedenfalls die richtigen zahlen raus. ps: hab jezt glaub ich alle daten gesammelt die ich brauche. jetzt will ich das modul natürlich zeichnen lassen. bin gerade aber bisschen aufgeschmissen weil ich keine tabelle mit den indexzahlen finde (-1 objektname . 8 layer usw...) kann da jemand vlt nen link schicken oder einfach ne liste posten ? liebe Grüße Kian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 10. Okt. 2023 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
|
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 10. Okt. 2023 15:57 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 10. Okt. 2023 16:27 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 11. Okt. 2023 08:47 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Zitat: Original erstellt von Code Kian: Also der gesamte code nochmal [/i]
Das ist nicht ganz dein Code, denn der ist nicht lauffähig ;) Fehler: (princ projektionslänge"\n") Lösungen: (princ (strcat projektionslänge "\n")) oder (princ projektionslänge) (terpri) oder eine andere Variante Standards erfreut den Nutzer!
Modulzeichner Befehl: (setq modullänge (getreal "\nmodullänge in Metern")) modullänge in Metern5.55 AutoCAD zu 99.9% Befehl: VERSETZ Abstand angeben oder [Durch punkt/lÖschen/Layer] <Durch punkt>: 5.55 Modulzeichner geändert Befehl: (setq modullänge (getreal "\nModullänge in Metern: ")) Modullänge in Metern: 5.55
>>"aufgeschmissen Neben der Hilfe, um Objektdaten abzufragen:
Code: (defun c:DXFdata () ; TopLevel (foreach i (entget(car(entsel))'("*")) (print i)) (princ) ) (defun c:DXFdataN () ; NestedObject/LowestLevel (foreach i (entget(car(nentsel))'("*")) (print i)) (princ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 11. Okt. 2023 13:04 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 11. Okt. 2023 13:26 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
>>"aber ich würde gerne den linien schon einem layer zuweisen" Wie schaffst du das denn aktuell? Entweder man setzt einen Layer aktuell (CLAYER) nachdem dieser existiert/erstellt wurde (-LAYER neu), oder gleich beides in einem (-LAYER machen) und zeichnest dann drauf los.. ODER man erstellt ein Objekt und ändert dann dessen Layer (Ändern oder EigÄndr)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 12. Okt. 2023 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Zitat: Original erstellt von cadffm:
ODER man erstellt ein Objekt und ändert dann dessen Layer (Ändern oder EigÄndr)
Auch dazu muss der Layer schon vorhanden sein. Aber man kann mittels Lisp dem Objekt einfach einen anderen Layernamen zuweisen, und dafür muss der Layer noch nicht existieren. Mit dem kleinen Lisp unten beispielsweise (&ssmodent <ename> 8 "NEUERLAYER"). Man kann damit aber auch jede andere als DXF-Gruppencode im Entity stehende Eigenschaft ändern.
Code:
(defun &ssmodent (ename dxf val / old) (if (setq old (assoc dxf (entget ename))) (entmod (subst (cons dxf val) old (entget ename) ) ) (entmod (append (entget ename) (list (cons dxf val)))) ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 23. Okt. 2023 11:08 <-- editieren / zitieren --> Unities abgeben:
Also bisher habe ich noch nichts wirklich gezeichnet in autolisp und daher auch keine layer zugewiesen. Jetzt nach ner woche krankheit wollte ich mich mal wieder dran setzen und erstmal schauen wie das zeichnen funktioniert und da bin ich schon auf mein erstes problem gestoßen (soll ich mal nen neues thema dafür aufmachen oder ist ok das hier weiter zu diskutieren?) (command "_line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") funtioeniert bei mir nicht --> fehler: funktion abgebrochen das gleiche wenn ich es liste: (command "_line" (list 0.0 0.0 0.0) (list 1.0 0.0 0.0) "") es klappt nur wenn ich mir vorher punkte mit getpoint hole BSP: Code: (setq koord1 (getpoint) koord2 (getpoint) (command "_line" koord1 koord2)
selbst wenn ich mir koord1 und koord2 ausgeben lasse und dann genauso die punkte als liste kopiere und wieder hinter command line setze gibt er mir Fehler: funktion abgebrochen woran liegt das - wie stelle ich dem (command "_line") koordinaten richtig zur verfügung? Danke für eure hilfe das mit den layern kommt dann danach nochmal LG Kian [Diese Nachricht wurde von Code Kian am 23. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Okt. 2023 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Bleiben wir bei der einfachen Zeile, die sollte funktionieren und man braucht sich nicht (unnötig) Gedanken um die Variablen machen: (command "_line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") Das sollte funktionieren: Bitte kopiere noch einmal die Zeile von hier: (command "_line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") in deine Befehlszeile oder Textfenster: [F2] Noch immer eine Fehlermeldung? Falls Ja, bitte teste diese Eingabe in deiner Befehlszeile: (command "_.line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") Und?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 23. Okt. 2023 11:57 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: Bleiben wir bei der einfachen Zeile, die sollte funktionieren und man braucht sich nicht (unnötig) Gedanken um die Variablen machen: (command "_line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "")Das sollte funktionieren: Bitte kopiere noch einmal die Zeile von hier: (command "_line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") in deine Befehlszeile oder Textfenster: [F2] Noch immer eine Fehlermeldung? Falls Ja, bitte teste diese Eingabe in deiner Befehlszeile: (command "_.line" '(0.0 0.0 0.0) '(1.0 0.0 0.0) "") Und?
Also beides ausprobiert und beides gibt nil zurück -> gezeichnet wird nichts huch das muss ich zurück nehmen ich habe die linie bloss nicht gesehen da sie genau auf der achsenanzeige lag und war wegen der nilrückgabe eingeschüchtert - also update es funktioniert doch aber irgendwas ist noch komisch, das kann ich aber noch nicht bennen - vlt nach der mittagspause dann danke für deine hilfe Liebe grüße Kian [Diese Nachricht wurde von Code Kian am 23. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Okt. 2023 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Okay, die Command-Rückgabe ist immer nil. Dann versuche es noch einmal wie bisher(also vor "meinem Test"), wie genau waren da die Umstände? Ich vermute du hast es in einem Programm getestet, ggf. direkt aus dem VS? Teste mit neu gestartetem AutoCAD (immer, wenn etwas nicht so läuft wie erwartet), funktioniert es jetzt auch - oder wieder " fehler: funktion abgebrochen" ? Anm: Wenn du in AutoCAD native Befehle automatisiert (alsp per Script,Makro,(send)command steuerst), dann musst du dich um den fortlaufenden Objektfang kümmern! Sonst kann es je nach Zeichnungsinhalt und aktueller Ansicht zu unerwünschten Ergebnissen führen. Denn, kaum jemandem fällt es je auf, der fortlaufende Objektfang ist bei Tastatureingaben in den Standardeinstellungen DEaktiviert (sehr sinnvoll), aber explizit NICHT unterdrückt wenn es um automatisierte Eingaben geht. Man muss also vor Punkteingaben dann den Objektfang "KEIN" oder eben "_non" oder "none" aufrufen, damit die ggf. eingeschalteten fortlaufenden Objektfänge für die nächste Eingabe deaktiviert werden. Alternativ könnte man die fortlaufenden, falls aktiviert, aus- und danach wieder einschalten. Der smarteste Weg ist jedoch ganz einfach die Variable für die Unterdrückung umzustellen, so dass diese auch für Automatisierungen gilt(1 statt 2). siehe Hilfe[F1] oder auch FAQ Sollte man den Objektfang auch mal in der Automatisierung wünschen, so kennt man sich "jetzt" aus und kümmert sich entsprechend darum, wichtig ist halt nur zu wissen das es da was gibt und was es da gibt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 23. Okt. 2023 13:50 <-- editieren / zitieren --> Unities abgeben:
Ich habs nochmal versucht also das normale command zeichnen funktioniert doch ganz normal wer hätts gedacht. Ich will jetzt aber eine Linie vom startpunkt:Einfügepunkt mit der länge:modulbreite in richtung der x achse zeichnen und habe mir das so vorgestellt:
Code: (command "_line" einfügepunkt (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt) ""))
also ich dachte mir startpunkt beim ausgewählten eifügepunkt ganz einfach und dann eine liste mit den x y und z koordinaten für den endpunkt y und z sollen ja gleich bleiben nur der x wert soll um modulbreite verschoben werden) bekomme aber nur nil und nichts wird gezeichnet - habe es auch mit (entlast) geprüft wurde wirklich nil gezeichnet Liebe grüße Kian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Okt. 2023 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
|
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 23. Okt. 2023 15:04 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: Zerlege den Code und schaue es dir Stück für Stück an. Siehe Anhang ----->
Das versuche ich die ganze zeit, ich versuch hier nochmal nachvollziehbar mein prozess zu schildern: Also habe den code geschrieben : Code:
(command "_line" einfügepunkt (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt) ""))
wenn ich nur die liste in die kommandozeile schreibe Code: (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt)
dann gibt er mir eine liste mit drei zahlen zurück die ungefähr so aussieht (1237.7 18237.2 0.0) und das ist ja genau was ich will (dachte ich zumindest) -- einfügepunkt ist natürlich genauso eine liste aus drei koordinaten, da sie durch getpoint erstellt wurde. wenn ich die variabeln als zahlen eingebe passiert auch was passieren soll aber mit den variabeln will er nicht rechnen/zeichnen. VS zeigt mir an das wohl an dem + was nicht stimmen kann (fehlerhafter argumenttyp: numberp: Nil) Habe jetzt die vermutung das nach (list...) kein operator folgen darf? stimmt das? dann könnte ich es umgehen indem ich den zweiten punkt (endpunkt der linie) in einer variabeln zwischenspeicher. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Okt. 2023 15:09 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Schau dir mein Bild noch einmal in Ruhe an! >>"wenn ich nur die liste in die kommandozeile schreibe " (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt) >>"dann gibt er mir eine liste mit drei zahlen zurück " Nein, dann sagt dir AutoCAD nur das es eine geöffnete Klammer hat, die noch nicht geschlossen wurde.. Was du posten wolltest sieht so aus: (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt)) und dann wird dir die Lsite mit den drei Zahlen ausgegeben..
[ESC] Und jetzt gibst du einfach mal die Klammer ein aus deinem ursprünglichen Code, dann erhälst du genau das zurück was ich in meinem Bild zeige und das ist nicht das was du wolltest (und nichts mit dem der Linie-Befehl etwas anfangen kann). Also los Befehl: (list (+ (nth 0 einfügepunkt) modulbreite) (nth 1 einfügepunkt) (nth 2 einfügepunkt) "") ????? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 23. Okt. 2023 15:34 <-- editieren / zitieren --> Unities abgeben:
Ach cadffm danke dir für die hilfe. habe den anhang nicht gesehen da ich "siehe anfang" gelesen habe und nicht wusste welcher anfang - habs daher gekonnt ignoriert. Ich schau mir den Anhang gleich an dann versteh ichs bestimmt. werde heute aber erstmal nicht damit weiterkommen. heisst du höhrst morgen wieder von mir. Liebe Grüße und großes Danke kian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 23. Okt. 2023 15:49 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
|
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 24. Okt. 2023 14:13 <-- editieren / zitieren --> Unities abgeben:
aaaaah passiert mir viel zu oft, gut das du mich drauf hinweisst. Gib mir zwei Jahre dann bin ich der aufgehende Stern am Lisphimmel und lese deine Codes korrektur kleiner themawechsel: es gibt doch bestimmt eine funktion mit der man sich den ename eines object geben lassen kann (so wie entlast bloß dass es nicht das letzte objekt ist). konnte online nichts finden mit meinen schlagwörtern LG Kian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 24. Okt. 2023 14:36 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
Hallo Kian, (nentsel) liefert Objektnamen und Pickpunkt. Ergänzung: Bei verschachtelten Objekten (z. B. Blockreferenz) wird der e-name des gepickten (unter-)Elementes angegeben.
Ein weitere Weg wäre: (entget (ssname (ssget) 0)) Das liefert gleich die kompletten Objektdaten des ersten ausgewählten Objektes, das erste Element ist der Objektname. Hier wird bei Blockreferenzen das "Insert" als solches geliefert. HTH Gruß Thomas [Diese Nachricht wurde von spider_dd am 24. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Code Kian Mitglied Technischer Systemplaner (in Ausbildung)
Beiträge: 27 Registriert: 18.09.2023
|
erstellt am: 24. Okt. 2023 14:38 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 25. Okt. 2023 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für Code Kian
|