Page 2 of 4

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Fri Nov 30, 2012 9:20 pm
by shoogen
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:

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Sat Dec 01, 2012 10:24 am
by shoogen
Also uniform und peridoic bekommt ich in FreeCAD nicht hin.
https://sourceforge.net/apps/mantisbt/f ... php?id=895

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 5:28 am
by shoogen
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.

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 7:03 am
by wmayer
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()

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 7:08 am
by wmayer
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

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 7:35 am
by shoogen
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.

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 2:16 pm
by wmayer
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.

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Wed Oct 23, 2013 3:21 pm
by shoogen
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.

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Thu Oct 24, 2013 1:54 pm
by wmayer
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.

Re: Fragen zu NURBS und zum Reverse Engineering Modul

Posted: Thu Oct 24, 2013 2:49 pm
by shoogen
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.