Forum: PC-Programmierung CAD in Qt/C++ programmieren


von Gelöscht (kami89)


Lesenswert?

Hallo zusammen,

Ich frage mich schon lange, wie ein CAD aufgebaut ist, wie man sowas 
programmiert. Nun dachte ich, ich mach mich mal schlau und probiere ein 
bisschen rum.

Mal angenommen, ich möchte etwas ähnliches wie Eagle programmieren :-)
Also einmal den Schaltplaneditor, und einmal den Layouteditor. Und als 
Sahnehäubchen noch eine 3D Ansicht für die fertige Platine :-)

Zur Sicherheit (man weiss hier im Forum ja nie...): Ich will nicht ein 
besseres Eagle, Target oder KiCAD programmieren (würde ich schon gerne, 
aber ich weiss dass es wenig realistisch ist). Ich will mich nur mal mit 
der Materie auseinandersetzen, und zwar vorzugsweise nicht planlos, 
sondern schon mit einem (hochgesteckten) Ziel vor Augen. Ein Scheitern 
ist völlig egal, es geht um den Lerneffekt.

Ich würde dazu gerne Qt/C++ verwenden. C++ kann ich einigermassen, mit 
Qt habe ich noch nicht sehr viel Erfahrung (was ich aber ändern möchte).

Nun stellt sich mir die Frage, ob es wohl ein gescheites Framework gibt, 
das mir in Sachen CAD viel Arbeit abnehmen würde. Im Internet konnte ich 
zu dem Thema leider nicht gerade viel Informationen finden (vor allem 
auf Qt bezogen).

Meine Fragen wären nun erstmal:
Mit was würde man beginnen, wenn man so ein Layoutprogramm programmieren 
möchte? Gibt es Frameworks, die sich hierfür anbieten würden? Welche 
Aufgaben übernehmen die existierenden (Qt-)Komponenten, um was muss man 
sich selber kümmern (Zoomen, Elemente mit der Maus auswählen,...)?
Ist Qt überhaupt eine geschickte Wahl für so ein Vorhaben?

Dass z.B. das Zoomen eines grossen Layouts flüssig und ohne Ruckler 
möglich sein soll, versteht sich von selbst.

Ich würde mich auf Tipps freuen!

mfg

von ingo (Gast)


Lesenswert?

Kannst ja mal hier in die Quellen (der Community Edition) schmökern,
http://de.wikipedia.org/wiki/QCad
viel Spass
wünscht ingo

von FPGA-Takt (Gast)


Lesenswert?

Hi,

vill. mal im Bereich der Game-Engines umschauen gerade wenn die 2D/3D 
können brauchst hast könntest du weniger Probleme mit dem 3D Modus 
bekommen.

gz

von adsf (Gast)


Lesenswert?

Ich vermute die meisten Projekte schreiben sich ihre "Frameworks" dafür 
selbst, d.h. bauen ein System das die immer die gleichen Teilaufgaben 
abstrahiert. Wie viel man dann z. B. QT übernehmen lässt ist (auch) 
Geschmackssache. Am Beispiel eines Uniprojektes mit QT war bei uns im 
Studium z.b. zu beobachten das einige Teams ziemlich viel mit passend 
erzeugten Widgets erledigt haben, während andere Teams viel selbst 
implementiert haben, d.h. nur wenige Widgets und auf diesen dann 
fleissig rumgemalt.
Ist vermutlich auch Geschmackssache und hängt von den eigenen Zielen und 
Fähigkeiten ab, gerade bei einem "Lernprojekt".
Bei Qt kannst du dir mal QGraphicsScene anschauen.

von Gelöscht (kami89)


Lesenswert?

ingo schrieb:
> Kannst ja mal hier in die Quellen (der Community Edition) schmökern,
> http://de.wikipedia.org/wiki/QCad

Ich habe mich auch schon ein bisschen umgeschaut bei existierenden 
OpenSource CADs. Das Problem ist allerdings, dass man eine Ewigkeit 
braucht, bis man nur mal ein bisschen eine Vorstellung davon bekommt, 
wie das Ganze aufgebaut ist :-) Das, was ich bisher so gesehen habe, 
scheinen wohl alles Eigenentwicklungen zu sein, die extra für das 
jeweilige Programm geschrieben wurden. Mit sowas möchte ich eigentlich 
lieber nicht arbeiten.

FPGA-Takt schrieb im Beitrag #3029547:
> vill. mal im Bereich der Game-Engines umschauen gerade wenn die 2D/3D
> können brauchst hast könntest du weniger Probleme mit dem 3D Modus
> bekommen.

Naja, ich denke es würde sowieso Sinn machen, wenn man die 3D-Ansicht 
unabhängig von den 2D-Ansichten (Schaltplan & Layout) bauen würde. In 
der 3D Ansicht möchte man ja auch ganz andere Sachen sehen, als in der 
2D-Ansicht. Für die 3D-Ansicht wäre eine Art Game-Engine vielleicht 
schon nicht schlecht, für die 2D-Ansichten aber vermutlich ziemlich 
übertrieben.

adsf schrieb:
> Ist vermutlich auch Geschmackssache und hängt von den eigenen Zielen und
> Fähigkeiten ab, gerade bei einem "Lernprojekt".

Ja, das stimmt wohl... Mein Problem ist momentan einfach, dass ich nicht 
aufs falsche Pferd setzen möchte wenn ich mit sowas beginne :-) Nicht, 
dass ich was verwende das bei 20 Grafikobjekten noch wunderbar 
funktioniert, bei über 1000 Objekten aber total versagt.

> Bei Qt kannst du dir mal QGraphicsScene anschauen.

Hmm über das "Ding" habe ich mich schon früher mal ein bisschen 
informiert. Gefällt mir eigentlich ganz gut, wäre sowas auch für ein 
grosses Layout geeignet wo es extrem viele (kleine) Grafikobjekte gibt? 
So eine Leiterplatte besteht ja aus zig Linien, Flächen, Kreise, ...

Also sowas in der Art: Ein QGraphicsView aufs Formular knallen, und dort 
ein QGraphicsScene mit zig Grafikobjekten anzeigen lassen. Wäre das 
schonmal ein guter Ansatz?

Das Zeichnen der Leiterbahnen usw. ist dann ja alles auf diese Weise 
möglich:
1
rect = scene->addRect(...);
Grössere Probleme sehe ich aber z.B. bei einem Gitter (das "unendlich" 
gross sein soll), Raster beim Verschieben von Objekten, und Zoom. Ich 
glaube ich fang einfach mal an mit der QGraphicScene rumzuspielen :-)

mfg

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

ich bau genau sowas (schematic/layout-editor) für meine diss... 
grundsätzlich wirklich kein problem mit der graphics-view/scene.

das unendliche gitter lässt sich am einfachsten über die 
draw-background-methode. kann dir später da was schicken.

objekte mach ich über die qgraphicsitemgroup. werde ich warscheinlich 
noch auf ein normales item ändern, da die itemgroup irgendwie komisch 
ist (wird aber auch so in der doku beschrieben).

item-definition (was ist auf den einzelnen layern+pin/pad definitionen, 
texte,...) habe ich in xml gepackt. selbiges mit den einzelnen projekt 
daten, simulations-profilen,... geht über die dom-lib, die die qt 
mitbringt recht schön.

soweit alles nicht weiter schwierig und aufwendig... bei den netzen ist 
das anders. da ist mir noch nicht wirklich etwas gutes/praktikables 
eingefallen (punkte, des netzes, wie verbunden, welches bauteil/pin/pad 
auf welchem netz und vor allem netz am schematic und layout verwalten).

muss mir das demnächst anschaun, wie eagle und kicad das macht.

das nette an der graphics-scene ist übrigends, das drucken und 
pdf-generieren quasi gratis mit geht.

73

von adsf (Gast)


Lesenswert?

Ich gehörte zu einem Team das alles selber gemalt hat, deswegen habe ich 
da nicht so die Ahnung ;)
Du kannst eventuell auch die GraphicsScene mit "selbstgezeichneten" 
Dingen mischen?
Ansonsten, mach dir frühzeitig Gedanken wie du Darstellung und 
abstraktes Modell verbindest:
-ein Widerstand sieht auf dem Schaltplan anders aus als auf dem Layout
-ebenso eine Leiterbahn, da kann das noch viel komplizierter sein (auf 
dem Schaltplan ist eine Linie, auf dem Layoutplan eine Leiterbahn, eine 
Durchkontaktierung, noch eine Leiterbahn, ...)
-du solltest weitere Bauteile/Bauteildesigns einfach hinzufügen können 
ohne überall im Quelltext was anpassen zu müssen
...

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

leider zu langsam.... also extra post:

wegen der geschwindigkeit würde ich mir nicht so viele gedanken 
machen... ab 50k punkte in einem polygon wirds richtig langsam... bis 
10k punkte solltest du nicht wirklich ruckeln merken.

für die performance müsstest du schon verdammt fitt in algorithmen 
design sein, das du das selber besser kannst (mit anti-aliasing,...)

die opengl-beschleunigte scene (qt5) sollte auf jeden fall besser sein.

Habe das aber aus zeitgründen noch nicht probiert.

73

von Gelöscht (kami89)


Lesenswert?

Vielen Dank für die Antworten.

Jetzt habe ich wenigstens mal einen Anhaltspunkt, womit ich beginnen 
kann. Vorher stand ich einfach total im Leeren, weil ich nicht 
abschätzen konnte wie leistungsstark die von QT bereitgestellten 
Komponenten sind. Aber das scheint nun ja mit 
QGraphicsView/QGraphicsScene soweit möglich zu sein. Wie gesagt, ich 
setze ungern von Anfang an aufs falsche Pferd ;-)

Die Verwaltung der ganzen Netze ist sicher ein Knackpunkt, da habt ihr 
Recht. Viele Gedanken dazu habe ich mir noch nicht gemacht. Die einzige 
Idee ist bisher, dass man die Verbindungen vielleicht in einer SQLite 
Datenbank ablegen könnte ;-) Aber erstmal möchte ich mich ein bisschen 
mit der Grafik beschäftigen, denn ich sehe dort für mich die grösste 
Hürde.

Also ich werde mich dann wohl mal mit QGraphicsScene beschäftigen. Mal 
schauen ob das was wird ;-)

mfg

P.S.
Ideen für ein Schema/Layoutprogramm hätte ich soooo viele :-) Ich fand 
bisher einfach noch kein Programm das mir richtig gefällt. Eagle finde 
ich nicht schlecht, aber die Bauteilebibliothek ist grässlich.
Die Motivation ist also da, aber ob die Zeit, das Können und der 
Durchhaltewillen auch da sind, das ist eine andere Frage ;-)
Aber versuchen kostet ja nix (ausser etwas Zeit)...

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

sqlite habe ich ursprünglich auch verwendet... war aber eine sackgasse!

die bauteil-definitionen in xml gestalten sich wesentlich einfacher (vor 
allem durch die dom-lib!)

übrigends gibts auch ein svg-item. das kann leider aber keine effekte 
und ist so auch nicht der bringer! webkit als item integrieren geht, ist 
aber auch nicht soo toll.

besser man definiert sich tags für polygon, text, linie und diverse 
layer und parst dann seine "vektor-grafik" einfach so.

unbedingt würde ich mir auch für jedes bauteil einen reference-point 
definieren (und wenns implizit 0,0 ist), damit du vernünftig auf ein 
raster positionieren kannst.

rotieren,... von elementen macht dir dann die lib, du musst du wissen um 
welchen punkt es sich drehen muss und wo du dann alles haben willst.

73

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Grid im hintergrund zeichnen ist hier erlärt:

http://www.qtcentre.org/threads/31883-How-to-make-a-Grid-on-QGraphicscene

mm in punkte für die scene umrechnen geht übrigends mit *72/25.2

73

von adsf (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> mm in punkte für die scene umrechnen geht übrigends mit *72/25.2

Bist du sicher das die 72 von Qt fix gesetzt sind und nicht etwa 
Einstellungssache? Das wäre nämlich erheblich sinnvoller ;)

von Gelöscht (kami89)


Lesenswert?

Vielen Dank für die Tipps!

Ich habe mal eine Klasse von QGraphicsView abgeleitet, welche nachher 
als "CADView" verwendet werden soll.

Das Hintergrundgitter funktioniert super, und auch Zoom und Pan habe ich 
von hier eingebaut:
http://www.qtcentre.org/wiki/index.php?title=QGraphicsView:_Smooth_Panning_and_Zooming

Auch das funktioniert soweit schon sehr gut. Nur merkt man bisher noch, 
dass die QGraphicsScene nur eine endliche Grösse hat, denn wenn man 
rauszoomt sind die Grafiken immer in der Mitte der QGraphicsView, 
verschieben geht dann nicht mehr. Das nervt bei einem CAD ziemlich, ein 
"unendlich grosser" Zeichenbereich ist da viel angenehmer. Aber ich bin 
mir sicher, auch das ist ein lösbares Problem :-)

Bisher bin ich schonmal sehr positiv überrascht, hätte nicht gedacht 
dass man innert wenigen Stunden bereits so ein Ergebnis bekommt.

Ein Knackpunkt dürfte aber vermutlich dann noch das Markieren von 
Zeichenobjekten sein. Viele Sachen (z.B. Fadenkreuze der Nullpunkte) 
werden ja mit "unendlich dünner" Linie gezeichnet, ein Mausklick der 
leicht neben so einer Linie getätigt wird, müsste dann auch dieser Linie 
zugeordnet werden können. Ich vermute mal, man muss da von Hand 
ausrechnen, welches Element nun am nächsten beim Mausklick liegt?

Hans Wilhelm schrieb:
> mm in punkte für die scene umrechnen geht übrigends mit *72/25.2
25.2? Nicht 25.4 (25.4mm = 1 Zoll)?

von Axel J. (axeljaeger)


Lesenswert?


von Jean Player (Gast)


Lesenswert?

Hiho und guten morgen :-)
Habe nit alles gelesen , also schonmal sry muss jetzt los zu arbeit -_-
Also QGraphicsView klingt gut als einstieg , darin implementierst du nen 
QGLWidget, damit du nen openGL2 Painter hast :-)
Und schon läuft das Ding. Ok bischen openGL solltest schon können, aber 
dann kannste alles von 2D bis 3D machen können in deinem widget.
Bei Fragen einfach Fragen :-)
Guten Moin und .....
Mfg Player.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

sorry vertippt... 25.4

irgendwo in der doku auf qt-project.org steht, das die koordinaten in 
(postscript) points sind.

73

von Gelöscht (kami89)


Lesenswert?

Axel Jäger schrieb:
> Das mal anschauen: http://doc.qt.digia.com/qt/demos-chip.html

Ahh das sieht nicht schlecht aus, danke!

Jean Player schrieb:
> Also QGraphicsView klingt gut als einstieg , darin implementierst du nen
> QGLWidget, damit du nen openGL2 Painter hast :-)

Meinst du etwa das hier, das ich in der oben genannten Demo fand?
1
void View::toggleOpenGL()
2
{
3
#ifndef QT_NO_OPENGL
4
    graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
5
#endif
6
}

von Sebastian S. (sebastians)


Lesenswert?

Open CASCADE ist so ein Framework. Mächtig, aber nicht einfach, hab ich 
den Eindruck.
http://www.opencascade.org/

von Rolf M. (rmagnus)


Lesenswert?

adsf schrieb:
> Hans Wilhelm schrieb:
>> mm in punkte für die scene umrechnen geht übrigends mit *72/25.2
>
> Bist du sicher das die 72 von Qt fix gesetzt sind und nicht etwa
> Einstellungssache? Das wäre nämlich erheblich sinnvoller ;)

Wie man's nimmt. Ein "Punkt" ist nun mal 1/72 Zoll.
http://de.wikipedia.org/wiki/Schriftgrad#Das_DTP-Punkt-System
Qt sollte den auch so verwenden, sofern das System mit dem echten 
DPI-Wert des Monitors arbeitet. Und wenn nicht, dann ist das System 
falsch eingestellt. Wozu sollte man das ausschließlich für Qt-Programme 
dann nochmal umbiegen können?

von Gelöscht (kami89)


Lesenswert?

Sebastian S. schrieb:
> Open CASCADE ist so ein Framework. Mächtig, aber nicht einfach, hab ich
> den Eindruck.
> http://www.opencascade.org/

Ja ich glaube das ist wohl etwas zu umfangreich für mich. Ausserdem habe 
ich grad gemerkt dass es mir ziemlich Spass macht, sowas selbst zu bauen 
:-)

Bisher habe ich schonmal folgendes hingekriegt (mit viel Hilfe des 
Internets :-)
- Bauteile können verschoben werden
- Bauteile werden immer am Raster ausgerichtet
- Hintergrund wahlweise mit Punkten, Gitter oder deaktiviert
- Zoomen mit Mausrad

Nur ein Problem habe ich beim Zoomen noch. Ich verwende diesen Code zum 
Zoomen: 
http://www.qtcentre.org/wiki/index.php?title=QGraphicsView:_Smooth_Panning_and_Zooming

Solange die QGraphicScene grösser als den sichetbaren Bereich der 
QGraphicsView ist, funktioniert es perfekt. Sobald man aber zu weit 
rauszoomt, so dass mindestens eine Kante der QGraphicScene innerhalb der 
QGraphicsView ist, wird die QGraphicScene automatisch in der 
QGraphicScene zentriert (und der entsprechende Scrollbalken 
verschwindet, da der gesamte Inhalt sichtbar ist).

Das mag beim Zoomen von Bildern so gewünscht sein, doch in einem CAD 
möchte man beim Zoomen nicht "gestört" werden, auch wenn man ins Nirvana 
rauszoomt.

Weiss vielleicht grad jemand, wie ich das automatische Zentrieren 
unterbinden kann?

von adsf (Gast)


Lesenswert?

Suche ich dir morgen raus, ich glaube da hab ich einen Codeschnippsel 
rumfliegen.

von Gelöscht (kami89)


Lesenswert?

adsf schrieb:
> Suche ich dir morgen raus, ich glaube da hab ich einen Codeschnippsel
> rumfliegen.

Super, vielen Dank! :-)

...zu dieser späten Stunde eine Antwort wie aus der Pistole geschossen, 
nicht schlecht xD

von adsf (Gast)


Lesenswert?

Hm, tut mir leid, war doch nicht ganz das was du wolltest, aber 
eventuell kann man es trotzdem mit diesen Funktionen einstellen, schau 
mal in die Doku dazu.

setHorizontalScrollBarPolicy()
 setVerticalScrollBarPolicy()
 setTransformationAnchor()
 setAlignment();
 m_gscene->setSceneRect()
 setViewportMargins()
 setViewportUpdateMode()

von Gelöscht (kami89)


Lesenswert?

Hmm ich glaube das ist gar nicht möglich, die QGraphicsView zentriert 
die QGraphicScene immer automatisch, sobald die Scrollbalken weg sind. 
In der Doku steht bei centerOn() auch, dass das Zentrum nur dann gesetzt 
werden kann, wenn die Szene grösser ist als die View, anderenfalls wird 
die Szene einfach zentriert. Ein Hinweis darauf, dass sich das 
deaktivieren lässt, konnte ich nicht finden.

Ich probiers mal so, dass die Szene halt automatisch vergrössert wird, 
sobald man zu weit rauszoomt, und evtl. wieder verkleinert wird beim 
reinzoomen. Ich denke mal so sollte es funktionieren...

Danke trotzdem für deine Mühe, adsf.

mfg

von Sebastian S. (sebastians)


Lesenswert?

Kannst ja auch einen Rahmen drum rum machen. Damit es immer groß genug 
ist.

von Gelöscht (kami89)


Lesenswert?

Also ich habe jetzt einfach das SceneRect sehr gross gemacht. Eagle 
macht es wohl auch nicht viel anders, da ist die verfügbare 
Schaltplanfläche auch beschränkt habe ich bemerkt.

In Sachen Grafik bin ich nun doch zuversichtlich dass ich das 
einigermassen hinkriege. Die QGraphicsView hat ja auch schon nette 
Funktionen mit eingebaut, wie z.B. QGraphicsView::Items() um alle 
Elemente an einer bestimmten Koordinate zu ermitteln.

Ein Design Rule Check dürfte dann jedoch etwas komplizierter werden ;-)

Momentan mache ich mir eher Gedanken über die Bauteilebibliothek und vor 
allem deren Speicherung. Für die Bibliothek würde ich gerne eine 
Datenbank verwenden, dann kann man die Bibliothek nämlich auf einem 
MySQL Server haben, wo dann verschiedene Clients darauf zugreifen 
können.

Target scheint es auch so zu machen, die Schaltplansymbole und 
Footprints werden wohl in Blobs gespeichert. In was für einem Format die 
Daten aber abgelegt werden, habe ich nicht rausgefunden... "file" meint 
das hier:
1
VAX COFF executable - version 8710
"dmg2iso" weigert sich aber die Datei umwandeln:
1
ERROR: dmg image is corrupted

Ein Schaltplansymbol könnte man ja eigentlich mit simplen Textbefehlen 
beschreiben, z.B. so ähnlich wie es in KiCAD gemacht wird:
1
DEF LM4674 U 0 40 Y Y 1 F N
2
F0 "U" 0 -750 60 H V C C
3
F1 "LM4674" 0 750 60 H V C C
4
DRAW
5
S -350 650 350 -650 0 1 0 N
6
X BACK 17 650 -500 300 L 50 50 1 1 w
7
X BACK 17 650 -500 300 L 50 50 1 2 w
8
X OUTLA 7 650 -200 300 L 50 50 1 1 O
9
X OUTLB 8 650 -100 300 L 50 50 1 1 O
10
X PGND 11 650 400 300 L 50 50 1 1 w
11
X PVDD 6 650 500 300 L 50 50 1 1 W
12
X OUTLB 7 700 -450 300 L 50 50 1 2 O
13
ENDDRAW
14
ENDDEF

Um Platz zu sparen könnte man es dann vor dem Ablegen in der Datenbank 
noch komprimieren, ich denke aber mal das ist nicht wirklich notwendig.
Wenn man es unkomprimiert speichert, bräuchte man dann eigentlich ja 
kein BLOB-Feld, ein Text-Feld würde es doch dann auch tun wenn ich mich 
nicht täusche (bin nicht soo der Datenbank Spezialist...).

Falls dazu jemand noch Tipps hat, immer her damit :-)

mfg

von Thomas (Gast)


Lesenswert?

Ich würde Symbole, Footprints und Bauelemente getrennt als XML anlegen.
Für die Symbole würde sich SVG anbieten:
http://de.wikipedia.org/wiki/Scalable_Vector_Graphics#Beispiel

von Gelöscht (kami89)


Lesenswert?

Thomas schrieb:
> Ich würde Symbole, Footprints und Bauelemente getrennt als XML anlegen.

Eigentlich bin ich zwar ein Fan von Klartext-Dateien für alles Mögliche, 
für die Bauteilbibliothek möchte ich jedoch aus zwei Gründen eine 
Datenbank verwenden:
- Die Bibliothek kann per DB-Server im ganzen Netzwerk verwendet werden
- Man kann sehr gut Datensätze untereinander verlinken (Jeder Datensatz 
hat eine eindeutige ID, die per Foreign Keys in anderen Datensätzen 
verlinkt werden kann), somit ist es möglich eine sehr gut strukturierte 
Bauteilebibliothek zu erstellen.

Den ersten Punkt könnte man zwar auch mit einer Dateifreigabe der 
XML-Dateien erledigen, das finde ich aber nicht sehr schön. Und damit 
man nicht zwingend einen MySQL Server braucht, lässt sich die Bibliothek 
auch in einer SQLite Datenbank speichern.

Ausserdem muss man ja nicht auf XML verzichten wenn man eine DB benutzt 
- Die XML-Dateien lassen sich ja auch in Blob-Feldern speichern.

Die Bauteileverwaltung von Eagle macht mich echt wahnsinnig, und vom 
Erstellen eigener Bauteile wollen wir gar nicht erst reden...Mit Target 
konnte ich mich noch nie anfreunden (Bedienung ist für mich der Horror), 
und KiCAD ist viel zu kompliziert ;-)

Jetzt habe ich mir mal Gedanken darüber gemacht, wie man es denn (mMn) 
"besser" machen könnte. Eine saubere Bauteileverwaltung zu bauen ist 
wirklich nicht leicht, irgend einen Kompromiss muss man immer eingehen.

Meine Idee sieht etwa so aus:
Es gibt Symbole (Schaltplan-Symbol), Footprints (fürs Board), 
3D-Modelle (für 3D-Ansicht), Gehäuse und Bauteile.
Ein Gehäuse besteht aus einem Footprint und einem 3D-Modell. Ein Bauteil 
besteht aus einem Symbol und einem Gehäuse, und vor allem aus der 
Verknüpfung von Footprint und Symbol, also die Zuordnung der Pads zu den 
Pins.

Einige Beispiele:
1
Symbole:     - Diode
2
             - PNP-Transistor
3
             - ATMega48/88/168
4
Footprints:  - TO92
5
             - DIP28
6
             - TQFP32
7
3D-Modelle:  - Sockel_DIP28
8
             - IC_DIP28
9
             - IC_TQFP32
10
Gehäuse:     - IC_DIP28 (Footprint DIP28 + 3D-Modell IC_DIP28)
11
             - Sockel_DIP28 (Footprint DIP28 + 3D-Modell Sockel_DIP28)
12
             - IC_TQFP32 (Footprint TQFP32 + 3D-Modell IC_TQFP32)
13
Bauteile:    - ATMega88-20AU (Symbol ATMega48/88/168 + Gehäuse IC_TQFP32)
14
             - ATMega88-20PU (Symbol ATMega48/88/168 + Gehäuse IC_DIP28)

Das Erstellen neuer Bauteile würde nun zum Kinderspiel werden, da man 
häufig nur noch die bereits existierenden Symbole, Footprints usw. zu 
neuen Kombinationen zusammenfügen muss (inkl. Zuordnungen Pins <--> 
Pads). "Re-Use" heisst das Zauberwort (das den Eagle-Entwicklern wohl 
ein Fremdwort ist - zumindest bis v5, v6 hab ich nicht). Auch eigens 
erstellte Bauteile (die man im Internet verteilen kann), sollen auf die 
Standardsymbole, Footprints usw. zugreifen können.

Das Updaten des Symbols der Diode würde sich sofort auf alle 
existierenden Dioden auswirken. Die in einem Projekt verwendeten 
Bauteile werden jedoch im Projekt selber abgespeichert damit nichts 
kaputt gehen kann beim Verändern der Bibliothek. Per "Bauteile 
aktualisieren"-Button könnte man die dann aber auch wieder frisch aus 
der Bibliothek holen, so wird es in Eagle auch gemacht.

Soviel zu meinen Ideen...Ob ich auch die Zeit und den Durchhaltewillen 
habe, das alles umzusetzen, das wird sich zeigen ;-)
Falls ja, dann wird es auf jeden Fall OpenSource werden, soviel steht 
schonmal fest^^

Thomas schrieb:
> Für die Symbole würde sich SVG anbieten:

SVG ist zwar nicht schlecht, jedoch müsste es erweitert werden damit es 
auch mit Layers und Pins umgehen kann. Ein Symbol im Schema ist ja nicht 
nur ein Bild, sondern es braucht z.B. noch Anschlusspunkte für die 
Verbindungen. Das SVG-Format könnte aber als Basis dienen, die man dann 
noch um ein paar Funktionalitäten erweitert.

mfg

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

vom einzelnen Strich bis zur Leiterplatte lässt sich dass alles sehr 
schön 1:1 objektorientiert abbilden: ein footprint besteht z.B. aus 
Pads, Figures, Text usw. also hat die Klasse component die Eigenschaft 
Pads (Array oder Liste) etc., Pad hat wiederum die Eigenschaften Form, 
Abmessung1..4, Bohrdurchmesser, Layerzuordnung usw. Dazu natürlich die 
Methoden addPad, GetPadList, ReadPadfromLib, die aufbauen auf 
ReadParameter oder ReadPosition...

So geht der Aufbau der Library-Definition und der Klassen Hand in Hand, 
wenn ich z.B. einen Bauteil-Preis einführen will, definiere ich die 
Eigenschaft price und die Methoden zum Lesen und Schreiben in der 
Library und fertig. Gibt es in der Library einen Eintrag price und ich 
habe ihn noch nicht vorgesehen, so wird er einfach überlesen.

Die Klassenhierarchie ist damit zugleich die Library-Definition.

Gruss Reinhard

von Gelöscht (kami89)


Lesenswert?

Reinhard Kern schrieb:
> Hallo,
 Hallo Reinhard!

> vom einzelnen Strich bis zur Leiterplatte lässt sich dass alles sehr
> schön 1:1 objektorientiert abbilden: ein footprint besteht z.B. aus
> Pads, Figures, Text usw. also hat die Klasse component die Eigenschaft
> Pads (Array oder Liste) etc., Pad hat wiederum die Eigenschaften Form,
> Abmessung1..4, Bohrdurchmesser, Layerzuordnung usw. Dazu natürlich die
> Methoden addPad, GetPadList, ReadPadfromLib, die aufbauen auf
> ReadParameter oder ReadPosition...

Nun, ziemlich genau so ist es geplant :-)

Aber die Pads auch noch alle einzeln in der Datenbank speichern wäre 
übertrieben, ich möchte lieber die Footprints und Symbole mit Text 
beschreiben (z.B. XML) und das dann so mit dem entsprechenden Footprint 
bzw. Symbol zusammen in der Datenbank ablegen. Ich muss mir mal das 
KiCAD Format für Symbole und Footprints genauer anschauen, wenn das 
etwas gescheites ist, könnte ich das eigentlich auch praktisch 1:1 so 
übernehmen, dann kann meine Software auch direkt mit KiCAD 
Symbolen/Footprints umgehen. Anderenfalls könnte man natürlich aber auch 
einen Konverter bauen...

mfg

von Reinhard Kern (Gast)


Lesenswert?

Urban B. schrieb:
> Aber die Pads auch noch alle einzeln in der Datenbank speichern wäre
> übertrieben

Ja isses, aber Protel macht das trotzdem so, andere nicht: bei Cadstar 
wird die Position des Components gespeichert, die Pads eines Components 
sind im Footprint definiert relativ zum Component-Nullpunkt, und ihre 
Position auf der Leiterplatte ergibt sich aus der Summe von 
Pad-Koordinaten und Component-Koordinaten und -Orientierung.

Cadstar geht noch weiter: die Pads selbst sind nicht im Footprint 
definiert, sondern extra unter Assignments - ein Circle 60/31 
(selbstdefiniert) ist also ein rundes Pad mit 60mil (1,5mm) Durchmesser 
und 31mil (0,8mm) Bohrung. Das Pad ist nur einmal definiert, kann von 
allen DIL-Footprints benutzt werden und im Layout also von allen 
entsprechenden ICs. Ebenso sind Texte nur einmal definiert mit Font, 
Höhe, Strichstärke usw.

Urban B. schrieb:
> ich möchte lieber die Footprints und Symbole mit Text
> beschreiben

Höchst vernünftig, das sollten ALLE CAD-Anbieter so machen und das 
Format dokumentieren, das würde viele Probleme des Datenaustauschs lösen 
oder man könnte sie selbst angehen.

Gruss Reinhard

von Gelöscht (kami89)


Lesenswert?

Danke für die Infos!

Reinhard Kern schrieb:
> Ja isses, aber Protel macht das trotzdem so, andere nicht: bei Cadstar
> wird die Position des Components gespeichert, die Pads eines Components
> sind im Footprint definiert relativ zum Component-Nullpunkt, und ihre
> Position auf der Leiterplatte ergibt sich aus der Summe von
> Pad-Koordinaten und Component-Koordinaten und -Orientierung.

Genau so stelle ich mir ein vernünftiges Design vor und habe deshalb 
vor, es auch so zu bauen :-)

Mir ist halt einfach sehr wichtig, dass die Bauteile wirklich 
strukturiert aufgebaut sind, damit man extrem einfach bereits bestehende 
Teile für neue Bauelemente wiederverwenden kann. Und zwar nicht per 
Kopie, sondern als Verknüpfung, so dass sich die Aktualisierung eines 
kleinen Details sich direkt auch auf alle anderen Bauteile auswirkt, die 
davon abstammen.

Reinhard Kern schrieb:
> Cadstar geht noch weiter: die Pads selbst sind nicht im Footprint
> definiert, sondern extra unter Assignments - ein Circle 60/31
> (selbstdefiniert) ist also ein rundes Pad mit 60mil (1,5mm) Durchmesser
> und 31mil (0,8mm) Bohrung. Das Pad ist nur einmal definiert, kann von
> allen DIL-Footprints benutzt werden und im Layout also von allen
> entsprechenden ICs. Ebenso sind Texte nur einmal definiert mit Font,
> Höhe, Strichstärke usw.

OK soweit wollte ich erstmal noch nicht gehen, wenn die Software sonst 
fertig ist kann man das ja auch noch einbauen :-D

Reinhard Kern schrieb:
> Höchst vernünftig, das sollten ALLE CAD-Anbieter so machen und das
> Format dokumentieren, das würde viele Probleme des Datenaustauschs lösen
> oder man könnte sie selbst angehen.

Jup, deshalb verwende ich wenn möglich immer OpenSource Software. Nur 
ist das im Bereich CAD nicht so wirklich einfach (ausser man ist mit 
KiCAD zufrieden)... Aber das lässt sich ja ändern :-)

mfg

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

XML ist wirklich recht schön zu gebrauchen für das. SQL hatte ich 
urspünglich implementiertn, aber das ist wesentlich unflexibler.

Bauteile sind übrigends bei weitem nicht das problem.
Sowas ähnliches wie SVG hat man sich recht schnell implementiert 
(Polygon, Line, Text ist eigentlich ausreichend).

aktiviert man die anti-aliasing-flags usw von der scene, schaut das auch 
ziemlich gut aus!

@Urban B:
Bei der Bauteildatenbank würde ich mich gerne bei dir anhängen. Ich habe 
schon R, L, C, Hohlbuchse, 1206, 0207, ... gezeichnet.

Ist aber halbwegs Arbeit...

Wichtig finde ich übrigends, dass so ziemlich jedes Element eine 
unique-id bekommt.

nicht nur die footprints und componenten am schematic, auch die pins 
sollten sowas haben, da du dann recht einfach die zugehörigkeiten zu 
netzen,... herausfindest.

73

von Gelöscht (kami89)


Lesenswert?

Hans Wilhelm schrieb:
> XML ist wirklich recht schön zu gebrauchen für das. SQL hatte ich
> urspünglich implementiertn, aber das ist wesentlich unflexibler.

Deshalb würde ich die XML Dateien in einem Blob-Feld in der Datenbank 
ablegen, so hat man den Vorteil eines einfachen Dateiformats im 
Klartext, aber auch die Möglichkeit jedem Element eine eindeutige ID 
zuzuweisen, und eine Bauteilebibliothek die auf einem Server installiert 
werden kann und dann mehreren Clients zur Verfügung steht.

Hans Wilhelm schrieb:
> Bei der Bauteildatenbank würde ich mich gerne bei dir anhängen. Ich habe
> schon R, L, C, Hohlbuchse, 1206, 0207, ... gezeichnet.

Ah cool, könntest du mal so ein Beispiel hier anhängen oder mir als PN 
schicken?

Hans Wilhelm schrieb:
> Wichtig finde ich übrigends, dass so ziemlich jedes Element eine
> unique-id bekommt.
>
> nicht nur die footprints und componenten am schematic, auch die pins
> sollten sowas haben, da du dann recht einfach die zugehörigkeiten zu
> netzen,... herausfindest.

Hmm also ein Pin muss ja nicht über das ganze Schema eine eindeutige ID 
haben, es genügt ja wenn der Pin innerhalb des Bauteiles eindeutig ist, 
und das Bauteil wiederum im Schema eindeutig ist.

Ich bin momentan noch ein Klassendiagramm am entwerfen, wenn ich mal den 
ersten Entwurf fertig habe, kann ich den hier noch reinstellen.

Mir sind übrigens noch diverse Fragen eingefallen, vielleicht kann die 
jemand von euch beantworten:
- In einer Firma (> ~10 Entwickler), wie werden dort Bauteilbibliotheken 
verwaltet? Mit einem Datenbankserver?
- Wie werden die Projekte verwaltet? Sind es normale Dateien, die per 
Dateifreigabe vom Server den Clients zur Verfügung gestellt werden? Oder 
etwas Datenbankbasiertes?
- Können mehrere Personen am gleichen Projekt arbeiten? z.B. Ein 
Entwickler im Schema auf Seite 1, ein anderer im Schema auf Seite 2 und 
ein dritter am Layout? Spätestens bei extrem grossen Projekten muss das 
ja irgendwie so machbar sein. Bekommt dann jeder Benutzer nur innerhalb 
eines gewissen Bereiches (Schemaseite, Layout) Schreibrechte, und auf 
den Rest des Projektes nur Leserechte?

Ich möchte die Basis der Software gerne so bauen, dass später auch mal 
ein Mehrbenutzersystem möglich ist (wenn es mit überschaubarem Aufwand 
machbar ist).

Gruss Urban

von Reinhard Kern (Gast)


Lesenswert?

Teilantworten:

Unser CAM-System arbeitet nach dem Prinzip check in/out: ein Mitarbeiter 
wählt das Projekt und die Funktion check out, dann stehen ihm die Daten 
exklusiv zur Verfügung (oder werden gleich auf die lokale Workstation 
kopiert). Ist er fertig, wählt er check in, vorher kann niemand anders 
etwas ändern.

Bauteile: der Zugriff ist weniger ein Problem, Konflikte durch 
gleichzeitige Änderungen sind sehr selten. Viel problematischer ist es 
in der Praxis, die Bauteile bei mehreren Bearbeitern einheitlich zu 
gestalten, aber das lässt sich kaum durch Software lösen.

Meine persönliche Meinung: Stromlaufpläne lassen sich partitionieren in 
verschiedene Aufgaben, da ist es sogar vorteilhaft Spezialisten für 
Netzteile, Messschaltung, Speicher usw. dranzusetzen. Eine Leiterplatte 
ist aber in vielen Fällen nur holistisch zu betrachten, beim PCB-Layout 
würde ich daher höchstens seriell (schichtweise) mehrfach bearbeiten. Es 
gibt Firmen mit technischen Abteilungen in Europa, USA und Indien, da 
wird zu Dienstschluss das Projekt westwärts weitergegeben und kann so 
24h am Tag bearbeitet werden.

Gruss Reinhard

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

also bei mentor geht ändern gleichzeitig oder mit 
lock/check-in/check-out,... eigentlich in allen variationen.

bauteile werden über eine datenbank verwaltet. das liegt aber eher an 
preisen,stückzahlen, datenblätter,... die auch hinterlegt sind.

bei uns sind aber einige 0er mehr bei der entwicklerzahl/cad 
nutzeranzahl dabei...


meine bauteile bekommen pro pin 2 uids. 1x für das schematic-symbol und 
1x für den footprint. mir ist bisher keine andere möglichkeit 
eingefallen wie ich netze verwalten kann.

es gibt quasi netze auf der obersten hirachieebene, auf die wird aus den 
schematic/layout-seiten durch teilnetze verwiesen und in diesen 
teilnetzen steht dann drinnen welcher pin vom bauteil auf der seite dazu 
gehört.

also gibts im project-file <component></componet> pro componente für die 
parameter <net></net> pro netz, <schematic></schematic>, 
<layout></layout> und zum visualisiern von simulationsergebnissen 
<simulation></simulation>

jede schematic/layout/simulation-page hat dann zu den darauf 
befindlichen componenten einen verweis zum toplevel-element + 
koordinaten + eben pin-subnet mapping

nicht ganz einfach, aber mir ist bisher wie gesagt nichts einfacheres 
eingefallen.

73

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Angehängte Dateien:

Lesenswert?

So wie versprochen ein beispiel. Sorry, ist etwas länger der post.

Unten die Definition eines Widerstandes.

Im PDF wäre als Beispiel der Schaltplan und der Begin des Layouts von 
einem Schaltregler.

Ich bin gerade am Neuimplementieren der Netze.
Daher gibts im Layout keine Verbindungen.

Wieso die PDFs gerastert sind entzieht sich gerade meiner Kenntnis.
Sollte eigentlich schon eine Vektorgrafik sein was die Scene da 
ausspuckt.

73


footprint.xml
1
<Library Name="SMS Resistor Footprints">
2
  <Footprint Package="0805" Id="{eec5f929-1f33-498d-9ace-4637a745779a}" VersionNumber="1">
3
  <!-- from vishay pdf:VJ....W1BC Soldering and Footprint Design -->
4
5
    <Decoratives>
6
      <Layer name="LayoutComponentArea">
7
  <!-- added .25mm width -->
8
  <Polygon width="0.25">
9
    <Point x="-0.2" y="0"/>
10
    <Point x="3.25" y="0"/>
11
    <Point x="3.25" y="1.95"/>
12
    <Point x="-0.2" y="1.95"/>
13
    <Point x="-0.2" y="0"/>
14
  </Polygon>
15
      </Layer>
16
      
17
      <Layer name="LayoutSilkScreen">
18
  <Text x="1.525" y="-1.5" size="4" value="$Name" rotation="0"/>
19
      </Layer>
20
    </Decoratives>
21
      
22
    <Pads>
23
      <Pad Name="1" x="0.575" y="0.925" Type="SMD" Width="0.9" Height="1.3"/>
24
      <Pad Name="2" x="2.475" y="0.925" Type="SMD" Width="0.9" Height="1.3"/>
25
    </Pads>
26
    
27
    <ReferencePoint x="1.525" y="0.975"/>
28
    
29
  </Footprint>
30
</Library>

resistor-library.xml
1
<Library Name="Resistive Elements">
2
  <Component Type="Resistor" Name="Resistor" Id="{2315e29f-58bc-45ac-90b7-58a3affa8c23}" VersionNumber="1">
3
    <Simulation>
4
      <Model Name="R"/>
5
      <EcmaModel Terminals="2">
6
  <![CDATA[
7
        var R=1.0;
8
9
        var Tnom=273.15+27.0;
10
        var Alpha=1.0/56.0;
11
          
12
        function Init(Parameters) {
13
    R=Parameters['R'];
14
    Alpha=Parameters['Alpha'];
15
    Tnom=Parameters['Tnom'];
16
    DissipatedPower=0.0;
17
    DissipatedPowerStep=0.0;
18
    
19
        }
20
21
        function Step() {
22
        }
23
24
        function Calculate(dt, Voltages, VoltagesStep, Temp, TempStep) {
25
    var Voltage=Voltages[0]-Voltages[1];
26
    var Temperature=Temp[0];
27
    var TemperatureStep=TempStep[0];
28
29
    var Resistance=R+(Temperature-Tnom)*Alpha;
30
    var ResistanceStep=R+(Temperature+TemperatureStep-Tnom)*Alpha;
31
32
    var ret=[ [Voltage/R, -Voltage/R], [(Voltage+VoltagesStep[0])/R, -(Voltage-VoltagesStep[1])/R], [-(Voltage*Voltage)/Resistance], [-(Voltage*Voltage)/ResistanceStep] ];
33
    return ret;
34
        }
35
    ]]>
36
      </EcmaModel>
37
    </Simulation>
38
    
39
    <Parameters>
40
      <Parameter Name="R" DisplayName="Resistance" Unit="Ω" Type="double" Show="1"/>
41
      <Parameter Name="Alpha" DisplayName="α" Type="double" Unit="K⁻¹"/>
42
      <Parameter Name="Tnom" DisplayName="Nominal Temerature" Type="double" Unit="K"/>
43
      <Parameter Name="Rtha" DisplayName="Thermal Resistance to Ambient" Type="double" Unit="K/W"/>
44
      <Parameter Name="Ctha" DisplayName="Thermal Capacitance to Ambient" Type="double" Unit="J/K"/>
45
    </Parameters>
46
    
47
    <Designator Value="R"/>
48
    <Schematic>
49
      <Symbol>
50
  <Layer name="SchematicComponentSymbol">
51
    <Polygon width="0.5">
52
      <Point x="2.5" y="-2.5"/>
53
      <Point x="2.5" y="2.5"/>
54
      <Point x="17.5" y="2.5"/>
55
      <Point x="17.5" y="-2.5"/>
56
      <Point x="2.5" y="-2.5"/>
57
    </Polygon>
58
59
    <Line x1="0" y1="0"  x2="2.5" y2="0" width="0.5"/>
60
    <Line x1="17.5" y1="0"  x2="20" y2="0" width="0.5"/>
61
  </Layer>
62
63
  <Layer name="SchematicComponentName">
64
    <Text x="10" y="-5" size="8" value="$Name" rotation="0"/>
65
  </Layer>
66
    
67
  <Layer name="SchematicComponentValue">
68
    <Text x="10" y="5" size="8" value="$Value" rotation="0"/>
69
  </Layer>
70
  
71
      </Symbol>
72
      
73
      <Pins>
74
  <Pin Name="1" x="0" y="0" />
75
  <Pin Name="2" x="20" y="0" />
76
      </Pins>
77
    </Schematic>
78
    
79
    <Packages>
80
      <Package Name="0805" PackageId="{eec5f929-1f33-498d-9ace-4637a745779a}">
81
  <PinMapping PadName="1" PinName="1" />
82
  <PinMapping PadName="2" PinName="2" />
83
      </Package>
84
    </Packages>
85
  </Component>
86
</Library>

von Reinhard Kern (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> <Polygon width="0.5">
>       <Point x="2.5" y="-2.5"/>

Denk rechtzeitig dran, dass du auch Kreisbögen realisieren musst (bei 
allen Linienzügen - ein beliebiger Abschnitt kann gerade oder ein Bogen 
sein). Auf kompliziertere Kurven kann man bei Layouts verzichten.

Gruss Reinhard

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Für die docu-layer gibts z.B schon sowas:

  <Circle x="0.0" y="0.0" r="4.45" width="0.25"/>

zwischen 2 punkten in den netzen wirds bei mir nur gerade verbindungen 
geben (schematic und layout), da ich zumindest das H-Feld über den 
traces simulieren will.

wie gesagt ist das alles nicht weiter aufwendig.

dagegen macht mir die verwaltung der netze noch immer massiv 
kopfschmerzen, da irgendwie alles auf graphen hinausläuft die irgendwie 
zusammenhängen und irgendwie auch nicht (layout/schematic)...

vor allem wenn das dann über mehrere schaltplanseiten geht...

73

von nunStudent (Gast)


Lesenswert?

Hallo,

willst du irgendwas Intelligentes bei den Netzen machen oder reicht 
nicht etwas einfaches in Richtung?

-> Nur ein Name für ein Signal
-> Das Signal an verschieden Punkten im Schematic ( Verbindungen / Pins 
)
-> Über die Lib (Package+Symbol) werden dann im Board alle Pads mit dem 
gleichen Signalnamen verknüpft.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

naja, irgendwie musst die leitungen dazwischen doch verwalten. sprich 
die einzelnen liniensegmente im layout und schaltplan.

das zielführendste, das mir bisher eingefallen ist, wäre alle pads/pins 
und eckpunkte als vertex in einem graphen zu betrachten.

damit wäre dann auch airwires relativ einfach realisierbar.

73

von Reinhard Kern (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> dagegen macht mir die verwaltung der netze noch immer massiv
> kopfschmerzen

Nicht wirklich. Eigentlich ist ein Netz in Schaltplan nichts als eine 
Liste von Pins, im PCB kommen noch Vias dazu und ev. virtuelle 
Anschlüsse dazu wie die in einer Cu-Fläche. Netzlisten, die von den 
Programmen erzeugt werden, sind daher auch extrem einfach gestrickt, 
immer nur Bauteil Pin Bauteil Pin usw. Nach dem Routen ist einem Netz 
eine Liste von Leiterbahnstücken zugeordnet.

Ein (temporäres) Problem ergibt sich nur bei der Funktion Reconnect, 
also dem Umsortieren von ungerouteten Connections mit dem Ziel minimaler 
Gesamtlänge. Das sollte man sowieso extra betrachten und optimieren, 
weil es für die Bedienbarkeit eine entscheidende Funktion ist, besonders 
als dynamic reconnect während des Bewegens von Bauteilen. Das Ergebnis 
kann auch weniger Knoten haben, aber nicht mehr. Ansonsten ändern sich 
Netze ja nur durch Eingriff des Users (hoffentlich!).

Gruss Reinhard

von Hans (Gast)


Lesenswert?

Das ist genau was ich meine!

Netzlisten an sich sind simpel. Das habe ich bisher für die Simulation 
auch so verwendet.

Nur liegen hinter einem netz eben Wire-Stücke aus dem Schematic bzw 
Cu-Polygone aus dem Layout. Und das muss irgendwie verknüpft sein.

In meiner vorhergendenden Implementierung habe ich grundsätzlich nur 
pins zu netze hinzufügen lassen und die netze automatisch zeichnen 
lassen.

Das ist aber fürs layouten nicht brauchbar.

Da hast du jetzt pins/pads als vertices (an verschiedenen positionen) in 
2 graphen die zusammenhängen. das was dazwischen liegt ist dann anders.


73

von Gelöscht (kami89)


Lesenswert?

Okay danke schonmal für die Hinweise wie die das mit dem gleichzeitigen 
Arbeiten am selben Projekt gehandhabt wird, und für das XML-Beispiel!

Zum Thema Netze:
Dass die Netze unabhängig von der genauen Verdrahtung (Schaltplan, 
Layout) gespeichert wird, ist sicher sinnvoll würde ich meinen. Die 
Verbindungslinien könnte man dann doch in einer separaten Tabelle (bzw. 
XML) speichern, jeweils als einzelne Linienstücke oder Kreisbogenstücke. 
Jedes dieser Linienstücke hat folgende Eigenschaften:
1
- Eindeutige ID des Netzes zu dem das Linienstück gehört
2
- Schaltplanseite
3
- Startpunkt x,y
4
- Endpunkt x,y
5
- Geometrie zw. Start-/Endpunkt (Gerade, Kreisbogen mit Radius r und Zentrum z)

Mehrere Linienstücke hintereinander werden nun durch ihre 
Start-/Endpunkte miteinander verbunden. Also wenn an einem Pin eines 
Symbols eine Gerade Linie von der Koordinate des Pins bis zur Koordinate 
"p1" verläuft, und ein anderes Linienstück des selben Netzes von "p1" 
bis zum Pin eines anderen Bauteiles, dann ergibt das eine 
zusammenhängende Verbindung zwischen zwei Symbolen. Wird jetzt z.B. der 
Punkt "p1" verschoben, schaut man in der Datenbank nach, welche 
Linienstücke alle an diesem Punkt enden bzw. beginnen, und verschiebt 
diese mit. Kommen an einer Koordinate mehr als zwei Liniensegmente 
zusammen, soll automatisch ein Verbindungspunkt entstehen (damit der 
Benutzer sieht, dass es eine Verbindung gibt dort).

Die Verbindungen werden somit also eindeutig durch die Koordinaten der 
Start-/Endpunkte der Liniensegmente bestimmt. Liegen mehrere Endpunkte 
von Liniensegmenten an der selben Koordinate, gelten sie automatisch als 
verbunden.

Beginnt der Benutzer nun mitten in eine geraden Linie eine zweite Linie 
zu zeichnen, so muss die Software halt merken dass dort schon eine Linie 
durchläuft, damit diese Linie nun in zwei einzelne Segmente aufgeteilt 
werden kann und dadurch einen Anschlusspunkt für die neue Linie 
entsteht.

Fürs Layout müsste das eigentlich ja auch ungefähr so machbar sein. Vias 
werden einfach als spezielle Liniensegmente angesehen und somit auch in 
der Datenbank der Liniensegmente abgelegt. Dort gilt das gleiche: Alle 
Linien desselben Netzes, die an der Koordinate des Vias enden/beginnen, 
gelten als verbunden mit dem Via.

Für die Luftlinien schaut man einfach in der Datenbank der 
(Layout-)Liniensegmente nach, welcher Punkt am nächsten ist. Man filtert 
nach der ID des gewählten Netzes und bekommt dann die 
Start-/Endkoordinaten aller Liniensegmente des selben Netzes. Darin 
sucht man sich dann die am nächsten liegende Koordinate. OK dadurch 
werden zwar nur jeweils die Endpunkte berücksichtigt und nicht das, was 
dazwischen liegt. Da muss man dann halt noch zusätzliche Berechnungen 
durchführen wenn man es genau haben möchte. Zusätzlich müssen natürlich 
auch noch die Pads aller Bauteile in die Suche miteinbezogen werden (die 
können ja durch das Schema auch ein Netz haben, auch wenn sie keine 
Leiterbahn angeschlossen haben).

Habe ich etwas übersehen, oder könnte das vielleicht so funktionieren?

mfg

von Hans (Gast)


Lesenswert?

Dieses verhalten habe ich gerade implementiert und ersetze es gerade.

ich werde zukünftig nur die "ecken" der netze speichern und tabellen mit 
verbindungen dazwischen.

Das suchen von gleichen koordinaten ist nicht ganz so trivial, da du 
doubles vergleichst. außerdem musst du entweder die scene fragen ob da 
etwas anderes ist, oder eben dir extra im hintergrund die tabellen 
halten.

weiters verschiebst du mit einer ecke 2 punkte (2 linien starts) + die 2 
linien. wenn du nur ecken speicherst verschiebst du nur 1nen punkt (und 
musst nur den einen punkt aufs raster ausrichten)

besser finde ich punkte Ids zu geben und zu sagen Id1 und Id2 sind 
verbunden. daher habe ich oben auch gemeint ich würde jeden pin/pad eine 
unique-id geben, da ich dann einfach sagen kann, dass die id des pins 
dem netz zugehörig ist, und wenn ich im footprint/symbol was ändere, 
versichen sich die linien, verbunden sind sie aber immer noch.

grundsätzlich spricht ja nix dagegen die linien als bezier kurven 
darzustellen. jetzt habe ich einfach qgraphicslineitems, statt denen 
kann man ja auch qraphicspathitems nehmen.

aber zuerst halt einfach.

auf jeden fall probiere ich das jetzt so aus und hoffe, dass da einiges 
einfacher wird.... vor allem sollte ich so auch wieder thermische netze 
zeichnen können für kühlkörper usw.

73

von Reinhard Kern (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei ein klitzekleiner Ausschnitt aus der Cadstar ASCII Definition, zur 
Ein/Ausgabe von net. Da kann man über Details andrer Meinung sein, aber 
jedenfalls ist es ein funktionierendes und bewährtes System. Das 
Original ist eine kreuz und quer verlinkte Hilfedatei. Heute würde man 
eine solche Beschreibung auch mit Xirgendwas erstellen.

Gruss Reinhard

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

zur Ergänzung noch ein reales net:
1
  (NET N0
2
   (NETCODE W1)
3
   (SIGNAME "SEL3W")
4
   (PIN P0 CMP157 11)
5
   (PIN P1 CMP159 11)
6
   (PIN P2 CMP210 1)
7
   (PIN P3 CMP55 1)
8
   (PIN P4 CMP52 7)
9
   (CONN P0 P1 W0
10
    (ROUTE LAY19 (PT 21590000 15240000)
11
     (ROUTEWIDTH 30480) (PT 21717000 15367000)
12
     (ROUTEWIDTH 30480) (PT 23177500 15367000)
13
     (ROUTEWIDTH 30480) (PT 23304500 15240000)
14
     (ROUTEWIDTH 30480) (PT 23622000 15240000)
15
    )
16
   )
17
   (CONN P1 P2 W0
18
    (ROUTE LAY6 (PT 23622000 15240000)
19
     (ROUTEWIDTH 30480) (PT 23622000 14795500)
20
    )
21
   )
22
   (CONN P3 P0 W0
23
    (ROUTE LAY6 (PT 21590000 14795500)
24
     (ROUTEWIDTH 30480) (PT 21590000 15240000)
25
    )
26
   )
27
   (CONN P0 P4 W0
28
    (ROUTE LAY19 (PT 21590000 15240000)
29
     (ROUTEWIDTH 30480) (PT 21272500 15240000)
30
     (ROUTEWIDTH 30480) (PT 21145500 15367000)
31
     (ROUTEWIDTH 30480) (PT 20256500 15367000)
32
     (ROUTEWIDTH 30480) (PT 18161000 17462500)
33
     (ROUTEWIDTH 30480) (PT 13144500 17462500)
34
     (ROUTEWIDTH 30480) (PT 12700000 17018000)
35
     (ROUTEWIDTH 30480) (PT 10604500 17018000)
36
     (ROUTEWIDTH 30480) (PT 10477500 16891000)
37
     (ROUTEWIDTH 30480) (PT 10477500 16765000)
38
    )
39
   )
40
  )

Gruss reinhard

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

die machen das eh genau so wie ich oben beschrieben hab... sie merken 
sich punkte und nicht strecken... bzw merken sie sich polygone, was eben 
die strecken zwischen den punkten implizit definiert.


was sie aber nicht tun ist nur die strecken a-b b-c c-d zu merken und 
dann zu schaun ob welche punkte auf gleicher koordinate liegen.

wenn a und d auf einem pin liegen ists gut und man findet heraus wie 
alles verknüpft ist, wenn aber der footprint sich ändert hat man ein 
problem.

daher haben die ja ja verweise auf die pins der componenten (damit quasi 
einen vertex wie ich ihn oben beschrieben habe, nur das ich die info 
beim bauteil und nicht beim netz sehe.. also wurscht).

dann definieren sie die zuerst definierten punkte am netz mit polygonen.

das wäre also eqivalent, wenn ich sage ich habe stückpunkte (die punkte 
die mit (PT ...) definiert sind, und dann eine liste die sagt "verbinde 
punt a mit punkt b"

wenn man sich jetzt überlegt wie man die daten verwaltet sodass layout 
und schematic zusammenpassen, wirds nicht einfacher... ich will 
übrigends nicht den weg über explizite netzlisten gehen. => kein 
CAD-System für große schaltungen, sondern simulator, der teile das 
layouts mitberücksichtigen kann.

73

von Reinhard Kern (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> was sie aber nicht tun ist nur die strecken a-b b-c c-d zu merken und
> dann zu schaun ob welche punkte auf gleicher koordinate liegen.

Wäre mir zu riskant. Cadstar speichert primär die PIN-Liste, und die 
beschreibt das Netz topologisch und damit auch elektrisch, und die kann 
beim Routen auch nicht verändert werden (nicht im topologischen Sinn). 
Die Netzlisten, also hier die PIN-Listen, sind die Essenz des Layouts 
überhaupt.

Gruss Reinhard

von Hans (Gast)


Lesenswert?

sag ich ja...

was mir jetzt noch kopfweh macht, ist das verwalten von pin (schematic), 
pad (layout) und der restlichen punkte damit man (wie du es so schön 
nennst) das netz topologisch beschreiben kann.

weil du hast punkte die zusammenhängen (also pin1 vom symbol und pad10 
vom footprint), und dann irgendwelche andere punkte die die verbindung 
zwischen komponenten verwalten.

Es würde noch gehen, wenn man behauptet es zählt eh nur das schematic.

Dann verwaltet man halt eine liste von den Pins am Netz (Pin-Pad-Mapping 
ist eh in der componentendefinition) und dann jeweils für schematic und 
layout noch eine liste fürs topologische zeugs.

problem an der sache sehe ich wenn sich alles über mehrere seiten zieht.

Implementierungsdetail halt :)

73

von Reinhard Kern (Gast)


Lesenswert?

Hans schrieb:
> Es würde noch gehen, wenn man behauptet es zählt eh nur das schematic.

Beispiel CadStar: zusätzlich zu den Pads an Bauteilen gibt es Junction 
Points, z.B. an der Stelle, wo Leiterbahnen T-förmig verbunden sind. Im 
Gegensatz zu den Pads können die beim Routen entstehen und verschwinden. 
Damit vermeided man, Teilstücke übereinander zu legen, so hat das 
Cadstar früher mal gemacht, das war aber viel schlechter zu handhaben.

Ebenso braucht man die, wenn Leiterbahnen einfach so im Nirwana enden. 
Unbedingt notwendig ist es, Leiterbahnen nur teilweise zu routen und 
erst später fertigzustellen, aber auch im Endzustand werden offene Enden 
manchmal benötigt, z.B. zu Abschirm- oder Guard-Zwecken.

Gruss Reinhard

von Hans (Gast)


Lesenswert?

Ich brauch das etwas abstrakter. bei mir heißt das vertex, weil das 
"netz" ja einen graphen darstellt. und meine netze nicht nur elektrisch 
sondern auch thermisch sein könne.

daher nicht netz sonder domain mit typ electrical :)

wie gehts denn eigentlich den thread-starter?

73

von Gelöscht (kami89)


Lesenswert?

Hans schrieb:
> wie gehts denn eigentlich den thread-starter?

Momentan bin ich hier einfach am mitlesen was ihr für Ideen habt und was 
für Erfahrungen ihr gemacht habt :-) Ich habe halt noch andere Projekte, 
die eine höhere Priorität haben, daher gehts nur langsam voran mit 
diesem Projekt hier. Es soll ja in erster Linie auch mehr ein 
Lernprojekt sein, mit dem ich mich mit Qt und der CAD-Programmierung 
vertraut machen kann.

Ich habe diesen Thread hier halt gestartet um mal einen Einstieg zu 
finden, und diesen habe ich dank euch auch gefunden. Jetzt weiss ich in 
welche Richtung es gehen soll.

Hans schrieb:
> und meine netze nicht nur elektrisch sondern auch thermisch sein könne.

Da hast du aber einiges vor :-) Können das die "grossen" CADs auch?

mfg

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Nein, das können sie nicht wirklich. Das liegt aber an der Natur der 
Sache. Ich bau' das für meine Dissertation :)

Dafür stelle ich aber keine Anforderungen an 8Layer+ Verwalten, diverse 
flooding Möglichkeiten, div. ERCs, export in M-CAD systeme, ...

Mentor hat schon ziemlich ausgeklügelte Systeme ;)

E-CAD ist aber eben E-CAD... man kann zwar CAD-Daten an 
FEM/...-Simulatoren übergeben und dann irgendwelche Signale anlegen, 
aber ich will was anderes.

Es soll sowas wie Spice werden, nur das auch das "echte" thermische 
Verhalten mitsimuliert wird. Damit du sagen kannst "Mein kühlkörper wird 
so warm, und der lüfter muss 80% Luftdurchsatz bringen". Idealerweise 
rennt gleichzeitig auch eine CPU-Emulation für die regelung...

Vieles davon geht auch schon... jetzt muss alles halt schön langsam 
herzeigbar und verifiziert werden, damit man was vernünftig publizieren 
kann :)

73

von Reinhard Kern (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> Mein kühlkörper wird
> so warm

Willst du ernsthaft die Luftströmungen durch einen Rippenkühlkörper 
simulieren, oder nimmst du die Herstellerangaben dazu?

Gruss Reinhard

von Gelöscht (kami89)


Lesenswert?

Okay, interessante Sache :-)

Mein Ziel wäre dann schon eher etwas in Richtung Eagle. Aber mit einer 
gescheiten Bauteilebibliothek xD

mfg

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Aktuell nur Rth(m) und Cth => "das "echte" thermische
Verhalten"

Man kann 2 Kurven hinterlegen: Einmal den thermischen Widerstand in 
abhängigkeit von der Luftmasse, und anderseits die Luftmasse in 
Abhängigkeit von der Spannung die der Lüfter sieht.

Das ist schon recht interessant.

Grundsätzlich sehe ich aber auch kein problem darin fluid dynamics 
mitzusimulieren... es dauert halt "etwas" länger :)

Jedes Bauteil weiß, welche Temperatur es hat. Im nächsten Schritt kommt 
jetzt das Layout dazu, und dann kann ich nach der Simulation ein schönes 
buntes Bild erzeugen wo man dann sieht welche PCB-Traces wie warm würden 
(nach IPC-2221) und welches Bauteil bereits magic smoke von sich gibt :P

Sollte auf jeden fall besser mit der Realität zusammenstimmen als eine 
einfach spice simulation...

grobe Multilayer PCBs muss man sowieso mit FEM modellieren, sonst wird 
man wohl mit den thermischen Kopplungen nicht hinkommen.

73

von Reinhard Kern (Gast)


Lesenswert?

Urban B. schrieb:
> Aber mit einer
> gescheiten Bauteilebibliothek xD

Aber es hindert dich doch niemand, für Eagle die ultimative Library zu 
erstellen.

Gruss Reinhard

von Reinhard Kern (Gast)


Lesenswert?

Hans Wilhelm schrieb:
> und anderseits die Luftmasse in
> Abhängigkeit von der Spannung die der Lüfter sieht.

KK mit Lüfter sind wohl, entgegen der ersten Vermutung, auch der 
einfachere Fall, umso einfacher je höher der Lüfter dreht. Viel 
komplexer sind aber KK ohne Lüfter, mit "natürlicher" Konvektion, und 
die sind meiner Meinung nach die erdrückende Mehrzahl. Und noch viel 
mehr gibt es heizende Bauelemente ohne Kühlkörper, wobei gemeinerweise 
häufig die Verlustleistung von der Taktfrequenz und bei Prozessoren ganz 
massiv von der Software abhängt - viel Spass dabei. Eine Software, der 
ich ein PCB-Layout und die Software übergebe und die mir dann sagt wie 
heiss der Prozessorchip wird, hätte zweifellos gute Chancen.

Gruss Reinhard

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Daran hab ich noch garnicht gedacht :) danke für den Input :)

Derzeit spiel ich mich micht Step-Down controller. Diese Simulationen 
schaun eigentlich ganz Ok aus.

Jetzt betreue ich in den nächstem Monaten eine FH Diplomarbeit von der 
ich mir erhoffe einen surface-scanner zu bekommen.

So Gott will kann ich dann das H-Feld über dem PCB und Temperaturen der 
Komponenten und Traces mit der Realität vergleichen.

Power-Prediction bzw. Simulation/Debugging über einen SoC-Emulator wären 
in der tat cool... ein paar jahre hätt ich ja noch eingeplant ;P

Ich eigentlich nur einen möglichst simplen uC als SNT controller 
verwenden und zeigen wie "einfach" man schön ohne hardware entwickeln 
kann...

den gedanken im breakpoint quasi die welt runterhum anhalten zu können 
finde ich irgendwie cool :)

73

von Gelöscht (kami89)


Lesenswert?

Reinhard Kern schrieb:
> Urban B. schrieb:
>> Aber mit einer
>> gescheiten Bauteilebibliothek xD
>
> Aber es hindert dich doch niemand, für Eagle die ultimative Library zu
> erstellen.

Per ULP? Daran habe ich noch gar nicht gedacht...
Aber wie gesagt, es geht mir in erster Linie mal darum, mich mit dem 
Thema Qt und CAD auseinanderzusetzen. Der Weg ist das Ziel :-)

mfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.