ich möchte mir ein CAD Progarmm bauen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

__blackjack__ hat geschrieben: Sonntag 31. August 2025, 14:27 Keine Sprache kann „SVG-Dateien darstellen und speichern“. Zumindest kenne ich keine.
(Zählt Processing? :) Das ist natürlich keine Empfehlung für die Fragestellung hier.)
WasserLinse
User
Beiträge: 30
Registriert: Montag 29. Juli 2024, 06:39

@pyfopy Kann Dir helfen, bis hin zum vollständigen Program - aber das willst Du ja gerade nicht- Selbermachen ist Deine Parole. Wo Bist Du mit Svs=Text? Hast Du github?
WasserLinse
User
Beiträge: 30
Registriert: Montag 29. Juli 2024, 06:39

@pyfopy
kann Dir dabei helfen, gerne.
pyfopy
User
Beiträge: 15
Registriert: Mittwoch 29. Februar 2012, 15:14
Wohnort: NDS

hallo,
das ist schön von Dir.
Was meinst Du damit?
Wo Bist Du mit Svs=Text? Hast Du github?
Ich dachte so, als 1. müsste ich die Mausklicks abfragen können > die x und y Punkte in Variable übernehmen > dann auf eine Zeichenfläche als Linie zeichnen. Da finde ich gar nichts zu.

Die Linien-Eigenschaften angeben können, usw
Aber das ist erst mal für mich das Wichtigste.
Gruß

pyfopy
Benutzeravatar
__blackjack__
User
Beiträge: 14143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Aber anschauen kann man doch zumindest mal. Code und Variablen auf Modulebene und eine Funktion die fröhlich Variablen ausserhalb ändert. Attribute an fremde Objekte heften ist auch nicht gut. Das soll mal ein CAD-Programm werden — da sollte man von Anfang an sauber arbeiten.

Das vorgeben der Fenstergrösse ist auch falsch, weil sich die ja schon aus der `Canvas`-Grösse ergibt.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Benutzeravatar
grubenfox
User
Beiträge: 618
Registriert: Freitag 2. Dezember 2022, 15:49

Naja, bei der kurzen Suche hatte ich auch noch andere Beispiele gefunden. Die waren aber noch schlechter... Hauptsächlich ging es mir um das "kann gar nichts zu finden", welches ich nicht glauben konnte. Ist so ein "mit der Maus irgendwohin klicken und dabei Linien ziehen" nicht ein Standardbeispiel und bei jedem GUI-System "dabei" (in Doku bzw. Tutorials oder so)?
WasserLinse
User
Beiträge: 30
Registriert: Montag 29. Juli 2024, 06:39

Svg kann man im Browser angucken, es ist Norm. Ich empfehle tkinter für eine Voransicht. Wichtig sind: Linien, Kreise, Rechtecke und Text. Einfache geometrische Formen also.
WasserLinse
User
Beiträge: 30
Registriert: Montag 29. Juli 2024, 06:39

svgLines=[]
x1=100
y1=200
x2=300
y2=400
line="<line "+str(x1) + " "+str(y1)+" "+ str(x2)+ " "+ str(y2))+ "></line>"
svgLines.append(line)
Sirius3
User
Beiträge: 18300
Registriert: Sonntag 21. Oktober 2012, 17:20

@WasserLinse: das ist kein gültiges Python, kein gültiges SVG und noch schlechter Stil. SVG ist ein XML-Format, und dazu benutzt man mindestens einen XML-Serialisierer, wenn nicht gar eine spezielle Bibliothek für SVG.
pyfopy
User
Beiträge: 15
Registriert: Mittwoch 29. Februar 2012, 15:14
Wohnort: NDS

@ grubenfox: ich hatte speziell nach 'Mouse' gesucht. In Deinem 1.Link klappt die Mausabfrage, ich sehe aber im Code kein einzigemal 'Mouse'.
Gruß

pyfopy
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

pyfopy hat geschrieben: Montag 1. September 2025, 11:28 Ich dachte so, als 1. müsste ich die Mausklicks abfragen können > die x und y Punkte in Variable übernehmen > dann auf eine Zeichenfläche als Linie zeichnen. Da finde ich gar nichts zu.
Das ist meiner Meinung nach ungefähr so, als würdest du ein neues Haus bauen wollen und als Erstes damit anfangen, dir zu überlegen, welche Schrauben du wohl für die Fußleisten im Gästezimmer brauchst. Bei einem Projekt von der Komplexität eines CAD-Programms sollte man m.M.n. erst einmal überlegen, was das können soll und sich ein grundsätzliches Konzept für die Struktur etc. überlegen. Das sind gute Kenntnisse in Python, in OOP und dem gewählten GUI-Framework notwendig. Die GUI, wie man ein Mouse-Event abfängt und wie man da später mal SVG draus macht, sind doch relativ unwichtige Implementierungsdetails am Anfang.
Benutzeravatar
__blackjack__
User
Beiträge: 14143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pyfopy: Warum sollte im Code denn auch „Mouse“ stehen? Eine Websuche schaut ja nicht nur in Quelltexten die auf einer Webseite stehen, sondern auch im Text. Und da taucht das Wort auf.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 14143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal das was der Code in dem Tutorial das grubenfox verlinkt hat, macht, aber in ordentlich:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.canvas = tk.Canvas(
            self, width=640, height=480, background="white"
        )
        self.canvas.pack()
        self.old_coords = None
        self.bind("<ButtonPress-1>", self.on_button_press)

    def on_button_press(self, event):
        coords = (event.x, event.y)
        if self.old_coords:
            self.canvas.create_line(self.old_coords, coords, width=2)
        self.old_coords = coords


def main():
    Window().mainloop()


if __name__ == "__main__":
    main()
Man hätte aber auch, statt irgendwo im Netz zu suchen, sich die Dokumentation zum `tkinter`-Modul anschauen können. Nach der kurzen Einführung was das Modul im groben ist/macht, kommt ein „Siehe auch:“-Kasten mit Links zu externen Texten und gleich der erste ist ein Tutorial, welches unter anderem ein Programm zum Zeichnen von Skizzen auf einem `Canvas` als Beispielcode enthält. Das Tutorial insgesamt benutzt leider auch viele globale Variablen, aber in diesem Fall steht nicht nur dabei, dass man das natürlich in eine Klasse verpacken würde, diese Variante wird sogar als Code gezeigt.

Was IMHO auch dafür spricht, dass man sich am besten hinsetzt und sich die Grundlagen drauf schafft, statt irgendwo im Netz nach Beispielen zu suchen um sich daraus dann ein eigenes Programm zusammen zu setzen, was man am Ende, sofern das überhaupt funktioniert, gar nicht versteht.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
pyfopy
User
Beiträge: 15
Registriert: Mittwoch 29. Februar 2012, 15:14
Wohnort: NDS

wie kann ich aus dem Beispiel von 'blackjack' z.B. die Weite und die Höhe des Fensters in eine Interger-Variable einlesen und mit 'print' ausgeben?
Gruß

pyfopy
pyfopy
User
Beiträge: 15
Registriert: Mittwoch 29. Februar 2012, 15:14
Wohnort: NDS

ich habe mir schon einige Beispiel angesehen, aber viele klappen nicht.
Ich benutze 'Thonny' als GUI-Editor, gibt taugt der was? Da läuft nicht alles drauf.
Gruß

pyfopy
Benutzeravatar
__blackjack__
User
Beiträge: 14143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pyfopy: Wie man die Fenstergrösse abfragt, kann man unter anderem in dem Tutorial lernen das als erstes in der `tkinter`-Dokumentation verlinkt ist.

Dazu braucht man dann noch Zeichenketten-Operationen, denn Tk/Tcl ist ja ziemlich ”stringly typed” und die Informationen zu Fenstergrösse und Position kommen in einer Zeichenkette, die man dann entsprechend auseinandernehmen muss. Eventuell würde sogar ein regulärer Ausdruck Sinn machen, also das `re`-Modul.

Thonny ist ganz brauchbar als IDE. Besser als IDLE auf jeden Fall.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
LeSchakal
User
Beiträge: 26
Registriert: Dienstag 5. Februar 2019, 23:40

Grundsätzlich würde ich dir empfehlen, erstmal auf die GUI zu verzichten und dich auf reine Textinputs zu konzentrieren.
Eine Mauseingabe ohne funktionierende Object Snaps kannst du sofort vergessen; es ist fast unmöglich, einen Punkt präzise zu treffen.

Du solltest dich also zuerst darauf konzentrieren, einfache Objekte (Punkte, Strahlen, Kreise) zu zeichnen, dann musst du mögliche Schnittpunkte finden, den Funktionsumfang erweitern, die Ausgabe anpassen.

Das ganze könntest du so konzipieren, dass eine Liste als Art Stack abgearbeitet wird.
juergenkulow
User
Beiträge: 10
Registriert: Freitag 6. Juni 2025, 08:09

Hallo pyfopy,

sieh Dir mal heise CadQuery: Objekte programmieren in Python mit SVG Export und STEP Import, sowie FreeCad 1.0.2 für Linux mit Python scripting an.
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
__blackjack__
User
Beiträge: 14143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Beispiel mit den Linien in Tcl und um die Abfrage von Fensterhöhe und -breite erweitert:

Code: Alles auswählen

#!/bin/sh
# \
exec tclsh "$0" "$@"
package require Tk

set oldCoords ""
pack [tk::canvas .canvas -width 640 -height 480 -background white]
bind .canvas <ButtonPress-1> {
    set newCoords [list %x %y]
    if { $oldCoords != "" } then {
        .canvas create line [concat $oldCoords $newCoords] -width 2
    }
    set oldCoords $newCoords
}
update idletasks
regexp {(\d+)x(\d+)} [wm geometry .] _ width height
puts "Breite: $width, Höhe: $height"
Wobei die Angaben ein bisschen mit Vorsicht zu geniessen sind, denn da wird die Fensterverwaltung gefragt, und bei mir antwortet die ohne die Fensterdekoration zu berücksichtigen (Rahmen, Titelleiste).
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Antworten