Fragen zu NURBS und zum Reverse Engineering Modul

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Fri Nov 30, 2012 9:20 pm

wmayer wrote:Ich glaube, dass OCC intern den zweiten Ansatz wählt, habe aber jetzt keine Möglichkeit das nachzuprüfen.
Die speichern beide als Array im Objekt. UpdateKnots erzeugt die erste Darsetllung aus der zweiten.
Meine Formel war nicht korrekt.

Code: Select all

if bsp.isPeridoic():
    NbPoles=sum(bsp.getMultiplicities()[1:])
else:
    NbPoles=sum(bsp.getMultiplicities())-bsp.Degree-1
Das erzeugen einer unifoemen BSplineCurve gelingt mir allerdings noch nicht, da ich keine Möglichkeit habe eine quasiuniforme in eine uniforme umzuwandeln. Für mich wäre es wünschenwert gleich den Konstruktor mit Parametern aufrufen zu können.

[EDIT]Manchmal hilft nur RTFS.
Endpoint und bezier zu setzten führt dazu, dass blender auf uniform zurückfällt. Bei cyclic ist alles uniform. (Hätten sie doch gleich radio buttons nehmen können) :twisted:
Last edited by shoogen on Sat Dec 01, 2012 11:42 am, edited 1 time in total.
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Sat Dec 01, 2012 10:24 am

Also uniform und peridoic bekommt ich in FreeCAD nicht hin.
https://sourceforge.net/apps/mantisbt/f ... php?id=895
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Wed Oct 23, 2013 5:28 am

Gibt es schon Beispiele wie man Part::Spline einsetzt?

Code: Select all

obj=App.ActiveDocument.addObject('Part::Spline')
obj.Shape=Part.makeHelix(1,3,2,2)
obj.ViewObject.ControlPoints = True
Aber leider sehe ich keinen Unterschied.
wmayer
Site Admin
Posts: 15487
Joined: Thu Feb 19, 2009 10:32 am

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby wmayer » Wed Oct 23, 2013 7:03 am

Part::Spline unterscheidet sich von Part::Feature nur darin, einen speziellen ViewProvider zu implementieren, um das Kontrollnetz von B-Spline-Kurven und -Flächen anzuzeigen. Das Property ControlPoints wurde aus ViewProviderPartExt entfernt und in ViewProviderSpline eingefügt. Später kann man u.U. Part::Spline auch parametrisch machen, aber derzeit sehe ich keinen Grund dafür.

Und der Grund, warum die Klasse eingeführt wurde, ist https://sourceforge.net/apps/mantisbt/f ... php?id=358

Das Beispiel sieht dann so aus:

Code: Select all

from FreeCAD import Base

pts=[]
pts.append(Base.Vector(10.106740,-0.173045,110.000000))
pts.append(Base.Vector(10.876900,12.552288,110.000000))
pts.append(Base.Vector(2.146670,24.053253,110.000000))
pts.append(Base.Vector(10.568193,33.859135,110.000000))
pts.append(Base.Vector(22.640881,26.377998,110.000000))
pts.append(Base.Vector(33.179409,29.244604,110.000000))
pts.append(Base.Vector(46.792278,29.475332,110.000000))
pts.append(Base.Vector(57.932823,26.863115,110.000000))
pts.append(Base.Vector(69.864944,32.936234,110.000000))
pts.append(Base.Vector(81.339508,27.226950,110.000000))
pts.append(Base.Vector(93.168350,29.244604,110.000000))
pts.append(Base.Vector(106.781219,29.475332,110.000000))
pts.append(Base.Vector(118.208069,27.469503,110.000000))
pts.append(Base.Vector(129.161713,33.628414,110.000000))
pts.append(Base.Vector(137.698593,24.399343,110.000000))
pts.append(Base.Vector(128.637985,12.673570,110.000000))
pts.append(Base.Vector(129.969254,-0.173045,110.000000))
pts.append(Base.Vector(129.123093,-12.188456,110.000000))
pts.append(Base.Vector(137.813950,-24.283981,110.000000))
pts.append(Base.Vector(129.853882,-34.205227,110.000000))
pts.append(Base.Vector(117.601677,-26.984392,110.000000))
pts.append(Base.Vector(106.550491,-29.013878,110.000000))
pts.append(Base.Vector(93.514435,-29.590694,110.000000))
pts.append(Base.Vector(82.105621,-26.693552,110.000000))
pts.append(Base.Vector(70.095673,-33.282322,110.000000))
pts.append(Base.Vector(59.481319,-26.922842,110.000000))
pts.append(Base.Vector(46.330826,-29.359968,110.000000))
pts.append(Base.Vector(32.948681,-29.244606,110.000000))
pts.append(Base.Vector(22.597166,-25.847414,110.000000))
pts.append(Base.Vector(10.568193,-33.859138,110.000000))
pts.append(Base.Vector(2.377396,-24.168617,110.000000))
pts.append(Base.Vector(11.240733,-13.886350,110.000000))

import Part
spline=Part.BSplineCurve()
spline.interpolate(pts, True)

App.newDocument().addObject('Part::Spline').Shape=spline.toShape()
App.ActiveDocument.ActiveObject.ViewObject.ControlPoints = True
Gui.ActiveDocument.ActiveView.fitAll()
wmayer
Site Admin
Posts: 15487
Joined: Thu Feb 19, 2009 10:32 am

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby wmayer » Wed Oct 23, 2013 7:08 am

Momentan wird ein Wire noch nicht unterstützt. Dein Code müsste so umformuliert werden:

Code: Select all

obj=App.ActiveDocument.addObject('Part::Spline')
obj.Shape=Part.makeHelix(1,3,2,2).Edges[0]
obj.ViewObject.ControlPoints = True
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Wed Oct 23, 2013 7:35 am

wmayer wrote:Part::Spline unterscheidet sich von Part::Feature nur darin, einen speziellen ViewProvider zu implementieren, um das Kontrollnetz von B-Spline-Kurven und -Flächen anzuzeigen. Das Property ControlPoints wurde aus ViewProviderPartExt entfernt und in ViewProviderSpline eingefügt. Später kann man u.U. Part::Spline auch parametrisch machen, aber derzeit sehe ich keinen Grund dafür.
Also langfristig fände ich es schön wenn man die Kontrollpunkte in der GUI verschieben könnte. ;) Das könnte ja aber die (Kopie der) Shape direkt manipulieren und müsste nicht wirklich parametrisch sein.
wmayer wrote:Momentan wird ein Wire noch nicht unterstützt.
Sorry, dann hab ich das wohl überlesen. Mir war nur aufgefallen, dass Compound noch fehlt.
wmayer wrote:Und der Grund, warum die Klasse eingeführt wurde, ist https://sourceforge.net/apps/mantisbt/f ... php?id=358
Also den Bug verstehe ich nicht.
wmayer
Site Admin
Posts: 15487
Joined: Thu Feb 19, 2009 10:32 am

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby wmayer » Wed Oct 23, 2013 2:16 pm

Also den Bug verstehe ich nicht.
Vielleicht eher mehr ein Feature-Request. Auf jeden Fall sollte es möglich sein, eine vollständig symmetrische und geschlossene Kurve zu erzeugen. Sieht man sich das Kontrollpolygon an, sieht man sofort, dass es nicht symmetrisch ist. Und zumindest mutet es etwas seltsam an, dass die Kurve abhängig von der Reihenfolge der Punkte ist.
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Wed Oct 23, 2013 3:21 pm

wmayer wrote:Vielleicht eher mehr ein Feature-Request. Auf jeden Fall sollte es möglich sein, eine vollständig symmetrische und geschlossene Kurve zu erzeugen.
Ich hab es mit mal genauer angeschaut und bin zu der Auffassung gelangt, das es ein Bug in OCCT ist.
Die Kurve ist zwar periodisch aber die mults sollten (nach der OCCT Dokumentation) an den Enden eins sein, sie sind allerdings zwei.

Zum ViewProvider: Wenn man das Objekt versteckt bleibt die Kontrollpunkte sichtbar.
wmayer
Site Admin
Posts: 15487
Joined: Thu Feb 19, 2009 10:32 am

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby wmayer » Thu Oct 24, 2013 1:54 pm

Ich habe jetzt einen Weg gefunden, um eine symmetrische Kurve zu erzeugen. Der Trick dabei ist es, nur die eine Hälfte der Kontrollpunkte zu nehmen und zu spiegeln. Somit hat man schon einmal ein symmetrisches Kontrollnetz. Im zweiten Schritt nimmt man dann die Methode, um die Kurve aus den Kontrollpunkten zu setzen.

Beispiel:

Code: Select all

from FreeCAD import Base

pts=[]
pts.append(Base.Vector(10.106740,-0.173045,110.000000))
pts.append(Base.Vector(10.876900,12.552288,110.000000))
pts.append(Base.Vector(2.146670,24.053253,110.000000))
pts.append(Base.Vector(10.568193,33.859135,110.000000))
pts.append(Base.Vector(22.640881,26.377998,110.000000))
pts.append(Base.Vector(33.179409,29.244604,110.000000))
pts.append(Base.Vector(46.792278,29.475332,110.000000))
pts.append(Base.Vector(57.932823,26.863115,110.000000))
pts.append(Base.Vector(69.864944,32.936234,110.000000))
pts.append(Base.Vector(81.339508,27.226950,110.000000))
pts.append(Base.Vector(93.168350,29.244604,110.000000))
pts.append(Base.Vector(106.781219,29.475332,110.000000))
pts.append(Base.Vector(118.208069,27.469503,110.000000))
pts.append(Base.Vector(129.161713,33.628414,110.000000))
pts.append(Base.Vector(137.698593,24.399343,110.000000))
pts.append(Base.Vector(128.637985,12.673570,110.000000))
pts.append(Base.Vector(129.969254,-0.173045,110.000000))
pts.append(Base.Vector(129.123093,-12.188456,110.000000))
pts.append(Base.Vector(137.813950,-24.283981,110.000000))
pts.append(Base.Vector(129.853882,-34.205227,110.000000))
pts.append(Base.Vector(117.601677,-26.984392,110.000000))
pts.append(Base.Vector(106.550491,-29.013878,110.000000))
pts.append(Base.Vector(93.514435,-29.590694,110.000000))
pts.append(Base.Vector(82.105621,-26.693552,110.000000))
pts.append(Base.Vector(70.095673,-33.282322,110.000000))
pts.append(Base.Vector(59.481319,-26.922842,110.000000))
pts.append(Base.Vector(46.330826,-29.359968,110.000000))
pts.append(Base.Vector(32.948681,-29.244606,110.000000))
pts.append(Base.Vector(22.597166,-25.847414,110.000000))
pts.append(Base.Vector(10.568193,-33.859138,110.000000))
pts.append(Base.Vector(2.377396,-24.168617,110.000000))
pts.append(Base.Vector(11.240733,-13.886350,110.000000))

import Part
spline=Part.BSplineCurve()
spline.interpolate(pts, True)
p=spline.getPoles()[9:26]
spline.translate((-p[0].x,-p[0].y,-p[0].z))
p=spline.getPoles()[9:26]

c=Part.BSplineCurve()
q=[]
q.extend(p)
for i in reversed(p[1:-1]):
    q.append(App.Vector(-i.x,i.y,i.z))

c.buildFromPoles(q,True,3)
c.translate((p[0].x,p[0].y,p[0].z))
App.newDocument()
App.ActiveDocument.addObject("Part::Spline","Symmetric").Shape=c.toShape()
App.ActiveDocument.addObject("Part::Spline","Nonsymmetric").Shape=spline.toShape()
Ich hab es mit mal genauer angeschaut und bin zu der Auffassung gelangt, das es ein Bug in OCCT ist.
Warum soll das ein Bug sein?
Zum ViewProvider: Wenn man das Objekt versteckt bleibt die Kontrollpunkte sichtbar.
Das ist so gewollt.
User avatar
shoogen
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Postby shoogen » Thu Oct 24, 2013 2:49 pm

wmayer wrote:
Ich hab es mit mal genauer angeschaut und bin zu der Auffassung gelangt, das es ein Bug in OCCT ist.
Warum soll das ein Bug sein?
The resulting BSpline curve will be "C2" continuous, except where a tangency constraint is defined on a point through which the curve passes (by using the Load function). In this case, it will be only "C1" continuous.
Ich verstehe die Doku so:
Wenn periodic wahr ist und keine Tangenten übergeben werden, sollte der mult vektor nur aus Einsen bestehen. Und das ist nicht der Fall.